]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/UpdateRunner.java
Merge remote-tracking branch 'origin/svn' commit 'ccc1271c9d6657fb9dcf4cf3cb115fa0c8c...
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / UpdateRunner.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2012 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.HashSet;\r
15 \r
16 import org.eclipse.swt.SWT;\r
17 import org.eclipse.swt.widgets.Control;\r
18 import org.eclipse.swt.widgets.TreeItem;\r
19 import org.simantics.browsing.ui.BuiltinKeys;\r
20 import org.simantics.browsing.ui.CheckedState;\r
21 import org.simantics.browsing.ui.NodeContext;\r
22 import org.simantics.browsing.ui.NodeQueryManager;\r
23 import org.simantics.browsing.ui.common.internal.GENodeQueryManager;\r
24 import org.simantics.browsing.ui.common.internal.IGraphExplorerContext;\r
25 import org.simantics.browsing.ui.content.PrunedChildrenResult;\r
26 \r
27 /**\r
28  * This class is responsible for updating the {@link TreeItem}s contained by the\r
29  * SWT Tree in {@link GraphExplorerImpl}.\r
30  * \r
31  * It will reschedule itself for as long as there are UI items to update in the\r
32  * explorer. This class is not responsible for performing any throttling of\r
33  * <code>UpdateRunner</code> executions.\r
34  * \r
35  * @author Antti Villberg\r
36  */\r
37 class UpdateRunner implements Runnable {\r
38 \r
39     final GraphExplorerImpl ge;\r
40     //final IGraphExplorerContext geContext;\r
41 \r
42     UpdateRunner(GraphExplorerImpl ge, IGraphExplorerContext geContext) {\r
43         this.ge = ge;\r
44       //  this.geContext = geContext;\r
45     }\r
46 \r
47     public void run() {\r
48         try {\r
49                 doRun();\r
50         } catch (Throwable t) {\r
51                 t.printStackTrace();\r
52         }\r
53         \r
54     }\r
55 \r
56     public void doRun() {\r
57         \r
58         if (ge.isDisposed())\r
59             return;\r
60 \r
61         HashSet<TreeItem> items = new HashSet<TreeItem>();\r
62         boolean doRoot;\r
63 \r
64         synchronized (ge.pendingItems) {\r
65 \r
66             doRoot = ge.pendingRoot;\r
67             \r
68             for (TreeItem item : ge.pendingItems) {\r
69                 //if(item.isDisposed()) continue;\r
70                 //if(item.getParentItem() == null) doRoot = true;\r
71                 //else items.add(item.getParentItem());\r
72                 if (item == null) {\r
73                     doRoot = true;\r
74                 } else {\r
75                     if(item.isDisposed()) continue;\r
76                     items.add(item);\r
77                 }\r
78             }\r
79 \r
80             ge.pendingItems = new HashSet<TreeItem>();\r
81             ge.pendingRoot = false;\r
82 \r
83         }\r
84 \r
85         if (doRoot) {\r
86 \r
87             NodeQueryManager manager = new GENodeQueryManager(ge.explorerContext, null, null, TreeItemReference.create(null));\r
88 \r
89             PrunedChildrenResult children = manager.query(ge.rootContext, BuiltinKeys.PRUNED_CHILDREN);\r
90             int maxChildren = ge.getMaxChildren(manager, ge.rootContext);\r
91             int childCount = Math.min(children.getPrunedChildren().length, maxChildren);\r
92             ge.tree.clearAll(true);\r
93             ge.tree.setItemCount(childCount);\r
94 \r
95         } else {\r
96 \r
97             int itemIndex = 0;\r
98             for (TreeItem item : items) {\r
99                 if (item.isDisposed())\r
100                     continue;\r
101 \r
102                 final NodeContext context = (NodeContext)item.getData();\r
103                 assert(context != null);\r
104 \r
105                 NodeQueryManager manager = new GENodeQueryManager(ge.explorerContext, null, null, TreeItemReference.create(item));\r
106 \r
107                 PrunedChildrenResult children = manager.query(context, BuiltinKeys.PRUNED_CHILDREN);\r
108 \r
109                 int maxChildren = ge.getMaxChildren(manager, context);\r
110                 item.setItemCount(Math.min(children.getPrunedChildren().length, maxChildren));\r
111 \r
112                 ge.setTextAndImage(item, manager, context, itemIndex);\r
113 \r
114                 item.clearAll(true);\r
115 \r
116                 boolean isExpanded = manager.query(context, BuiltinKeys.IS_EXPANDED);\r
117                 item.setExpanded(isExpanded);\r
118 \r
119                 if ((((Control) ge.getControl()).getStyle() & SWT.CHECK) != 0) {\r
120                     CheckedState checked = manager.query(context, BuiltinKeys.IS_CHECKED);\r
121                     item.setChecked(CheckedState.CHECKED_STATES.contains(checked));\r
122                     item.setGrayed(CheckedState.GRAYED == checked);\r
123                 }\r
124 \r
125                 ++itemIndex;\r
126             }\r
127         }\r
128 \r
129         synchronized (ge.pendingItems) {\r
130             if (!ge.scheduleUpdater())\r
131                 ge.updating = false;\r
132         }\r
133     }\r
134 \r
135 }\r