]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/AdaptableHintContext.java
Merge remote-tracking branch 'origin/svn' commit 'ccc1271c9d6657fb9dcf4cf3cb115fa0c8c...
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / AdaptableHintContext.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.browsing.ui.swt;\r
13 \r
14 import java.util.Arrays;\r
15 import java.util.HashMap;\r
16 import java.util.Map;\r
17 import java.util.Map.Entry;\r
18 \r
19 import org.eclipse.core.runtime.IAdaptable;\r
20 import org.simantics.db.layer0.SelectionHints;\r
21 import org.simantics.ui.selection.WorkbenchSelectionContentType;\r
22 import org.simantics.ui.selection.WorkbenchSelectionElement;\r
23 import org.simantics.utils.ObjectUtils;\r
24 import org.simantics.utils.datastructures.hints.IHintContext;\r
25 import org.simantics.utils.datastructures.hints.IHintListener;\r
26 import org.simantics.utils.threads.IThreadWorkQueue;\r
27 \r
28 /**\r
29  * A custom internal hint context implementation that does not support\r
30  * notifications to achieve a more space-optimized implementation.\r
31  * \r
32  * @author Tuukka Lehtonen\r
33  */\r
34 public class AdaptableHintContext implements IHintContext, IAdaptable, WorkbenchSelectionElement {\r
35 \r
36     private final Key[]              keysToTry;\r
37     protected final Map<Key, Object> hints;\r
38 \r
39     public AdaptableHintContext() {\r
40         this(SelectionHints.STD_KEYS);\r
41     }\r
42 \r
43     public AdaptableHintContext(Key... keys) {\r
44         this(new HashMap<Key, Object>(4), keys);\r
45     }\r
46 \r
47     public AdaptableHintContext(Map<Key, Object> hints, Key... keys) {\r
48         if (hints == null)\r
49             throw new NullPointerException("null hints");\r
50         this.keysToTry = keys;\r
51         this.hints = hints;\r
52     }\r
53 \r
54     @SuppressWarnings({ "unchecked", "rawtypes" })\r
55     @Override\r
56     public Object getAdapter(Class adapter) {\r
57         for (Key key : keysToTry) {\r
58             Object o = getHint(key);\r
59             if (adapter.isAssignableFrom(o.getClass()))\r
60                 return o;\r
61             if (o instanceof IAdaptable) {\r
62                 Object adapted = ((IAdaptable) o).getAdapter(adapter);\r
63                 if (adapted != null) {\r
64                     return adapted;\r
65                 }\r
66             }\r
67         }\r
68         return null;\r
69     }\r
70 \r
71     @Override\r
72     public String toString() {\r
73         return super.toString() + getHints();\r
74     }\r
75 \r
76     @Override\r
77     public void clearWithoutNotification() {\r
78         hints.clear();\r
79     }\r
80 \r
81     @Override\r
82     public boolean containsHint(Key key) {\r
83         return hints.get(key) != null;\r
84     }\r
85 \r
86     @SuppressWarnings("unchecked")\r
87     @Override\r
88     public <E> E getHint(Key key) {\r
89         if (key == null)\r
90             throw new IllegalArgumentException("key is null");\r
91         synchronized (this) {\r
92             return (E) hints.get(key);\r
93         }\r
94     }\r
95 \r
96     @Override\r
97     public synchronized Map<Key, Object> getHints() {\r
98         return new HashMap<Key, Object>(hints);\r
99     }\r
100 \r
101     @Override\r
102     public Map<Key, Object> getHintsUnsafe() {\r
103         return hints;\r
104     }\r
105 \r
106     @SuppressWarnings("unchecked")\r
107     @Override\r
108     public <E extends Key> Map<E, Object> getHintsOfClass(Class<E> clazz) {\r
109         Map<E, Object> result = null;\r
110         for (Entry<Key, Object> e : hints.entrySet()) {\r
111             Key key = e.getKey();\r
112             if (clazz.isAssignableFrom(key.getClass())) {\r
113                 if (result == null)\r
114                     result = new HashMap<E, Object>(4);\r
115                 result.put((E) key, e.getValue());\r
116             }\r
117         }\r
118         return result;\r
119     }\r
120 \r
121     @Override\r
122     public void setHint(Key key, Object value) {\r
123         if (key == null)\r
124             throw new IllegalArgumentException("key is null");\r
125         if (value == null)\r
126             throw new IllegalArgumentException("value is null");\r
127         if (!key.isValueAccepted(value))\r
128             throw new RuntimeException("Value \"" + value + "\" is not accepted with key " + key.getClass().getName());\r
129 \r
130         synchronized (this) {\r
131             hints.put(key, value);\r
132         }\r
133     }\r
134 \r
135     @Override\r
136     public void setHints(Map<Key, Object> hints) {\r
137         synchronized (this) {\r
138             for (Entry<Key, Object> e : hints.entrySet()) {\r
139                 Key key = e.getKey();\r
140                 Object value = e.getValue();\r
141                 if (value == null)\r
142                     throw new IllegalArgumentException("a value is null for key " + e.getKey());\r
143                 this.hints.put(key, value);\r
144             }\r
145         }\r
146     }\r
147 \r
148     @SuppressWarnings("unchecked")\r
149     @Override\r
150     public <E> E removeHint(Key key) {\r
151         if (key == null)\r
152             throw new IllegalArgumentException("key is null");\r
153 \r
154         Object oldValue = null;\r
155         synchronized (this) {\r
156             oldValue = hints.remove(key);\r
157         }\r
158         if (oldValue == null)\r
159             return null;\r
160         return (E) oldValue;\r
161     }\r
162 \r
163     @Override\r
164     public void addHintListener(IHintListener listener) {\r
165         throw new UnsupportedOperationException();\r
166     }\r
167 \r
168     @Override\r
169     public void removeHintListener(IHintListener listener) {\r
170         throw new UnsupportedOperationException();\r
171     }\r
172 \r
173     @Override\r
174     public void addKeyHintListener(Key key, IHintListener listener) {\r
175         throw new UnsupportedOperationException();\r
176     }\r
177 \r
178     @Override\r
179     public void removeKeyHintListener(Key key, IHintListener listener) {\r
180         throw new UnsupportedOperationException();\r
181     }\r
182 \r
183     @Override\r
184     public void addHintListener(IThreadWorkQueue threadAccess, IHintListener listener) {\r
185         throw new UnsupportedOperationException();\r
186     }\r
187 \r
188     @Override\r
189     public void removeHintListener(IThreadWorkQueue threadAccess, IHintListener listener) {\r
190         throw new UnsupportedOperationException();\r
191     }\r
192 \r
193     @Override\r
194     public void addKeyHintListener(IThreadWorkQueue threadAccess, Key key, IHintListener listener) {\r
195         throw new UnsupportedOperationException();\r
196     }\r
197 \r
198     @Override\r
199     public void removeKeyHintListener(IThreadWorkQueue threadAccess, Key key, IHintListener listener) {\r
200         throw new UnsupportedOperationException();\r
201     }\r
202 \r
203     @Override\r
204     public int hashCode() {\r
205         return ((hints.hashCode() * 31) + Arrays.hashCode(keysToTry)) * 31;\r
206     }\r
207 \r
208     @Override\r
209     public boolean equals(Object obj) {\r
210         if (this == obj)\r
211             return true;\r
212         if (obj == null)\r
213             return false;\r
214         if (getClass() != obj.getClass())\r
215             return false;\r
216         AdaptableHintContext other = (AdaptableHintContext) obj;\r
217         return Arrays.equals(keysToTry, other.keysToTry) && ObjectUtils.objectEquals(hints, other.hints);\r
218     }\r
219 \r
220         @Override\r
221         public <T> T getContent(WorkbenchSelectionContentType<T> contentType) {\r
222                 return null;\r
223         }\r
224 \r
225 }\r