1 /*******************************************************************************
\r
2 * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.
\r
3 * All rights reserved. This program and the accompanying materials
\r
4 * are made available under the terms of the Eclipse Public License v1.0
\r
5 * which accompanies this distribution, and is available at
\r
6 * http://www.eclipse.org/legal/epl-v10.html
\r
9 * VTT Technical Research Centre of Finland - initial API and implementation
\r
10 *******************************************************************************/
\r
11 package org.simantics.proconf.g3d.base;
\r
13 import org.eclipse.jface.action.IStatusLineManager;
\r
14 import org.eclipse.jface.viewers.ISelection;
\r
15 import org.eclipse.swt.widgets.Composite;
\r
16 import org.eclipse.swt.widgets.Display;
\r
17 import org.eclipse.ui.IActionBars;
\r
18 import org.eclipse.ui.IPartListener;
\r
19 import org.eclipse.ui.ISelectionListener;
\r
20 import org.eclipse.ui.IWorkbenchPart;
\r
21 import org.simantics.db.Graph;
\r
22 import org.simantics.db.GraphRequestAdapter;
\r
23 import org.simantics.db.GraphRequestStatus;
\r
24 import org.simantics.db.Session;
\r
25 import org.simantics.db.Resource;
\r
26 import org.simantics.db.events.GraphChangeEvent;
\r
27 import org.simantics.db.management.ISessionContext;
\r
28 import org.simantics.proconf.ui.workbench.ResourceEditorPart;
\r
29 import org.simantics.utils.ErrorLogger;
\r
32 public abstract class ThreeDimensionalEditorPart extends ResourceEditorPart implements ThreeDimensionalEditorProvider{
\r
34 protected Composite parent;
\r
36 protected ThreeDimensionalEditorBase editor;
\r
38 protected ISelectionListener pageSelectionListener;
\r
40 protected abstract ThreeDimensionalEditorBase createEditor(ISessionContext session);
\r
43 * This is a callback that will allow us to create the viewer and it.
\r
46 public void createPartControl(Composite p) {
\r
49 editor = createEditor(getSessionContext());
\r
51 // add partlistener that loads the scene-graph when the view has been created
\r
52 this.getEditorSite().getPage().addPartListener(new IPartListener() {
\r
54 boolean opened = false;
\r
55 boolean activated = false;
\r
57 public void partOpened(IWorkbenchPart part) {
\r
58 if (part.equals(ThreeDimensionalEditorPart.this.getEditorSite().getPart())) {
\r
63 public void partActivated(IWorkbenchPart part) {
\r
64 if (part.equals(ThreeDimensionalEditorPart.this.getEditorSite().getPart())) {
\r
65 if (opened & !activated) {
\r
72 public void partBroughtToTop(IWorkbenchPart part) {}
\r
74 public void partClosed(IWorkbenchPart part) {}
\r
76 public void partDeactivated(IWorkbenchPart part) {}
\r
78 private void load() {
\r
79 //System.out.println("ThreeDimensionalEditorPart.reload()");
\r
80 Session ses = ThreeDimensionalEditorPart.this.getSession();
\r
81 GraphRequestAdapter r = new GraphRequestAdapter() {
\r
83 public GraphRequestStatus perform(Graph g)
\r
86 return GraphRequestStatus.transactionComplete();
\r
93 IActionBars actionBar = getEditorSite().getActionBars();
\r
94 // editor.setActionBarContributor(getEditorSite().getActionBarContributor());
\r
95 editor.setActionBars(actionBar);
\r
96 getSession().syncRead(new GraphRequestAdapter() {
\r
98 public GraphRequestStatus perform(Graph g) throws Exception {
\r
99 editor.createControl(g,parent);
\r
100 return GraphRequestStatus.transactionComplete();
\r
104 contributeStatusBar(actionBar.getStatusLineManager());
\r
105 hookPageSelection();
\r
106 getSite().setSelectionProvider(editor.selectionAdapter);
\r
110 } catch (Exception e) {
\r
111 Display d = getSite().getShell().getDisplay();
\r
112 d.asyncExec(new Runnable() {
\r
113 public void run() {
\r
114 getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);
\r
118 ErrorLogger logger = ErrorLogger.getDefault();
\r
119 logger.logError("Shape editor failed to open, see exception for details", e);
\r
125 protected void contributeStatusBar(IStatusLineManager manager) {
\r
130 public void reload(Graph g) {
\r
131 Resource inputResource = getInputResource();
\r
132 if (inputResource != null) {
\r
133 editor.reload(g,inputResource);
\r
136 Display d = getSite().getShell().getDisplay();
\r
137 d.asyncExec(new Runnable() {
\r
138 public void run() {
\r
139 editor.showMessage("Failed to load model.");
\r
140 getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);
\r
147 public void update(GraphChangeEvent e) {
\r
152 public void setFocus() {
\r
157 * Hooks selection listening
\r
159 private void hookPageSelection() {
\r
160 pageSelectionListener = new ISelectionListener() {
\r
161 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
\r
162 if (part == ThreeDimensionalEditorPart.this)
\r
164 pageSelectionChanged(part, selection);
\r
167 getSite().getPage().addPostSelectionListener(pageSelectionListener);
\r
168 ISelection sel = getSite().getPage().getSelection();
\r
169 IWorkbenchPart wb = getSite().getPage().getActivePart();
\r
170 pageSelectionChanged(wb, sel);
\r
174 * Receives selection changes
\r
179 protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {
\r
180 editor.pageSelectionChanged(part, selection);
\r
183 public void dispose() {
\r
184 if (pageSelectionListener != null)
\r
185 getSite().getPage().removePostSelectionListener(pageSelectionListener);
\r
190 public ThreeDimensionalEditorBase getEditor() {
\r
195 public Object getAdapter(Class adapter) {
\r
196 Object o = super.getAdapter(adapter);
\r
198 o = editor.getAdapter(adapter);
\r