]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.ui/src/org/simantics/ui/workbench/dialogs/ResourceSelectionDialog2.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / workbench / dialogs / ResourceSelectionDialog2.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.ui.workbench.dialogs;\r
13 \r
14 import java.util.Comparator;\r
15 import java.util.Map;\r
16 \r
17 import org.eclipse.core.runtime.CoreException;\r
18 import org.eclipse.core.runtime.IProgressMonitor;\r
19 import org.eclipse.core.runtime.IStatus;\r
20 import org.eclipse.core.runtime.Status;\r
21 import org.eclipse.jface.dialogs.IDialogSettings;\r
22 import org.eclipse.jface.viewers.ILabelProvider;\r
23 import org.eclipse.jface.viewers.LabelProvider;\r
24 import org.eclipse.swt.graphics.Image;\r
25 import org.eclipse.swt.widgets.Composite;\r
26 import org.eclipse.swt.widgets.Control;\r
27 import org.eclipse.swt.widgets.Shell;\r
28 import org.eclipse.ui.IMemento;\r
29 import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;\r
30 import org.eclipse.ui.dialogs.SearchPattern;\r
31 import org.simantics.db.Resource;\r
32 import org.simantics.db.exception.InvalidResourceReferenceException;\r
33 import org.simantics.db.service.SerialisationSupport;\r
34 import org.simantics.ui.SimanticsUI;\r
35 import org.simantics.utils.datastructures.Pair;\r
36 \r
37 public abstract class ResourceSelectionDialog2<T> extends FilteredItemsSelectionDialog {\r
38 \r
39     Map<T, Pair<String, Image>> nameMap;\r
40     String title;\r
41 \r
42     class ResourceSelectionHistory extends FilteredItemsSelectionDialog.SelectionHistory {\r
43 \r
44         @Override\r
45         protected Object restoreItemFromMemento(IMemento memento) {\r
46             // FIXME: somehow create a collective transaction inside which the Graph.getRandomAccessReference should be invoked.\r
47 //            Resource r = SimanticsUI.getSession().getRandomAccessReference(memento.getTextData());\r
48 //            return r;\r
49             return null;\r
50         }\r
51 \r
52         @Override\r
53         protected void storeItemToMemento(Object item, IMemento memento) {\r
54             if(item instanceof Resource) {\r
55                 try {\r
56                     SerialisationSupport support = SimanticsUI.getSession().getService(SerialisationSupport.class);\r
57                     memento.putTextData(support.getResourceSerializer().createRandomAccessId((Resource)item));\r
58                 } catch (InvalidResourceReferenceException e) {\r
59                     e.printStackTrace();\r
60                 }\r
61             }\r
62         }\r
63         \r
64     };\r
65 \r
66     public ResourceSelectionDialog2(Shell shell, Map<T, Pair<String, Image>> parameter, String title) {\r
67         this(shell, parameter, title, true);\r
68     }\r
69 \r
70     public ResourceSelectionDialog2(Shell shell, Map<T, Pair<String, Image>> parameter, String title, boolean multi) {\r
71         super(shell, multi);\r
72         this.nameMap = parameter;\r
73         this.title = title;\r
74 \r
75         ILabelProvider labelProvider = new LabelProvider() {\r
76             @Override\r
77             public String getText(Object element) {\r
78                 Pair<String, Image> pair = nameMap.get(element);\r
79                 if(pair != null) return pair.first;\r
80                 else return null;\r
81             }\r
82             @Override\r
83             public Image getImage(Object element) {\r
84                 Pair<String, Image> pair = nameMap.get(element);\r
85                 if(pair != null) return pair.second;\r
86                 else return null;\r
87             }\r
88         }; \r
89 \r
90         setListLabelProvider(labelProvider);\r
91         setDetailsLabelProvider(labelProvider);\r
92 \r
93         setSelectionHistory(new ResourceSelectionHistory());\r
94         setTitle(title);\r
95     }\r
96 \r
97     @Override\r
98     protected Control createExtendedContentArea(Composite parent) {\r
99         // Don't create anything extra at the moment\r
100         return null;\r
101     }\r
102 \r
103     class ResourceSelectionDialogItemsFilter extends FilteredItemsSelectionDialog.ItemsFilter {\r
104         \r
105         public ResourceSelectionDialogItemsFilter() {\r
106             String patternText = getPattern();\r
107             patternMatcher = new SearchPattern();\r
108             if(patternText != null && patternText.length() > 0)\r
109                 patternMatcher.setPattern(patternText);\r
110             else \r
111                 patternMatcher.setPattern("*");\r
112         }\r
113 \r
114         @Override\r
115         public boolean isConsistentItem(Object item) {\r
116             return true;\r
117         }\r
118 \r
119         @Override\r
120         public boolean matchItem(Object item) {\r
121             return matches(nameMap.get(item).first);\r
122         }\r
123     }\r
124 \r
125     @Override\r
126     protected ItemsFilter createFilter() {\r
127         return new ResourceSelectionDialogItemsFilter();\r
128     }\r
129 \r
130     @Override\r
131     protected void fillContentProvider(AbstractContentProvider contentProvider,\r
132             ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException {\r
133         for(T o : nameMap.keySet())\r
134             contentProvider.add(o, itemsFilter);\r
135         if (progressMonitor != null)\r
136             progressMonitor.done();\r
137     }\r
138 \r
139     protected abstract IDialogSettings getBaseDialogSettings();\r
140 \r
141     @Override\r
142     protected IDialogSettings getDialogSettings() {\r
143         IDialogSettings base = getBaseDialogSettings();\r
144         IDialogSettings settings = base.getSection(title);\r
145         if (settings == null)\r
146             settings = base.addNewSection(title);\r
147         return settings;\r
148     }\r
149 \r
150     @Override\r
151     public String getElementName(Object item) {\r
152         return nameMap.get(item).first;\r
153     }\r
154 \r
155     @Override\r
156     protected Comparator<?> getItemsComparator() {\r
157         return new Comparator<Object>() {\r
158 \r
159             @Override\r
160             public int compare(Object o1, Object o2) {\r
161                 return nameMap.get(o1).first.compareToIgnoreCase(nameMap.get(o2).first);\r
162             }\r
163             \r
164         };\r
165     }\r
166 \r
167     @Override\r
168     protected IStatus validateItem(Object item) {\r
169         return Status.OK_STATUS;\r
170     }\r
171 \r
172     /**\r
173      * Made publicly visible.\r
174      * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#updateStatus(org.eclipse.core.runtime.IStatus)\r
175      */\r
176     @Override\r
177     public void updateStatus(IStatus status) {\r
178         super.updateStatus(status);\r
179     }\r
180 \r
181 }\r