-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.utils.ui.workbench.dialogs;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-\r
-import org.eclipse.jface.viewers.CellEditor;\r
-import org.eclipse.jface.viewers.ICellModifier;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.jface.viewers.StructuredSelection;\r
-import org.eclipse.jface.viewers.TableViewer;\r
-import org.eclipse.jface.viewers.TextCellEditor;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.VerifyEvent;\r
-import org.eclipse.swt.events.VerifyListener;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Table;\r
-import org.eclipse.swt.widgets.TableItem;\r
-import org.eclipse.swt.widgets.Text;\r
-\r
-\r
-/**\r
- * EditablePropertyDialog is a property dialog where dialog cells can be\r
- * modified\r
- * \r
- */\r
-public class PropertyEditorDialog extends PropertyDialog {\r
-\r
- public static final int ADD_PROPERTY_ID = -5000;\r
-\r
- public static final int REMOVE_PROPERTY_ID = -5000 + 1;\r
-\r
- /** Fields that are read-only */\r
- protected Set<String> readOnlyKeys = new HashSet<String>();\r
- \r
- protected List<PropertyLineVerifyListener> verifyListeners = new ArrayList<PropertyLineVerifyListener>();\r
-\r
- public PropertyEditorDialog(Shell parent) {\r
- super(parent);\r
- }\r
-\r
- @Override\r
- protected Control createDialogArea(Composite container) {\r
- Control composite = super.createDialogArea(container);\r
- TableViewer viewer = getTableViewer();\r
- Table table = viewer.getTable();\r
-\r
- viewer.setInput(getTableViewer().getInput());\r
-\r
- CellEditor keyEditor = new TextCellEditor(table, SWT.NORMAL);\r
- TextCellEditor valueEditor = new TextCellEditor(table, SWT.NORMAL);\r
- ((Text)valueEditor.getControl()).addVerifyListener(new VerifyListener() {\r
- public void verifyText(VerifyEvent e) {\r
- String sel[] = getSelection();\r
- if (sel==null) return;\r
- Text w = (Text)e.widget;\r
- String newText = w.getText();\r
- // deleting text\r
- if (e.text.length()==0)\r
- newText = newText.substring(0,e.start) + newText.substring(e.end, newText.length());\r
- else \r
- // inserting text\r
- newText = newText.substring(0,e.start) + e.text + newText.substring(e.end );\r
- \r
- e.doit = verifyValueModification(sel[0], newText );\r
- }});\r
- viewer.setCellEditors(new CellEditor[] { keyEditor, valueEditor });\r
-\r
- viewer.setCellModifier(new ICellModifier() {\r
- public boolean canModify(Object element, String property) {\r
- int column = columnNameToColumn(property);\r
- if (column < 0)\r
- return false;\r
- String line[] = (String[]) element;\r
- String key = line[0];\r
- boolean keyReadOnly = isKeyReadonly(key);\r
- \r
- return !keyReadOnly;\r
- }\r
-\r
- public Object getValue(Object element, String property) {\r
- int column = columnNameToColumn(property);\r
- String line[] = (String[]) element;\r
- return line[column];\r
- }\r
-\r
- public void modify(Object element, String property, Object value) {\r
- // Some kind of bug? This returns TableItem object sometimes\r
- if (element instanceof TableItem)\r
- element = ((TableItem) element).getData();\r
- int column = columnNameToColumn(property);\r
- String line[] = (String[]) element;\r
- String key = line[0];\r
- \r
- // Cannot have two values with same key\r
- if (column==0 && containsKey(value.toString()))\r
- return;\r
- if (column==0 && isKeyReadonly(key))\r
- return;\r
- if (column==0 && !verifyValueModification(value.toString(), line[1]))\r
- return;\r
- \r
- line[column] = value.toString();\r
- labelProvider.elementChanged(element);\r
- }\r
- });\r
-\r
- return composite;\r
- }\r
-\r
- protected boolean containsKey(String key) {\r
- for (String[] line : data)\r
- if (line[0].equals(key))\r
- return true;\r
- return false; \r
- }\r
- \r
- @Override\r
- protected void createButtonsForButtonBar(Composite parent) {\r
- // Add property button\r
- createButton(parent, ADD_PROPERTY_ID, "Add property", false);\r
- // Remove property button\r
- createButton(parent, REMOVE_PROPERTY_ID, "Remove property", false);\r
-\r
- setAddCancelButton(true);\r
- super.createButtonsForButtonBar(parent);\r
- // Having this true enables double-click listener later\r
- // Which is annoying\r
- setAddCancelButton(false);\r
- }\r
-\r
- @Override\r
- protected void buttonPressed(int buttonId) {\r
- if (buttonId == ADD_PROPERTY_ID)\r
- addPropertyPressed();\r
- else if (buttonId == REMOVE_PROPERTY_ID)\r
- removePropertyPressed();\r
- else\r
- super.buttonPressed(buttonId);\r
- }\r
-\r
- protected String[] getSelection() {\r
- IStructuredSelection sel = (IStructuredSelection) this.getTableViewer().getSelection();\r
- if (sel==null) return null;\r
- Object o = sel.getFirstElement();\r
- if (o==null) return null;\r
- return (String[]) o;\r
- }\r
- \r
- private void removePropertyPressed() {\r
- String o[] = getSelection();\r
- if (o==null) return;\r
- if (readOnlyKeys.contains(o[0]))\r
- return;\r
- if (!data.remove(o)) return;\r
- labelProvider.refreshAll();\r
- }\r
-\r
- private void addPropertyPressed() {\r
- String newElement[] = new String[] {"<new property>", "<value>"}; \r
- data.add(newElement); \r
- labelProvider.refreshAll();\r
- getTableViewer().setSelection(new StructuredSelection(newElement));\r
- }\r
-\r
- /**\r
- * Set fields that are read-only (These are 1st column key names)\r
- * \r
- * @param readOnlyFields fields that are read only\r
- */\r
- public void setReadOnlyFields(String[] readOnlyFields) {\r
- for (String key : readOnlyFields)\r
- readOnlyKeys.add(key); \r
- }\r
- \r
- /**\r
- * Set a key read-only / writable\r
- * @param key key name\r
- * @param readOnly true = readonly, false = writable\r
- */\r
- public void setFieldReadOnlyStatus(String key, boolean readOnly) {\r
- if (readOnly)\r
- readOnlyKeys.add(key);\r
- else \r
- readOnlyKeys.remove(key);\r
- }\r
- \r
- protected boolean isKeyReadonly(String key) {\r
- return readOnlyKeys.contains(key);\r
- }\r
-\r
- /**\r
- * Get result data\r
- * @return result data\r
- */\r
- public List<String[]> getData() {\r
- return data;\r
- }\r
- \r
- public void addVerifyListener(PropertyLineVerifyListener listener) {\r
- verifyListeners.add(listener);\r
- }\r
- \r
- public void removeVerifyListener(PropertyLineVerifyListener listener) {\r
- verifyListeners.remove(listener);\r
- }\r
- \r
- protected boolean verifyValueModification(String key, String value) {\r
- boolean result = true;\r
- for (PropertyLineVerifyListener l : verifyListeners)\r
- result = result & l.verifyValue(key, value);\r
- return result;\r
- }\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.utils.ui.workbench.dialogs;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+
+/**
+ * EditablePropertyDialog is a property dialog where dialog cells can be
+ * modified
+ *
+ */
+public class PropertyEditorDialog extends PropertyDialog {
+
+ public static final int ADD_PROPERTY_ID = -5000;
+
+ public static final int REMOVE_PROPERTY_ID = -5000 + 1;
+
+ /** Fields that are read-only */
+ protected Set<String> readOnlyKeys = new HashSet<String>();
+
+ protected List<PropertyLineVerifyListener> verifyListeners = new ArrayList<PropertyLineVerifyListener>();
+
+ public PropertyEditorDialog(Shell parent) {
+ super(parent);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control composite = super.createDialogArea(container);
+ TableViewer viewer = getTableViewer();
+ Table table = viewer.getTable();
+
+ viewer.setInput(getTableViewer().getInput());
+
+ CellEditor keyEditor = new TextCellEditor(table, SWT.NORMAL);
+ TextCellEditor valueEditor = new TextCellEditor(table, SWT.NORMAL);
+ ((Text)valueEditor.getControl()).addVerifyListener(new VerifyListener() {
+ public void verifyText(VerifyEvent e) {
+ String sel[] = getSelection();
+ if (sel==null) return;
+ Text w = (Text)e.widget;
+ String newText = w.getText();
+ // deleting text
+ if (e.text.length()==0)
+ newText = newText.substring(0,e.start) + newText.substring(e.end, newText.length());
+ else
+ // inserting text
+ newText = newText.substring(0,e.start) + e.text + newText.substring(e.end );
+
+ e.doit = verifyValueModification(sel[0], newText );
+ }});
+ viewer.setCellEditors(new CellEditor[] { keyEditor, valueEditor });
+
+ viewer.setCellModifier(new ICellModifier() {
+ public boolean canModify(Object element, String property) {
+ int column = columnNameToColumn(property);
+ if (column < 0)
+ return false;
+ String line[] = (String[]) element;
+ String key = line[0];
+ boolean keyReadOnly = isKeyReadonly(key);
+
+ return !keyReadOnly;
+ }
+
+ public Object getValue(Object element, String property) {
+ int column = columnNameToColumn(property);
+ String line[] = (String[]) element;
+ return line[column];
+ }
+
+ public void modify(Object element, String property, Object value) {
+ // Some kind of bug? This returns TableItem object sometimes
+ if (element instanceof TableItem)
+ element = ((TableItem) element).getData();
+ int column = columnNameToColumn(property);
+ String line[] = (String[]) element;
+ String key = line[0];
+
+ // Cannot have two values with same key
+ if (column==0 && containsKey(value.toString()))
+ return;
+ if (column==0 && isKeyReadonly(key))
+ return;
+ if (column==0 && !verifyValueModification(value.toString(), line[1]))
+ return;
+
+ line[column] = value.toString();
+ labelProvider.elementChanged(element);
+ }
+ });
+
+ return composite;
+ }
+
+ protected boolean containsKey(String key) {
+ for (String[] line : data)
+ if (line[0].equals(key))
+ return true;
+ return false;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ // Add property button
+ createButton(parent, ADD_PROPERTY_ID, "Add property", false);
+ // Remove property button
+ createButton(parent, REMOVE_PROPERTY_ID, "Remove property", false);
+
+ setAddCancelButton(true);
+ super.createButtonsForButtonBar(parent);
+ // Having this true enables double-click listener later
+ // Which is annoying
+ setAddCancelButton(false);
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == ADD_PROPERTY_ID)
+ addPropertyPressed();
+ else if (buttonId == REMOVE_PROPERTY_ID)
+ removePropertyPressed();
+ else
+ super.buttonPressed(buttonId);
+ }
+
+ protected String[] getSelection() {
+ IStructuredSelection sel = (IStructuredSelection) this.getTableViewer().getSelection();
+ if (sel==null) return null;
+ Object o = sel.getFirstElement();
+ if (o==null) return null;
+ return (String[]) o;
+ }
+
+ private void removePropertyPressed() {
+ String o[] = getSelection();
+ if (o==null) return;
+ if (readOnlyKeys.contains(o[0]))
+ return;
+ if (!data.remove(o)) return;
+ labelProvider.refreshAll();
+ }
+
+ private void addPropertyPressed() {
+ String newElement[] = new String[] {"<new property>", "<value>"};
+ data.add(newElement);
+ labelProvider.refreshAll();
+ getTableViewer().setSelection(new StructuredSelection(newElement));
+ }
+
+ /**
+ * Set fields that are read-only (These are 1st column key names)
+ *
+ * @param readOnlyFields fields that are read only
+ */
+ public void setReadOnlyFields(String[] readOnlyFields) {
+ for (String key : readOnlyFields)
+ readOnlyKeys.add(key);
+ }
+
+ /**
+ * Set a key read-only / writable
+ * @param key key name
+ * @param readOnly true = readonly, false = writable
+ */
+ public void setFieldReadOnlyStatus(String key, boolean readOnly) {
+ if (readOnly)
+ readOnlyKeys.add(key);
+ else
+ readOnlyKeys.remove(key);
+ }
+
+ protected boolean isKeyReadonly(String key) {
+ return readOnlyKeys.contains(key);
+ }
+
+ /**
+ * Get result data
+ * @return result data
+ */
+ public List<String[]> getData() {
+ return data;
+ }
+
+ public void addVerifyListener(PropertyLineVerifyListener listener) {
+ verifyListeners.add(listener);
+ }
+
+ public void removeVerifyListener(PropertyLineVerifyListener listener) {
+ verifyListeners.remove(listener);
+ }
+
+ protected boolean verifyValueModification(String key, String value) {
+ boolean result = true;
+ for (PropertyLineVerifyListener l : verifyListeners)
+ result = result & l.verifyValue(key, value);
+ return result;
+ }
+}