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