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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.ui.typicals;
\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
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
62 * @author Antti Villberg
\r
64 public class RuleChooserDialog extends Dialog {
\r
66 public static class RuleResult {
\r
67 public final Set<Resource> selectedRules;
\r
68 public final boolean logging;
\r
70 RuleResult(Set<Resource> selectedRules, boolean logging) {
\r
71 this.selectedRules = selectedRules;
\r
72 this.logging = logging;
\r
76 private static final String DIALOG = "RuleChooserDialog"; //$NON-NLS-1$
\r
77 private static final String LAST_SELECTION = "LastSelection"; //$NON-NLS-1$
\r
79 private final NamedResource[] rules;
\r
81 private final String title;
\r
83 private final String description;
\r
85 private Collection<NamedResource> selectedRules;
\r
86 private boolean loggingEnabled = false;
\r
88 private TableViewer viewer;
\r
90 private Button logEnabled;
\r
92 private IDialogSettings dialogBoundsSettings;
\r
94 private ResourceManager resourceManager;
\r
96 private final Comparator<NamedResource> sorter = new Comparator<NamedResource>() {
\r
98 public int compare(NamedResource nr1, NamedResource nr2) {
\r
99 return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(nr1.getName(), nr2.getName());
\r
103 public RuleChooserDialog(Shell parent, String description, Collection<NamedResource> rules) {
\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
110 IDialogSettings settings = Activator.getDefault().getDialogSettings();
\r
111 dialogBoundsSettings = settings.getSection(DIALOG);
\r
112 if (dialogBoundsSettings == null)
\r
113 dialogBoundsSettings = settings.addNewSection(DIALOG);
\r
117 protected IDialogSettings getDialogBoundsSettings() {
\r
118 return dialogBoundsSettings;
\r
122 protected void configureShell(Shell newShell) {
\r
123 if (title != null) {
\r
124 newShell.setText(title);
\r
126 newShell.setText("Choose Action");
\r
128 super.configureShell(newShell);
\r
132 protected int getShellStyle() {
\r
133 return super.getShellStyle() | SWT.RESIZE;
\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
146 protected Control createDialogArea(Composite parent) {
\r
147 Composite composite = (Composite) super.createDialogArea(parent);
\r
149 this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
\r
150 composite.addListener(SWT.Dispose, new Listener() {
\r
152 public void handleEvent(Event event) {
\r
153 resourceManager.dispose();
\r
154 resourceManager = null;
\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
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
171 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
\r
173 public void selectionChanged(SelectionChangedEvent event) {
\r
174 RuleChooserDialog.this.selectionChanged(event.getSelection());
\r
178 logEnabled = new Button(composite, SWT.CHECK);
\r
179 logEnabled.setText("Verbose synchronization logging");
\r
181 if (rules.length > 0) {
\r
182 viewer.setSelection(new StructuredSelection(rules[0]), true);
\r
183 viewer.getTable().setFocus();
\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
195 applyDialogFont(composite);
\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
204 ok.setEnabled(false);
\r
209 ok.setEnabled(true);
\r
214 protected void okPressed() {
\r
216 ArrayList<String> names = new ArrayList<String>();
\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
226 loggingEnabled = logEnabled.getSelection();
\r
228 dialogBoundsSettings.put(LAST_SELECTION, names.toArray(new String[names.size()]));
\r
234 public Collection<NamedResource> getSelectedRules() {
\r
235 return selectedRules;
\r
238 public boolean isLoggingEnabled() {
\r
239 return loggingEnabled;
\r
242 class RuleLabelProvider extends LabelProvider {
\r
244 public Image getImage(Object element) {
\r
249 public String getText(Object element) {
\r
250 NamedResource nr = (NamedResource) element;
\r
251 return nr.getName();
\r
255 public static RuleResult choose(Shell shell, String description, final Resource[] input) throws DatabaseException {
\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
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
268 alwaysEnabledRules.add(nr.getResource());
\r
276 description += "\n\nChecked rules will be applied in addition to default rules.";
\r
278 RuleChooserDialog dialog = new RuleChooserDialog(shell, description, rules);
\r
279 int ret = dialog.open();
\r
280 if (ret != Window.OK)
\r
283 Collection<NamedResource> selectedRules = dialog.getSelectedRules();
\r
285 Set<Resource> selectedRuleResources = new HashSet<Resource>();
\r
286 for(NamedResource nr : selectedRules) selectedRuleResources.add(nr.getResource());
\r
287 selectedRuleResources.addAll(alwaysEnabledRules);
\r
289 return new RuleResult(selectedRuleResources, dialog.isLoggingEnabled());
\r