]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/browser/SCLDefinitionSelectionDialog.java
843b88fe203b999a6fe3f7ac21b946bfac8ae5da
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / browser / SCLDefinitionSelectionDialog.java
1 package org.simantics.scl.ui.browser;
2
3 import java.util.Comparator;
4
5 import org.eclipse.core.runtime.CoreException;
6 import org.eclipse.core.runtime.IProgressMonitor;
7 import org.eclipse.core.runtime.IStatus;
8 import org.eclipse.core.runtime.Status;
9 import org.eclipse.jface.dialogs.IDialogSettings;
10 import org.eclipse.jface.viewers.LabelProvider;
11 import org.eclipse.swt.widgets.Composite;
12 import org.eclipse.swt.widgets.Control;
13 import org.eclipse.swt.widgets.Shell;
14 import org.eclipse.ui.IMemento;
15 import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
16 import org.eclipse.ui.dialogs.SearchPattern;
17 import org.simantics.scl.compiler.common.names.Name;
18 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
19 import org.simantics.scl.compiler.module.repository.ModuleRepositories;
20 import org.simantics.scl.compiler.types.Types;
21 import org.simantics.scl.osgi.SCLOsgi;
22 import org.simantics.scl.ui.Activator;
23
24 public class SCLDefinitionSelectionDialog extends FilteredItemsSelectionDialog {
25     private static final String DIALOG_SETTINGS = "SCLDefinitionSelectionDialogSettings";
26
27     public SCLDefinitionSelectionDialog(Shell shell) {
28         super(shell, false);
29         setTitle("Choose an SCL definition");
30         setSelectionHistory(new DefinitionSelectionHistory());
31         setListLabelProvider(new LabelProvider() {
32             @Override
33             public String getText(Object element) {
34                 if(element instanceof String)
35                     return (String)element;
36                 SCLValue value = (SCLValue)element;
37                 if(element == null)
38                     return "";
39                 Name name = value.getName();
40                 return name.name + " (" + name.module + ") :: " + value.getType();
41             }
42         });
43     }
44
45     private class DefinitionSelectionHistory extends SelectionHistory {
46         protected Object restoreItemFromMemento(IMemento element) {
47             //return element.getString("resource"); //$NON-NLS-1$
48             return null;
49         }
50         protected void storeItemToMemento(Object item, IMemento element) {
51             //element.putString("resource", item.toString()); //$NON-NLS-1$
52         }
53     }
54
55     @Override
56     protected Control createExtendedContentArea(Composite parent) {
57         return null;
58     }
59
60     protected IDialogSettings getDialogSettings() {
61          IDialogSettings settings = Activator.getInstance().getDialogSettings().getSection(DIALOG_SETTINGS);
62          if (settings == null)
63              settings = Activator.getInstance().getDialogSettings().addNewSection(DIALOG_SETTINGS);
64          return settings;
65     }
66
67     @Override
68     protected IStatus validateItem(Object item) {
69         return Status.OK_STATUS;
70     }
71
72     @Override
73     protected ItemsFilter createFilter() {
74         return new ItemsFilter() {
75             {
76                 String patternText = getPattern();
77                 patternMatcher = new SearchPattern();
78                 if(patternText != null && patternText.length() > 0)
79                     patternMatcher.setPattern(patternText);
80                 else 
81                     patternMatcher.setPattern("*");
82             }
83             
84             @Override
85             public boolean matchItem(Object item) {
86                 String text = item.toString();
87                 if(getPattern().contains("/"))
88                     return matches(text);
89                 else {
90                     int p = text.lastIndexOf('/');
91                     if(p >= 0)
92                         text = text.substring(p+1);
93                     return matches(text);
94                 }
95             }
96
97             @Override
98             public boolean isConsistentItem(Object item) {
99                 return true;
100             }
101             
102         };
103     }
104
105     @SuppressWarnings("rawtypes")
106     @Override
107     protected Comparator getItemsComparator() {
108         return new Comparator() {
109             public int compare(Object arg0, Object arg1) {
110                 SCLValue a = (SCLValue)arg0;
111                 SCLValue b = (SCLValue)arg1;
112                 int cmp = a.getName().name.compareTo(b.getName().name);
113                 if(cmp != 0)
114                     return cmp;
115                 return a.getName().module.compareTo(b.getName().module);
116             }
117         };
118     }
119
120     @Override
121     protected void fillContentProvider(AbstractContentProvider contentProvider,
122             ItemsFilter itemsFilter, IProgressMonitor progressMonitor)
123                     throws CoreException {
124         progressMonitor.beginTask("Searching", 1); //$NON-NLS-1$
125         for(SCLValue value : ModuleRepositories.allValues(SCLOsgi.MODULE_REPOSITORY)) {
126             if(isTupleValue(value.getName()))
127                 continue;
128             contentProvider.add(value, itemsFilter);
129         }
130         progressMonitor.worked(1);
131         progressMonitor.done();
132     }
133
134     private boolean isTupleValue(Name name) {
135         return name.module.equals(Types.BUILTIN) && name.name.startsWith("(") &&
136                 (name.name.equals("()") || name.name.charAt(1) == ',');
137     }
138
139     @Override
140     public String getElementName(Object item) {
141         return item.toString();
142     }
143
144 }