+package org.simantics.utils.ui.widgets;\r
+\r
+import java.io.File;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Group;\r
+import org.eclipse.swt.widgets.Text;\r
+\r
+public abstract class FileOrDirectorySelectionWidget extends Composite{\r
+ \r
+ Text fileText;\r
+ String filename[];\r
+ \r
+ private List<FileSelectionListener> listeners = new ArrayList<FileSelectionListener>();\r
+ \r
+ public FileOrDirectorySelectionWidget(Composite parent, String name,int style) {\r
+ super(parent, style);\r
+ this.setLayout(new GridLayout(1,false));\r
+ GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(this);\r
+ \r
+ Group fileGroup = new Group(this, SWT.NONE);\r
+ GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(fileGroup);\r
+ \r
+ fileGroup.setText(name);\r
+ fileGroup.setLayout(new GridLayout(2, false));\r
+ \r
+ fileText = new Text(fileGroup, SWT.SINGLE|SWT.BORDER);\r
+ GridData data = new GridData();\r
+ data.grabExcessHorizontalSpace = true;\r
+ data.horizontalAlignment = SWT.FILL;\r
+ fileText.setLayoutData(data);\r
+ \r
+ Button browseButton = new Button(fileGroup, SWT.PUSH);\r
+ browseButton.setText("Browse");\r
+ data = new GridData();\r
+ browseButton.setLayoutData(data);\r
+ \r
+ \r
+ \r
+ browseButton.addSelectionListener(new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ String[] name = openDialog();\r
+ if (name != null) {\r
+ setFilename(name);\r
+ }\r
+ }\r
+ });\r
+ \r
+ fileText.addModifyListener(new ModifyListener() {\r
+ \r
+ @Override\r
+ public void modifyText(ModifyEvent e) {\r
+ String file = fileText.getText();\r
+ setFilename(file.split(","));\r
+ \r
+ }\r
+ });\r
+ }\r
+ \r
+ protected abstract String[] openDialog();\r
+ \r
+ protected abstract boolean isValid(File file);\r
+ \r
+ protected void setFilename(String[] filename) {\r
+ String text = "";\r
+ for (String s : filename) {\r
+ text += s + ",";\r
+ }\r
+ if (text.length() > 2)\r
+ text = text.substring(0, text.length() - 1);\r
+ \r
+ if (!text.equals(fileText.getText()))\r
+ fileText.setText(text);\r
+ \r
+ boolean accept = true;\r
+ for (String s : filename){\r
+ File file = new File(s);\r
+ if (!isValid(file)) {\r
+ accept = false;\r
+ break;\r
+ }\r
+ }\r
+ if (accept)\r
+ this.filename = filename;\r
+ else\r
+ this.filename = null;\r
+ \r
+ for (FileSelectionListener l : listeners) {\r
+ l.fileSelected(this, this.filename);\r
+ }\r
+ }\r
+ \r
+ public String[] getFilename() {\r
+ return filename;\r
+ }\r
+ \r
+ public void addListener(FileSelectionListener listener) {\r
+ this.listeners.add(listener);\r
+ }\r
+ \r
+ public void removeListener(FileSelectionListener listener) {\r
+ this.listeners.remove(listener);\r
+ }\r
+ \r
+\r
+}\r