]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/typicals/RuleChooserDialog.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / typicals / RuleChooserDialog.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.ui.typicals;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Comparator;\r
17 import java.util.HashSet;\r
18 import java.util.Set;\r
19 \r
20 import org.eclipse.jface.dialogs.Dialog;\r
21 import org.eclipse.jface.dialogs.IDialogConstants;\r
22 import org.eclipse.jface.dialogs.IDialogSettings;\r
23 import org.eclipse.jface.resource.JFaceResources;\r
24 import org.eclipse.jface.resource.LocalResourceManager;\r
25 import org.eclipse.jface.resource.ResourceManager;\r
26 import org.eclipse.jface.viewers.ArrayContentProvider;\r
27 import org.eclipse.jface.viewers.ISelection;\r
28 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
29 import org.eclipse.jface.viewers.IStructuredSelection;\r
30 import org.eclipse.jface.viewers.LabelProvider;\r
31 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
32 import org.eclipse.jface.viewers.StructuredSelection;\r
33 import org.eclipse.jface.viewers.TableViewer;\r
34 import org.eclipse.jface.window.Window;\r
35 import org.eclipse.swt.SWT;\r
36 import org.eclipse.swt.graphics.Image;\r
37 import org.eclipse.swt.graphics.Point;\r
38 import org.eclipse.swt.layout.GridData;\r
39 import org.eclipse.swt.widgets.Button;\r
40 import org.eclipse.swt.widgets.Composite;\r
41 import org.eclipse.swt.widgets.Control;\r
42 import org.eclipse.swt.widgets.Event;\r
43 import org.eclipse.swt.widgets.Listener;\r
44 import org.eclipse.swt.widgets.Shell;\r
45 import org.eclipse.swt.widgets.TableItem;\r
46 import org.eclipse.swt.widgets.Text;\r
47 import org.simantics.Simantics;\r
48 import org.simantics.databoard.Bindings;\r
49 import org.simantics.db.ReadGraph;\r
50 import org.simantics.db.Resource;\r
51 import org.simantics.db.common.NamedResource;\r
52 import org.simantics.db.common.request.ReadRequest;\r
53 import org.simantics.db.exception.DatabaseException;\r
54 import org.simantics.modeling.ModelingResources;\r
55 import org.simantics.modeling.typicals.AvailableSynchronizationRules;\r
56 import org.simantics.modeling.ui.Activator;\r
57 import org.simantics.utils.datastructures.Arrays;\r
58 import org.simantics.utils.strings.AlphanumComparator;\r
59 \r
60 \r
61 /**\r
62  * @author Antti Villberg\r
63  */\r
64 public class RuleChooserDialog extends Dialog {\r
65 \r
66     public static class RuleResult {\r
67         public final Set<Resource> selectedRules;\r
68         public final boolean logging;\r
69 \r
70         RuleResult(Set<Resource> selectedRules, boolean logging) {\r
71             this.selectedRules = selectedRules;\r
72             this.logging = logging;\r
73         }\r
74     }\r
75 \r
76     private static final String DIALOG = "RuleChooserDialog"; //$NON-NLS-1$\r
77     private static final String LAST_SELECTION = "LastSelection"; //$NON-NLS-1$\r
78 \r
79     private final NamedResource[]     rules;\r
80 \r
81     private final String        title;\r
82 \r
83     private final String        description;\r
84 \r
85     private Collection<NamedResource> selectedRules;\r
86     private boolean             loggingEnabled = false;\r
87 \r
88     private TableViewer         viewer;\r
89 \r
90     private Button              logEnabled;\r
91 \r
92     private IDialogSettings     dialogBoundsSettings;\r
93 \r
94     private ResourceManager     resourceManager;\r
95 \r
96     private final Comparator<NamedResource> sorter = new Comparator<NamedResource>() {\r
97         @Override\r
98         public int compare(NamedResource nr1, NamedResource nr2) {\r
99             return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(nr1.getName(), nr2.getName());\r
100         }\r
101     };\r
102 \r
103     public RuleChooserDialog(Shell parent, String description, Collection<NamedResource> rules) {\r
104         super(parent);\r
105         this.rules = rules.toArray(new NamedResource[rules.size()]);\r
106         java.util.Arrays.sort(this.rules, sorter);\r
107         this.title = "Choose Synchronization Rules";\r
108         this.description = description;\r
109 \r
110         IDialogSettings settings = Activator.getDefault().getDialogSettings();\r
111         dialogBoundsSettings = settings.getSection(DIALOG);\r
112         if (dialogBoundsSettings == null)\r
113             dialogBoundsSettings = settings.addNewSection(DIALOG);\r
114     }\r
115 \r
116     @Override\r
117     protected IDialogSettings getDialogBoundsSettings() {\r
118         return dialogBoundsSettings;\r
119     }\r
120 \r
121     @Override\r
122     protected void configureShell(Shell newShell) {\r
123         if (title != null) {\r
124             newShell.setText(title);\r
125         } else {\r
126             newShell.setText("Choose Action");\r
127         }\r
128         super.configureShell(newShell);\r
129     }\r
130 \r
131     @Override\r
132     protected int getShellStyle() {\r
133         return super.getShellStyle() | SWT.RESIZE;\r
134     }\r
135 \r
136     @Override\r
137     protected Point getInitialSize() {\r
138         Point defaultSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);\r
139         Point result = super.getInitialSize();\r
140         if (defaultSize.equals(result))\r
141             return new Point(500, 500);\r
142         return result;\r
143     }\r
144 \r
145     @Override\r
146     protected Control createDialogArea(Composite parent) {\r
147         Composite composite = (Composite) super.createDialogArea(parent);\r
148 \r
149         this.resourceManager = new LocalResourceManager(JFaceResources.getResources());\r
150         composite.addListener(SWT.Dispose, new Listener() {\r
151             @Override\r
152             public void handleEvent(Event event) {\r
153                 resourceManager.dispose();\r
154                 resourceManager = null;\r
155             }\r
156         });\r
157 \r
158         if (description != null) {\r
159             Text label = new Text(composite, SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);\r
160             label.setBackground(composite.getBackground());\r
161             label.setText(description);\r
162             label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));\r
163         }\r
164 \r
165         viewer = new TableViewer(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.CHECK);\r
166         viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
167         viewer.setContentProvider(new ArrayContentProvider());\r
168         viewer.setLabelProvider(new RuleLabelProvider());\r
169         viewer.setInput(rules);\r
170 \r
171         viewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
172             @Override\r
173             public void selectionChanged(SelectionChangedEvent event) {\r
174                 RuleChooserDialog.this.selectionChanged(event.getSelection());\r
175             }\r
176         });\r
177 \r
178         logEnabled = new Button(composite, SWT.CHECK);\r
179         logEnabled.setText("Verbose synchronization logging");\r
180 \r
181         if (rules.length > 0) {\r
182             viewer.setSelection(new StructuredSelection(rules[0]), true);\r
183             viewer.getTable().setFocus();\r
184         }\r
185 \r
186         String[] lastChecked = dialogBoundsSettings.getArray(LAST_SELECTION);\r
187         if(lastChecked != null) {\r
188                 for(TableItem item : viewer.getTable().getItems()) {\r
189                         NamedResource nr = (NamedResource)item.getData(); \r
190                         if(Arrays.contains(lastChecked, nr.getName()))\r
191                                 item.setChecked(true);\r
192                 }\r
193         }\r
194         \r
195         applyDialogFont(composite);\r
196         return composite;\r
197     }\r
198 \r
199     private void selectionChanged(ISelection s) {\r
200         Button ok = getButton(IDialogConstants.OK_ID);\r
201         IStructuredSelection iss = (IStructuredSelection) s;\r
202         if (iss == null || iss.isEmpty()) {\r
203             if (ok != null)\r
204                 ok.setEnabled(false);\r
205             return;\r
206         }\r
207 \r
208         if (ok != null)\r
209             ok.setEnabled(true);\r
210         return;\r
211     }\r
212 \r
213     @Override\r
214     protected void okPressed() {\r
215 \r
216         ArrayList<String> names = new ArrayList<String>(); \r
217 \r
218         selectedRules = new ArrayList<NamedResource>();\r
219         for(TableItem item : viewer.getTable().getItems()) {\r
220                 if(item.getChecked()) {\r
221                         NamedResource nr = (NamedResource)item.getData(); \r
222                         selectedRules.add(nr);\r
223                         names.add(nr.getName());\r
224                 }\r
225         }\r
226         loggingEnabled = logEnabled.getSelection();\r
227         \r
228         dialogBoundsSettings.put(LAST_SELECTION, names.toArray(new String[names.size()]));\r
229         \r
230         super.okPressed();\r
231         \r
232     }\r
233 \r
234     public Collection<NamedResource> getSelectedRules() {\r
235         return selectedRules;\r
236     }\r
237 \r
238     public boolean isLoggingEnabled() {\r
239         return loggingEnabled;\r
240     }\r
241 \r
242     class RuleLabelProvider extends LabelProvider {\r
243         @Override\r
244         public Image getImage(Object element) {\r
245                 return null;\r
246         }\r
247 \r
248         @Override\r
249         public String getText(Object element) {\r
250             NamedResource nr = (NamedResource) element;\r
251             return nr.getName();\r
252         }\r
253     }\r
254     \r
255     public static RuleResult choose(Shell shell, String description, final Resource[] input) throws DatabaseException {\r
256 \r
257         final Collection<NamedResource> rules = new HashSet<NamedResource>();\r
258         final Collection<Resource> alwaysEnabledRules = new HashSet<Resource>();\r
259         Simantics.getSession().syncRequest(new ReadRequest() {\r
260             @Override\r
261             public void run(ReadGraph graph) throws DatabaseException {\r
262                 ModelingResources MOD = ModelingResources.getInstance(graph);\r
263                 for(Resource r : input) {\r
264                     Collection<NamedResource> nrs = graph.syncRequest(new AvailableSynchronizationRules(r));\r
265                     for (NamedResource nr : nrs) {\r
266                         boolean alwaysEnabled = Boolean.TRUE.equals( graph.getPossibleRelatedValue(nr.getResource(), MOD.TypicalSynchronizationRule_alwaysEnabled, Bindings.BOOLEAN) );\r
267                         if (alwaysEnabled)\r
268                             alwaysEnabledRules.add(nr.getResource());\r
269                         else\r
270                             rules.add(nr);\r
271                     }\r
272                 }\r
273             }\r
274         });\r
275 \r
276         description += "\n\nChecked rules will be applied in addition to default rules.";\r
277 \r
278         RuleChooserDialog dialog = new RuleChooserDialog(shell, description, rules);\r
279         int ret = dialog.open();\r
280         if (ret != Window.OK)\r
281             return null;\r
282 \r
283         Collection<NamedResource> selectedRules = dialog.getSelectedRules();\r
284 \r
285         Set<Resource> selectedRuleResources = new HashSet<Resource>();\r
286         for(NamedResource nr : selectedRules) selectedRuleResources.add(nr.getResource());\r
287         selectedRuleResources.addAll(alwaysEnabledRules);\r
288 \r
289         return new RuleResult(selectedRuleResources, dialog.isLoggingEnabled());\r
290 \r
291     }\r
292 \r
293 }\r