-/*******************************************************************************\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.modeling.ui.typicals;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Comparator;\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.jface.dialogs.IDialogSettings;\r
-import org.eclipse.jface.resource.JFaceResources;\r
-import org.eclipse.jface.resource.LocalResourceManager;\r
-import org.eclipse.jface.resource.ResourceManager;\r
-import org.eclipse.jface.viewers.ArrayContentProvider;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.jface.viewers.LabelProvider;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.jface.viewers.StructuredSelection;\r
-import org.eclipse.jface.viewers.TableViewer;\r
-import org.eclipse.jface.window.Window;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.TableItem;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.simantics.Simantics;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.NamedResource;\r
-import org.simantics.db.common.request.ReadRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.modeling.ModelingResources;\r
-import org.simantics.modeling.typicals.AvailableSynchronizationRules;\r
-import org.simantics.modeling.ui.Activator;\r
-import org.simantics.utils.datastructures.Arrays;\r
-import org.simantics.utils.strings.AlphanumComparator;\r
-\r
-\r
-/**\r
- * @author Antti Villberg\r
- */\r
-public class RuleChooserDialog extends Dialog {\r
-\r
- public static class RuleResult {\r
- public final Set<Resource> selectedRules;\r
- public final boolean logging;\r
-\r
- RuleResult(Set<Resource> selectedRules, boolean logging) {\r
- this.selectedRules = selectedRules;\r
- this.logging = logging;\r
- }\r
- }\r
-\r
- private static final String DIALOG = "RuleChooserDialog"; //$NON-NLS-1$\r
- private static final String LAST_SELECTION = "LastSelection"; //$NON-NLS-1$\r
-\r
- private final NamedResource[] rules;\r
-\r
- private final String title;\r
-\r
- private final String description;\r
-\r
- private Collection<NamedResource> selectedRules;\r
- private boolean loggingEnabled = false;\r
-\r
- private TableViewer viewer;\r
-\r
- private Button logEnabled;\r
-\r
- private IDialogSettings dialogBoundsSettings;\r
-\r
- private ResourceManager resourceManager;\r
-\r
- private final Comparator<NamedResource> sorter = new Comparator<NamedResource>() {\r
- @Override\r
- public int compare(NamedResource nr1, NamedResource nr2) {\r
- return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(nr1.getName(), nr2.getName());\r
- }\r
- };\r
-\r
- public RuleChooserDialog(Shell parent, String description, Collection<NamedResource> rules) {\r
- super(parent);\r
- this.rules = rules.toArray(new NamedResource[rules.size()]);\r
- java.util.Arrays.sort(this.rules, sorter);\r
- this.title = "Choose Synchronization Rules";\r
- this.description = description;\r
-\r
- IDialogSettings settings = Activator.getDefault().getDialogSettings();\r
- dialogBoundsSettings = settings.getSection(DIALOG);\r
- if (dialogBoundsSettings == null)\r
- dialogBoundsSettings = settings.addNewSection(DIALOG);\r
- }\r
-\r
- @Override\r
- protected IDialogSettings getDialogBoundsSettings() {\r
- return dialogBoundsSettings;\r
- }\r
-\r
- @Override\r
- protected void configureShell(Shell newShell) {\r
- if (title != null) {\r
- newShell.setText(title);\r
- } else {\r
- newShell.setText("Choose Action");\r
- }\r
- super.configureShell(newShell);\r
- }\r
-\r
- @Override\r
- protected int getShellStyle() {\r
- return super.getShellStyle() | SWT.RESIZE;\r
- }\r
-\r
- @Override\r
- protected Point getInitialSize() {\r
- Point defaultSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);\r
- Point result = super.getInitialSize();\r
- if (defaultSize.equals(result))\r
- return new Point(500, 500);\r
- return result;\r
- }\r
-\r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
-\r
- this.resourceManager = new LocalResourceManager(JFaceResources.getResources());\r
- composite.addListener(SWT.Dispose, new Listener() {\r
- @Override\r
- public void handleEvent(Event event) {\r
- resourceManager.dispose();\r
- resourceManager = null;\r
- }\r
- });\r
-\r
- if (description != null) {\r
- Text label = new Text(composite, SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);\r
- label.setBackground(composite.getBackground());\r
- label.setText(description);\r
- label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));\r
- }\r
-\r
- viewer = new TableViewer(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.CHECK);\r
- viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
- viewer.setContentProvider(new ArrayContentProvider());\r
- viewer.setLabelProvider(new RuleLabelProvider());\r
- viewer.setInput(rules);\r
-\r
- viewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
- @Override\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- RuleChooserDialog.this.selectionChanged(event.getSelection());\r
- }\r
- });\r
-\r
- logEnabled = new Button(composite, SWT.CHECK);\r
- logEnabled.setText("Verbose synchronization logging");\r
-\r
- if (rules.length > 0) {\r
- viewer.setSelection(new StructuredSelection(rules[0]), true);\r
- viewer.getTable().setFocus();\r
- }\r
-\r
- String[] lastChecked = dialogBoundsSettings.getArray(LAST_SELECTION);\r
- if(lastChecked != null) {\r
- for(TableItem item : viewer.getTable().getItems()) {\r
- NamedResource nr = (NamedResource)item.getData(); \r
- if(Arrays.contains(lastChecked, nr.getName()))\r
- item.setChecked(true);\r
- }\r
- }\r
- \r
- applyDialogFont(composite);\r
- return composite;\r
- }\r
-\r
- private void selectionChanged(ISelection s) {\r
- Button ok = getButton(IDialogConstants.OK_ID);\r
- IStructuredSelection iss = (IStructuredSelection) s;\r
- if (iss == null || iss.isEmpty()) {\r
- if (ok != null)\r
- ok.setEnabled(false);\r
- return;\r
- }\r
-\r
- if (ok != null)\r
- ok.setEnabled(true);\r
- return;\r
- }\r
-\r
- @Override\r
- protected void okPressed() {\r
-\r
- ArrayList<String> names = new ArrayList<String>(); \r
-\r
- selectedRules = new ArrayList<NamedResource>();\r
- for(TableItem item : viewer.getTable().getItems()) {\r
- if(item.getChecked()) {\r
- NamedResource nr = (NamedResource)item.getData(); \r
- selectedRules.add(nr);\r
- names.add(nr.getName());\r
- }\r
- }\r
- loggingEnabled = logEnabled.getSelection();\r
- \r
- dialogBoundsSettings.put(LAST_SELECTION, names.toArray(new String[names.size()]));\r
- \r
- super.okPressed();\r
- \r
- }\r
-\r
- public Collection<NamedResource> getSelectedRules() {\r
- return selectedRules;\r
- }\r
-\r
- public boolean isLoggingEnabled() {\r
- return loggingEnabled;\r
- }\r
-\r
- class RuleLabelProvider extends LabelProvider {\r
- @Override\r
- public Image getImage(Object element) {\r
- return null;\r
- }\r
-\r
- @Override\r
- public String getText(Object element) {\r
- NamedResource nr = (NamedResource) element;\r
- return nr.getName();\r
- }\r
- }\r
- \r
- public static RuleResult choose(Shell shell, String description, final Resource[] input) throws DatabaseException {\r
-\r
- final Collection<NamedResource> rules = new HashSet<NamedResource>();\r
- final Collection<Resource> alwaysEnabledRules = new HashSet<Resource>();\r
- Simantics.getSession().syncRequest(new ReadRequest() {\r
- @Override\r
- public void run(ReadGraph graph) throws DatabaseException {\r
- ModelingResources MOD = ModelingResources.getInstance(graph);\r
- for(Resource r : input) {\r
- Collection<NamedResource> nrs = graph.syncRequest(new AvailableSynchronizationRules(r));\r
- for (NamedResource nr : nrs) {\r
- boolean alwaysEnabled = Boolean.TRUE.equals( graph.getPossibleRelatedValue(nr.getResource(), MOD.TypicalSynchronizationRule_alwaysEnabled, Bindings.BOOLEAN) );\r
- if (alwaysEnabled)\r
- alwaysEnabledRules.add(nr.getResource());\r
- else\r
- rules.add(nr);\r
- }\r
- }\r
- }\r
- });\r
-\r
- description += "\n\nChecked rules will be applied in addition to default rules.";\r
-\r
- RuleChooserDialog dialog = new RuleChooserDialog(shell, description, rules);\r
- int ret = dialog.open();\r
- if (ret != Window.OK)\r
- return null;\r
-\r
- Collection<NamedResource> selectedRules = dialog.getSelectedRules();\r
-\r
- Set<Resource> selectedRuleResources = new HashSet<Resource>();\r
- for(NamedResource nr : selectedRules) selectedRuleResources.add(nr.getResource());\r
- selectedRuleResources.addAll(alwaysEnabledRules);\r
-\r
- return new RuleResult(selectedRuleResources, dialog.isLoggingEnabled());\r
-\r
- }\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.modeling.ui.typicals;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.simantics.Simantics;
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.NamedResource;
+import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.modeling.ModelingResources;
+import org.simantics.modeling.typicals.AvailableSynchronizationRules;
+import org.simantics.modeling.ui.Activator;
+import org.simantics.utils.datastructures.Arrays;
+import org.simantics.utils.strings.AlphanumComparator;
+
+
+/**
+ * @author Antti Villberg
+ */
+public class RuleChooserDialog extends Dialog {
+
+ public static class RuleResult {
+ public final Set<Resource> selectedRules;
+ public final boolean logging;
+
+ RuleResult(Set<Resource> selectedRules, boolean logging) {
+ this.selectedRules = selectedRules;
+ this.logging = logging;
+ }
+ }
+
+ private static final String DIALOG = "RuleChooserDialog"; //$NON-NLS-1$
+ private static final String LAST_SELECTION = "LastSelection"; //$NON-NLS-1$
+
+ private final NamedResource[] rules;
+
+ private final String title;
+
+ private final String description;
+
+ private Collection<NamedResource> selectedRules;
+ private boolean loggingEnabled = false;
+
+ private TableViewer viewer;
+
+ private Button logEnabled;
+
+ private IDialogSettings dialogBoundsSettings;
+
+ private ResourceManager resourceManager;
+
+ private final Comparator<NamedResource> sorter = new Comparator<NamedResource>() {
+ @Override
+ public int compare(NamedResource nr1, NamedResource nr2) {
+ return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(nr1.getName(), nr2.getName());
+ }
+ };
+
+ public RuleChooserDialog(Shell parent, String description, Collection<NamedResource> rules) {
+ super(parent);
+ this.rules = rules.toArray(new NamedResource[rules.size()]);
+ java.util.Arrays.sort(this.rules, sorter);
+ this.title = "Choose Synchronization Rules";
+ this.description = description;
+
+ IDialogSettings settings = Activator.getDefault().getDialogSettings();
+ dialogBoundsSettings = settings.getSection(DIALOG);
+ if (dialogBoundsSettings == null)
+ dialogBoundsSettings = settings.addNewSection(DIALOG);
+ }
+
+ @Override
+ protected IDialogSettings getDialogBoundsSettings() {
+ return dialogBoundsSettings;
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ if (title != null) {
+ newShell.setText(title);
+ } else {
+ newShell.setText("Choose Action");
+ }
+ super.configureShell(newShell);
+ }
+
+ @Override
+ protected int getShellStyle() {
+ return super.getShellStyle() | SWT.RESIZE;
+ }
+
+ @Override
+ protected Point getInitialSize() {
+ Point defaultSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ Point result = super.getInitialSize();
+ if (defaultSize.equals(result))
+ return new Point(500, 500);
+ return result;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+
+ this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
+ composite.addListener(SWT.Dispose, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ resourceManager.dispose();
+ resourceManager = null;
+ }
+ });
+
+ if (description != null) {
+ Text label = new Text(composite, SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);
+ label.setBackground(composite.getBackground());
+ label.setText(description);
+ label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ }
+
+ viewer = new TableViewer(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.CHECK);
+ viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ viewer.setContentProvider(new ArrayContentProvider());
+ viewer.setLabelProvider(new RuleLabelProvider());
+ viewer.setInput(rules);
+
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ RuleChooserDialog.this.selectionChanged(event.getSelection());
+ }
+ });
+
+ logEnabled = new Button(composite, SWT.CHECK);
+ logEnabled.setText("Verbose synchronization logging");
+
+ if (rules.length > 0) {
+ viewer.setSelection(new StructuredSelection(rules[0]), true);
+ viewer.getTable().setFocus();
+ }
+
+ String[] lastChecked = dialogBoundsSettings.getArray(LAST_SELECTION);
+ if(lastChecked != null) {
+ for(TableItem item : viewer.getTable().getItems()) {
+ NamedResource nr = (NamedResource)item.getData();
+ if(Arrays.contains(lastChecked, nr.getName()))
+ item.setChecked(true);
+ }
+ }
+
+ applyDialogFont(composite);
+ return composite;
+ }
+
+ private void selectionChanged(ISelection s) {
+ Button ok = getButton(IDialogConstants.OK_ID);
+ IStructuredSelection iss = (IStructuredSelection) s;
+ if (iss == null || iss.isEmpty()) {
+ if (ok != null)
+ ok.setEnabled(false);
+ return;
+ }
+
+ if (ok != null)
+ ok.setEnabled(true);
+ return;
+ }
+
+ @Override
+ protected void okPressed() {
+
+ ArrayList<String> names = new ArrayList<String>();
+
+ selectedRules = new ArrayList<NamedResource>();
+ for(TableItem item : viewer.getTable().getItems()) {
+ if(item.getChecked()) {
+ NamedResource nr = (NamedResource)item.getData();
+ selectedRules.add(nr);
+ names.add(nr.getName());
+ }
+ }
+ loggingEnabled = logEnabled.getSelection();
+
+ dialogBoundsSettings.put(LAST_SELECTION, names.toArray(new String[names.size()]));
+
+ super.okPressed();
+
+ }
+
+ public Collection<NamedResource> getSelectedRules() {
+ return selectedRules;
+ }
+
+ public boolean isLoggingEnabled() {
+ return loggingEnabled;
+ }
+
+ class RuleLabelProvider extends LabelProvider {
+ @Override
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ @Override
+ public String getText(Object element) {
+ NamedResource nr = (NamedResource) element;
+ return nr.getName();
+ }
+ }
+
+ public static RuleResult choose(Shell shell, String description, final Resource[] input) throws DatabaseException {
+
+ final Collection<NamedResource> rules = new HashSet<NamedResource>();
+ final Collection<Resource> alwaysEnabledRules = new HashSet<Resource>();
+ Simantics.getSession().syncRequest(new ReadRequest() {
+ @Override
+ public void run(ReadGraph graph) throws DatabaseException {
+ ModelingResources MOD = ModelingResources.getInstance(graph);
+ for(Resource r : input) {
+ Collection<NamedResource> nrs = graph.syncRequest(new AvailableSynchronizationRules(r));
+ for (NamedResource nr : nrs) {
+ boolean alwaysEnabled = Boolean.TRUE.equals( graph.getPossibleRelatedValue(nr.getResource(), MOD.TypicalSynchronizationRule_alwaysEnabled, Bindings.BOOLEAN) );
+ if (alwaysEnabled)
+ alwaysEnabledRules.add(nr.getResource());
+ else
+ rules.add(nr);
+ }
+ }
+ }
+ });
+
+ description += "\n\nChecked rules will be applied in addition to default rules.";
+
+ RuleChooserDialog dialog = new RuleChooserDialog(shell, description, rules);
+ int ret = dialog.open();
+ if (ret != Window.OK)
+ return null;
+
+ Collection<NamedResource> selectedRules = dialog.getSelectedRules();
+
+ Set<Resource> selectedRuleResources = new HashSet<Resource>();
+ for(NamedResource nr : selectedRules) selectedRuleResources.add(nr.getResource());
+ selectedRuleResources.addAll(alwaysEnabledRules);
+
+ return new RuleResult(selectedRuleResources, dialog.isLoggingEnabled());
+
+ }
+
+}