]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/renaming/ComponentsRenamingDialog.java
Allow selection of modules to rename through checkboxes and Select All/Clear Selectio...
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagram / renaming / ComponentsRenamingDialog.java
1 package org.simantics.modeling.ui.diagram.renaming;\r
2 \r
3 import java.util.HashSet;\r
4 import java.util.Set;\r
5 \r
6 import org.eclipse.jface.dialogs.Dialog;\r
7 import org.eclipse.jface.layout.GridDataFactory;\r
8 import org.eclipse.jface.layout.GridLayoutFactory;\r
9 import org.eclipse.jface.viewers.ArrayContentProvider;\r
10 import org.eclipse.jface.viewers.CheckStateChangedEvent;\r
11 import org.eclipse.jface.viewers.CheckboxTableViewer;\r
12 import org.eclipse.jface.viewers.ColumnLabelProvider;\r
13 import org.eclipse.jface.viewers.ICheckStateListener;\r
14 import org.eclipse.jface.viewers.ICheckStateProvider;\r
15 import org.eclipse.jface.viewers.StructuredSelection;\r
16 import org.eclipse.jface.viewers.TableViewerColumn;\r
17 import org.eclipse.swt.SWT;\r
18 import org.eclipse.swt.events.ModifyEvent;\r
19 import org.eclipse.swt.events.ModifyListener;\r
20 import org.eclipse.swt.events.SelectionAdapter;\r
21 import org.eclipse.swt.events.SelectionEvent;\r
22 import org.eclipse.swt.layout.GridData;\r
23 import org.eclipse.swt.layout.GridLayout;\r
24 import org.eclipse.swt.layout.RowLayout;\r
25 import org.eclipse.swt.widgets.Button;\r
26 import org.eclipse.swt.widgets.Composite;\r
27 import org.eclipse.swt.widgets.Control;\r
28 import org.eclipse.swt.widgets.Display;\r
29 import org.eclipse.swt.widgets.Label;\r
30 import org.eclipse.swt.widgets.Shell;\r
31 import org.eclipse.swt.widgets.Text;\r
32 import org.simantics.utils.ui.ISelectionUtils;\r
33 \r
34 public class ComponentsRenamingDialog extends Dialog {\r
35 \r
36     ComponentsRenamingModel model;\r
37 \r
38     // UI\r
39     Composite area;\r
40     Label oldNamePrefixLabel;\r
41     Text oldNamePrefix;\r
42     Text newNamePrefix;\r
43     Label errorLabel;\r
44     Text error;\r
45     CheckboxTableViewer tableViewer;\r
46 \r
47     public ComponentsRenamingDialog(Shell parentShell, ComponentsRenamingModel model) {\r
48         super(parentShell);\r
49         this.model = model;\r
50         setShellStyle(SWT.RESIZE | SWT.TITLE);\r
51     }\r
52     \r
53     @Override\r
54     protected Control createDialogArea(Composite parent) {\r
55         getShell().setText("Rename diagram contents");\r
56         getShell().setLayout(new GridLayout());\r
57         Composite composite = new Composite(parent, SWT.NONE);\r
58         composite.setLayoutData(new GridData(GridData.FILL_BOTH));\r
59         GridLayoutFactory.fillDefaults().numColumns(1).applyTo(composite);\r
60         \r
61         // Name prefix\r
62         \r
63         {\r
64             area = new Composite(composite, SWT.BORDER);\r
65             GridDataFactory.fillDefaults().grab(true, false).applyTo(area);\r
66             GridLayoutFactory.fillDefaults().numColumns(2).margins(5, 5).applyTo(area);\r
67             \r
68             oldNamePrefixLabel = new Label(area, SWT.NONE);\r
69             oldNamePrefixLabel.setText("Old name prefix:");\r
70             \r
71             oldNamePrefix = new Text(area, SWT.READ_ONLY | SWT.BORDER);\r
72             oldNamePrefix.setEditable(false);\r
73             oldNamePrefix.setText(model.oldNamePrefix);\r
74             GridDataFactory.fillDefaults().grab(true, false).applyTo(oldNamePrefix);\r
75             \r
76             Label newNamePrefixLabel = new Label(area, SWT.NONE);\r
77             newNamePrefixLabel.setText("&New name prefix:");\r
78             \r
79             newNamePrefix = new Text(area, SWT.BORDER);\r
80             newNamePrefix.setText(model.oldNamePrefix);\r
81             newNamePrefix.setSelection(model.oldNamePrefix.length());\r
82             GridDataFactory.fillDefaults().grab(true, false).applyTo(newNamePrefix);\r
83             \r
84             newNamePrefix.addModifyListener(new ModifyListener() {\r
85 \r
86                 @Override\r
87                 public void modifyText(ModifyEvent e) {\r
88                     String text = newNamePrefix.getText();\r
89                     if (model.prefixValidator != null) {\r
90                         String err = model.prefixValidator.apply(text);\r
91                         if (err != null) {\r
92                             if (error == null) {\r
93                                 errorLabel = new Label(area, 0);\r
94                                 errorLabel.moveBelow(newNamePrefix);\r
95                                 GridDataFactory.fillDefaults().grab(false, false).applyTo(errorLabel);\r
96                                 error = new Text(area, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);\r
97                                 error.moveBelow(errorLabel);\r
98                                 GridDataFactory.fillDefaults().grab(true, false).applyTo(error);\r
99                                 error.setForeground(error.getDisplay().getSystemColor(SWT.COLOR_RED));\r
100                             }\r
101                             error.setText(err);\r
102                             area.getParent().layout();\r
103                             getButton(OK).setEnabled(false);\r
104                             return;\r
105                         }\r
106                         if (error != null) {\r
107                             errorLabel.dispose();\r
108                             errorLabel = null;\r
109                             error.dispose();\r
110                             error = null;\r
111                             area.getParent().layout();\r
112                             getButton(OK).setEnabled(true);\r
113                         }\r
114                     }\r
115 \r
116                     model.newNamePrefix = text;\r
117                     model.computeNewNames();\r
118                     refresh();\r
119                 }\r
120             });\r
121         }\r
122         \r
123         // Reset\r
124         \r
125         final Button resetNames = new Button(composite, SWT.CHECK);\r
126         resetNames.setText("&Reset names");\r
127         resetNames.addSelectionListener(new SelectionAdapter() {\r
128             @Override\r
129             public void widgetSelected(SelectionEvent e) {\r
130                 model.reset = resetNames.getSelection();\r
131                 model.computeNewNames();\r
132                 refresh();\r
133             }\r
134         });\r
135         \r
136         // Name table\r
137         \r
138         tableViewer = CheckboxTableViewer.newCheckList(composite,\r
139                 SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);\r
140 \r
141         tableViewer.getTable().setHeaderVisible(true);\r
142         GridDataFactory.fillDefaults().grab(true, true).applyTo(tableViewer.getTable());\r
143         \r
144         tableViewer.setContentProvider(ArrayContentProvider.getInstance());\r
145         tableViewer.setCheckStateProvider(new ICheckStateProvider() {\r
146             @Override\r
147             public boolean isGrayed(Object element) {\r
148                 return false;\r
149             }\r
150             @Override\r
151             public boolean isChecked(Object element) {\r
152                 return model.selectedEntries.contains(element);\r
153             }\r
154         });\r
155         \r
156         TableViewerColumn oldNameColumn = new TableViewerColumn(tableViewer, SWT.NONE);\r
157         oldNameColumn.getColumn().setText("Old name");\r
158         oldNameColumn.getColumn().setWidth(250);\r
159         oldNameColumn.setLabelProvider(new ColumnLabelProvider() {\r
160             @Override\r
161             public String getText(Object element) {\r
162                 NameEntry entry = (NameEntry)element;\r
163                 return entry.oldName;\r
164             }\r
165         });\r
166         \r
167         TableViewerColumn newNameColumn = new TableViewerColumn(tableViewer, SWT.NONE);\r
168         newNameColumn.getColumn().setText("New name");\r
169         newNameColumn.getColumn().setWidth(250);\r
170         newNameColumn.setLabelProvider(new ColumnLabelProvider() {\r
171             @Override\r
172             public String getText(Object element) {\r
173                 NameEntry entry = (NameEntry)element;\r
174                 return entry.newName;\r
175             }\r
176         });\r
177         tableViewer.addCheckStateListener(new ICheckStateListener() {\r
178             void addOrRemoveSelection(NameEntry entry, boolean add) {\r
179                 if (add)\r
180                     model.selectedEntries.add(entry);\r
181                 else\r
182                     model.selectedEntries.remove(entry);\r
183             }\r
184             @Override\r
185             public void checkStateChanged(CheckStateChangedEvent event) {\r
186                 final boolean checked = event.getChecked();\r
187                 NameEntry checkedNode = (NameEntry) event.getElement();\r
188 \r
189                 Set<NameEntry> entries = new HashSet<NameEntry>();\r
190                 Set<NameEntry> selection = ISelectionUtils.filterSetSelection(tableViewer.getSelection(), NameEntry.class);\r
191                 if (selection.contains(checkedNode))\r
192                     entries.addAll(selection);\r
193                 else\r
194                     tableViewer.setSelection(StructuredSelection.EMPTY);\r
195                 entries.add(checkedNode);\r
196 \r
197                 for (NameEntry entry : entries) {\r
198                     addOrRemoveSelection(entry, checked);\r
199                 }\r
200 \r
201                 tableViewer.refresh();\r
202             }\r
203         });\r
204         tableViewer.setInput(model.entries.toArray());\r
205         newNamePrefix.setFocus();\r
206 \r
207         // Select All/None button bar\r
208         Composite bar = new Composite(composite, SWT.NONE);\r
209         GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(bar);\r
210         bar.setLayout(new RowLayout());\r
211         Button selectAll = new Button(bar, SWT.PUSH);\r
212         selectAll.setText("Select &All");\r
213         selectAll.addSelectionListener(new SelectionAdapter() {\r
214             @Override\r
215             public void widgetSelected(SelectionEvent e) {\r
216                 model.selectedEntries.addAll(model.entries);\r
217                 tableViewer.setAllChecked(true);\r
218             }\r
219         });\r
220         Button clearSelection = new Button(bar, SWT.PUSH);\r
221         clearSelection.setText("&Clear Selection");\r
222         clearSelection.addSelectionListener(new SelectionAdapter() {\r
223             @Override\r
224             public void widgetSelected(SelectionEvent e) {\r
225                 model.selectedEntries.clear();\r
226                 tableViewer.setAllChecked(false);\r
227             }\r
228         });\r
229 \r
230         return composite;\r
231     }\r
232     \r
233     public void refresh() {\r
234         tableViewer.refresh();\r
235     }\r
236     \r
237     public static void main(String[] args) {\r
238         final Display display = new Display();\r
239         Shell shell = new Shell(display);\r
240         shell.open();\r
241         \r
242         ComponentsRenamingModel model = new ComponentsRenamingModel();\r
243         model.oldNamePrefix = "FOO";\r
244         model.newNamePrefix = "FOO";\r
245         for(int i=0;i<100;++i)\r
246             model.entries.add(new NameEntry(null, "FOO"+(i*5), "FOO"+(i*5), "PREFIX"));\r
247         \r
248         ComponentsRenamingDialog dialog = new ComponentsRenamingDialog(shell, model);\r
249         dialog.open();\r
250         \r
251         while (!shell.isDisposed()) {\r
252             if (!display.readAndDispatch())\r
253                 display.sleep();\r
254         }\r
255         display.dispose();\r
256     }\r
257 \r
258 }\r