]> gerrit.simantics Code Review - simantics/sysdyn.git/blob
aa19d6def8a5d1f7284c8a1ef597b7584901b966
[simantics/sysdyn.git] /
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
3  * 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.jfreechart.chart.properties;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Iterator;\r
17 \r
18 import org.eclipse.jface.fieldassist.ContentProposal;\r
19 import org.eclipse.jface.fieldassist.IContentProposal;\r
20 import org.eclipse.jface.fieldassist.IContentProposalProvider;\r
21 import org.eclipse.swt.widgets.Control;\r
22 import org.simantics.browsing.ui.swt.widgets.impl.Widget;\r
23 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;\r
24 import org.simantics.db.Resource;\r
25 import org.simantics.db.management.ISessionContext;\r
26 import org.simantics.db.procedure.Listener;\r
27 import org.simantics.ui.SimanticsUI;\r
28 import org.simantics.ui.utils.AdaptionUtils;\r
29 \r
30 /**\r
31  * \r
32  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
33  *\r
34  */\r
35 public class VariableProposalProvider implements IContentProposalProvider, Widget {\r
36 \r
37         /*\r
38          * The proposals provided.\r
39          */\r
40         private Collection<ChartVariable> proposals;\r
41 \r
42         /*\r
43          * The proposals mapped to IContentProposal. Cached for speed in the case\r
44          * where filtering is not used.\r
45          */\r
46         private IContentProposal[] contentProposals;\r
47 \r
48         /*\r
49          * Boolean that tracks whether filtering is used.\r
50          */\r
51         private boolean filterProposals = false;\r
52 \r
53 \r
54         private boolean compareRVI = false;\r
55         /**\r
56          * Return an array of Objects representing the valid content proposals for a\r
57          * field. \r
58          * \r
59          * @param contents\r
60          *            the current contents of the field (only consulted if filtering\r
61          *            is set to <code>true</code>)\r
62          * @param position\r
63          *            the current cursor position within the field (ignored)\r
64          * @return the array of Objects that represent valid proposals for the field\r
65          *         given its current content.\r
66          */\r
67         @SuppressWarnings("unchecked")\r
68         public IContentProposal[] getProposals(String contents, int position) {\r
69                 if (filterProposals) {\r
70                         ArrayList list = new ArrayList();\r
71                         if (compareRVI) {\r
72                                 for (ChartVariable proposal : proposals) {\r
73                                         if (proposal.getRvi().length() >= contents.length() && proposal.getRvi().substring(0, contents.length()).equalsIgnoreCase(contents)) {\r
74                                                 if (proposal.getLabel() != null)\r
75                                                         list.add(new ContentProposal(proposal.getRvi(),proposal.getLabel(), null));\r
76                                                 else\r
77                                                         list.add(new ContentProposal(proposal.getRvi()));\r
78                                         } else if (proposal.getLabel() != null && proposal.getLabel().length() >= contents.length() && proposal.getLabel().substring(0, contents.length()).equalsIgnoreCase(contents)) {\r
79                                                 list.add(new ContentProposal(proposal.getRvi(),proposal.getLabel(), null));\r
80                                         }\r
81                                 }\r
82                         } else {\r
83                                 for (ChartVariable proposal : proposals) {\r
84                                         if (proposal.getLabel() != null && proposal.getLabel().length() >= contents.length() && proposal.getLabel().substring(0, contents.length()).equalsIgnoreCase(contents)) {\r
85                                                 list.add(new ContentProposal(proposal.getRvi(),proposal.getLabel(), null));\r
86                                         }\r
87                                 }\r
88                         }\r
89                         \r
90                         return (IContentProposal[]) list.toArray(new IContentProposal[list\r
91                                         .size()]);\r
92                 }\r
93                 if (contentProposals == null) {\r
94                         contentProposals = new IContentProposal[proposals.size()];\r
95                         Iterator<ChartVariable> iter = proposals.iterator();\r
96                         for (int i = 0; i < proposals.size(); i++) {\r
97                                 ChartVariable proposal = iter.next();\r
98                                 if (proposal.getLabel() != null)\r
99                                         contentProposals[i] = new ContentProposal(proposal.getRvi(),proposal.getLabel(),null);\r
100                                 else\r
101                                         contentProposals[i] = new ContentProposal(proposal.getRvi());\r
102                         }\r
103                 }\r
104                 return contentProposals;\r
105         }\r
106 \r
107         /**\r
108          * Set the Strings to be used as content proposals.\r
109          * \r
110          * @param items\r
111          *            the array of Strings to be used as proposals.\r
112          */\r
113         public void setProposals(Collection<ChartVariable> items) {\r
114                 this.proposals = items;\r
115                 contentProposals = null;\r
116         }\r
117 \r
118         /**\r
119          * Set the boolean that controls whether proposals are filtered according to\r
120          * the current field content.\r
121          * \r
122          * @param filterProposals\r
123          *            <code>true</code> if the proposals should be filtered to\r
124          *            show only those that match the current contents of the field,\r
125          *            and <code>false</code> if the proposals should remain the\r
126          *            same, ignoring the field content.\r
127          * @since 3.3\r
128          */\r
129         public void setFiltering(boolean filterProposals) {\r
130                 this.filterProposals = filterProposals;\r
131                 // Clear any cached proposals.\r
132                 contentProposals = null;\r
133         }\r
134         \r
135     /**\r
136      * Provides all variables a model contains. Given resource needs to be\r
137      * part of a model (i.e. using PartOf leads eventually to a SysdynModel).\r
138      *  \r
139      * @param control Control that is using this provider\r
140      * @param resource A resource that is part of a model\r
141      */\r
142     public VariableProposalProvider(final Control control, WidgetSupport support) {\r
143         this.proposals = new ArrayList<ChartVariable>();\r
144         support.register(this);\r
145         this.control = control;\r
146     }\r
147 \r
148     private Resource resource;\r
149     private Control control;\r
150     \r
151     @Override\r
152     public void setInput(ISessionContext context, Object input) {\r
153 \r
154         final Resource resource = AdaptionUtils.adaptToSingle(input, Resource.class);\r
155         if(resource == null)\r
156             return;\r
157         this.resource = resource;\r
158         \r
159         SimanticsUI.getSession().asyncRequest(\r
160                 new AllVariablesOfModel(resource)\r
161         , new Listener<Collection<ChartVariable>>() {\r
162 \r
163             @Override\r
164             public void execute(Collection<ChartVariable> result) {\r
165                 setProposals(result);\r
166             }\r
167 \r
168             @Override\r
169             public void exception(Throwable t) {\r
170                 t.printStackTrace();\r
171             }\r
172 \r
173             @Override\r
174             public boolean isDisposed() {\r
175                 return control == null || \r
176                         control.isDisposed() || \r
177                         !resource.equals(VariableProposalProvider.this.resource);\r
178             }\r
179 \r
180         }); \r
181         \r
182     }\r
183     \r
184 }\r