1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\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.jfreechart.chart.properties;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
16 import java.util.Iterator;
\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.utils.ui.AdaptionUtils;
\r
32 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
35 public class VariableProposalProvider implements IContentProposalProvider, Widget {
\r
38 * The proposals provided.
\r
40 private Collection<ChartVariable> proposals;
\r
43 * The proposals mapped to IContentProposal. Cached for speed in the case
\r
44 * where filtering is not used.
\r
46 private IContentProposal[] contentProposals;
\r
49 * Boolean that tracks whether filtering is used.
\r
51 private boolean filterProposals = false;
\r
54 private boolean compareRVI = false;
\r
56 * Return an array of Objects representing the valid content proposals for a
\r
60 * the current contents of the field (only consulted if filtering
\r
61 * is set to <code>true</code>)
\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
67 @SuppressWarnings("unchecked")
\r
68 public IContentProposal[] getProposals(String contents, int position) {
\r
69 if (filterProposals) {
\r
70 @SuppressWarnings("rawtypes")
\r
71 ArrayList list = new ArrayList();
\r
73 for (ChartVariable proposal : proposals) {
\r
74 if (proposal.getRvi().length() >= contents.length() && proposal.getRvi().substring(0, contents.length()).equalsIgnoreCase(contents)) {
\r
75 if (proposal.getLabel() != null)
\r
76 list.add(new ContentProposal(proposal.getRvi(),proposal.getLabel(), null));
\r
78 list.add(new ContentProposal(proposal.getRvi()));
\r
79 } else if (proposal.getLabel() != null && proposal.getLabel().length() >= contents.length() && proposal.getLabel().substring(0, contents.length()).equalsIgnoreCase(contents)) {
\r
80 list.add(new ContentProposal(proposal.getRvi(),proposal.getLabel(), null));
\r
84 for (ChartVariable proposal : proposals) {
\r
85 if (proposal.getLabel() != null && proposal.getLabel().length() >= contents.length() && proposal.getLabel().substring(0, contents.length()).equalsIgnoreCase(contents)) {
\r
86 list.add(new ContentProposal(proposal.getRvi(),proposal.getLabel(), null));
\r
91 return (IContentProposal[]) list.toArray(new IContentProposal[list
\r
94 if (contentProposals == null) {
\r
95 contentProposals = new IContentProposal[proposals.size()];
\r
96 Iterator<ChartVariable> iter = proposals.iterator();
\r
97 for (int i = 0; i < proposals.size(); i++) {
\r
98 ChartVariable proposal = iter.next();
\r
99 if (proposal.getLabel() != null)
\r
100 contentProposals[i] = new ContentProposal(proposal.getRvi(),proposal.getLabel(),null);
\r
102 contentProposals[i] = new ContentProposal(proposal.getRvi());
\r
105 return contentProposals;
\r
109 * Set the Strings to be used as content proposals.
\r
112 * the array of Strings to be used as proposals.
\r
114 public void setProposals(Collection<ChartVariable> items) {
\r
115 this.proposals = items;
\r
116 contentProposals = null;
\r
120 * Set the boolean that controls whether proposals are filtered according to
\r
121 * the current field content.
\r
123 * @param filterProposals
\r
124 * <code>true</code> if the proposals should be filtered to
\r
125 * show only those that match the current contents of the field,
\r
126 * and <code>false</code> if the proposals should remain the
\r
127 * same, ignoring the field content.
\r
130 public void setFiltering(boolean filterProposals) {
\r
131 this.filterProposals = filterProposals;
\r
132 // Clear any cached proposals.
\r
133 contentProposals = null;
\r
137 * Provides all variables a model contains. Given resource needs to be
\r
138 * part of a model (i.e. using PartOf leads eventually to a SysdynModel).
\r
140 * @param control Control that is using this provider
\r
141 * @param resource A resource that is part of a model
\r
143 public VariableProposalProvider(final Control control, WidgetSupport support) {
\r
144 this.proposals = new ArrayList<ChartVariable>();
\r
145 support.register(this);
\r
146 this.control = control;
\r
149 private Resource resource;
\r
150 private Control control;
\r
153 public void setInput(ISessionContext context, Object input) {
\r
155 final Resource resource = AdaptionUtils.adaptToSingle(input, Resource.class);
\r
156 if(resource == null)
\r
158 this.resource = resource;
\r
160 SimanticsUI.getSession().asyncRequest(
\r
161 new AllVariablesOfModel(resource)
\r
162 , new Listener<Collection<ChartVariable>>() {
\r
165 public void execute(Collection<ChartVariable> result) {
\r
166 setProposals(result);
\r
170 public void exception(Throwable t) {
\r
171 t.printStackTrace();
\r
175 public boolean isDisposed() {
\r
176 return control == null ||
\r
177 control.isDisposed() ||
\r
178 !resource.equals(VariableProposalProvider.this.resource);
\r