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.ui.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 EditorLoader() {
\r
54 public IWorkbenchPart getWorkbechPart() {
\r
55 return ThreeDimensionalEditorPart.this.getEditorSite().getPart();
\r
58 public void load() {
\r
59 //System.out.println("ThreeDimensionalEditorPart.reload()");
\r
60 Session ses = ThreeDimensionalEditorPart.this.getSession();
\r
61 GraphRequestAdapter r = new GraphRequestAdapter() {
\r
63 public GraphRequestStatus perform(Graph g)
\r
66 return GraphRequestStatus.transactionComplete();
\r
73 IActionBars actionBar = getEditorSite().getActionBars();
\r
74 // editor.setActionBarContributor(getEditorSite().getActionBarContributor());
\r
75 editor.setActionBars(actionBar);
\r
76 getSession().syncRead(new GraphRequestAdapter() {
\r
78 public GraphRequestStatus perform(Graph g) throws Exception {
\r
79 editor.createControl(g,parent);
\r
80 return GraphRequestStatus.transactionComplete();
\r
84 contributeStatusBar(actionBar.getStatusLineManager());
\r
85 hookPageSelection();
\r
86 getSite().setSelectionProvider(editor.selectionAdapter);
\r
90 } catch (Exception e) {
\r
91 Display d = getSite().getShell().getDisplay();
\r
92 d.asyncExec(new Runnable() {
\r
94 getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);
\r
98 ErrorLogger logger = ErrorLogger.getDefault();
\r
99 logger.logError("Shape editor failed to open, see exception for details", e);
\r
105 protected void contributeStatusBar(IStatusLineManager manager) {
\r
110 public void reload(Graph g) {
\r
111 Resource inputResource = getInputResource();
\r
112 if (inputResource != null) {
\r
113 editor.reload(g,inputResource);
\r
116 Display d = getSite().getShell().getDisplay();
\r
117 d.asyncExec(new Runnable() {
\r
118 public void run() {
\r
119 editor.showMessage("Failed to load model.");
\r
120 getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);
\r
127 public void update(GraphChangeEvent e) {
\r
132 public void setFocus() {
\r
137 * Hooks selection listening
\r
139 private void hookPageSelection() {
\r
140 pageSelectionListener = new ISelectionListener() {
\r
141 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
\r
142 if (part == ThreeDimensionalEditorPart.this)
\r
144 pageSelectionChanged(part, selection);
\r
147 getSite().getPage().addPostSelectionListener(pageSelectionListener);
\r
148 ISelection sel = getSite().getPage().getSelection();
\r
149 IWorkbenchPart wb = getSite().getPage().getActivePart();
\r
150 pageSelectionChanged(wb, sel);
\r
154 * Receives selection changes
\r
159 protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {
\r
160 editor.pageSelectionChanged(part, selection);
\r
163 public void dispose() {
\r
164 if (pageSelectionListener != null)
\r
165 getSite().getPage().removePostSelectionListener(pageSelectionListener);
\r
170 public ThreeDimensionalEditorBase getEditor() {
\r
175 public Object getAdapter(Class adapter) {
\r
176 Object o = super.getAdapter(adapter);
\r
178 o = editor.getAdapter(adapter);
\r