]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.debug.ui/src/org/simantics/debug/ui/SessionDebugger.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.debug.ui / src / org / simantics / debug / ui / SessionDebugger.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.debug.ui;\r
13 \r
14 import org.eclipse.core.runtime.Assert;\r
15 import org.eclipse.jface.viewers.ITreeContentProvider;\r
16 import org.eclipse.jface.viewers.TreeViewer;\r
17 import org.eclipse.jface.viewers.Viewer;\r
18 import org.eclipse.swt.SWT;\r
19 import org.eclipse.swt.events.DisposeEvent;\r
20 import org.eclipse.swt.events.DisposeListener;\r
21 import org.eclipse.swt.layout.GridData;\r
22 import org.eclipse.swt.layout.GridLayout;\r
23 import org.eclipse.swt.widgets.Composite;\r
24 import org.simantics.db.Session;\r
25 import org.simantics.db.ReadGraph;\r
26 import org.simantics.db.common.processor.MergingGraphRequestProcessor;\r
27 import org.simantics.db.common.request.ReadRequest;\r
28 import org.simantics.db.event.ChangeEvent;\r
29 import org.simantics.db.event.ChangeListener;\r
30 import org.simantics.db.exception.DatabaseException;\r
31 import org.simantics.db.service.GraphChangeListenerSupport;\r
32 \r
33 \r
34 public class SessionDebugger extends Composite {\r
35     \r
36     /**\r
37      * The Session used to access the graph. Received from outside of this\r
38      * class and therefore it is not disposed here, just used.\r
39      */\r
40     private Session                        session;\r
41     \r
42     private MergingGraphRequestProcessor              updater;\r
43     \r
44     private TreeViewer                      clusters;\r
45     \r
46     private ChangeListener changeListener = new ChangeListener() {\r
47         public void graphChanged(ChangeEvent e) {\r
48             // This makes sure that the transaction for updating this\r
49             // GraphDebugger get executed in a serialized fashion.\r
50             updater.asyncRequest(new ReadRequest() {\r
51                 @Override\r
52                 public void run(ReadGraph g) throws DatabaseException {\r
53                     updateContent();\r
54                 }\r
55             });\r
56         }\r
57     };\r
58 \r
59     /**\r
60      * @param parent\r
61      * @param style\r
62      * @param session\r
63      * @param resource the initial resource to debug or <code>null</code> for\r
64      *        initially blank UI.\r
65      */\r
66     public SessionDebugger(Composite parent, int style, final Session session) {\r
67         super(parent, style);\r
68         Assert.isNotNull(session, "session is null");\r
69         this.session = session;\r
70         updater = new MergingGraphRequestProcessor(session, 100);\r
71         \r
72         addDisposeListener(new DisposeListener() {\r
73                         @Override\r
74                         public void widgetDisposed(DisposeEvent e) {\r
75                         GraphChangeListenerSupport support = session.getService(GraphChangeListenerSupport.class);\r
76                         support.removeListener(changeListener);\r
77                         }\r
78         });\r
79         \r
80     }\r
81     \r
82     public void initializeUI() {\r
83         \r
84         setLayout(new GridLayout(1, false));\r
85         setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
86 \r
87         createViewer(this);\r
88         \r
89     }\r
90 \r
91     public TreeViewer createViewer(Composite parent) {\r
92 \r
93         clusters = new TreeViewer(parent, SWT.NONE);\r
94         clusters.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
95 \r
96         clusters.setContentProvider(new ITreeContentProvider() {\r
97 \r
98             @Override\r
99             public Object[] getChildren(Object parentElement) {\r
100                 return new Object[0];\r
101             }\r
102 \r
103             @Override\r
104             public Object getParent(Object element) {\r
105                 return null;\r
106             }\r
107 \r
108             @Override\r
109             public boolean hasChildren(Object element) {\r
110                 return false;\r
111             }\r
112 \r
113             @Override\r
114             public Object[] getElements(Object inputElement) {\r
115 //                return session.getDebug().getActiveClusters();\r
116                 return new Object[0];\r
117             }\r
118 \r
119             @Override\r
120             public void dispose() {\r
121             }\r
122 \r
123             @Override\r
124             public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
125             }\r
126             \r
127         });\r
128         \r
129         // Schedule a request that updates the browser content.\r
130         refreshClusters();\r
131         GraphChangeListenerSupport support = session.getService(GraphChangeListenerSupport.class);\r
132         support.addListener(changeListener);\r
133 \r
134         return clusters;\r
135         \r
136     }\r
137 \r
138     public void refreshClusters() {\r
139         \r
140         // Schedule a request that updates the browser content.\r
141         updater.asyncRequest(new ReadRequest() {\r
142             @Override\r
143             public void run(ReadGraph g) throws DatabaseException {\r
144                 updateContent();\r
145             }\r
146         });\r
147         \r
148     }\r
149     \r
150     public void updateContent() {\r
151 \r
152         clusters.getTree().getDisplay().asyncExec(new Runnable() {\r
153 \r
154             @Override\r
155             public void run() {\r
156                 \r
157                 if(clusters.getTree().isDisposed()) return;\r
158                 clusters.setInput(new Object());\r
159                 \r
160             }\r
161             \r
162         });\r
163         \r
164     }\r
165 \r
166 }\r