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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.symbollibrary.ui;
\r
14 import org.eclipse.swt.widgets.Composite;
\r
15 import org.eclipse.ui.IEditorPart;
\r
16 import org.eclipse.ui.IMemento;
\r
17 import org.eclipse.ui.IViewSite;
\r
18 import org.eclipse.ui.IWorkbenchPage;
\r
19 import org.eclipse.ui.IWorkbenchPart;
\r
20 import org.eclipse.ui.PartInitException;
\r
21 import org.eclipse.ui.contexts.IContextService;
\r
22 import org.eclipse.ui.part.IContributedContentsView;
\r
23 import org.eclipse.ui.part.IPage;
\r
24 import org.eclipse.ui.part.Page;
\r
25 import org.eclipse.ui.part.PageBook;
\r
26 import org.eclipse.ui.part.PageBookView;
\r
27 import org.simantics.db.management.ISessionContextProvider;
\r
28 import org.simantics.diagram.symbolcontribution.EmptySymbolProviderFactory;
\r
29 import org.simantics.diagram.symbolcontribution.SymbolProviderFactory;
\r
30 import org.simantics.ui.SimanticsUI;
\r
31 import org.simantics.utils.datastructures.BijectionMap;
\r
34 * This paged view shows {@link SymbolLibraryPage}s for editors based on the
\r
35 * {@link ISymbolProviderFactory} the editors adapt to. ISymbolProvider equality is
\r
36 * used for deciding what pages to create/assign for activated workbench parts.
\r
37 * Only editors are considered in page creation.
\r
40 * To get a symbol palette for your editor, add the following to your
\r
41 * {@link IEditorPart#getAdapter(Class)} implementation:
\r
44 * if (c == ISymbolProviderFactory.class) {
\r
46 * return DiagramTypeUtils.readSymbolProviderFactory(RequestProcessor, Resource diagram);
\r
47 * } catch (DatabaseException e) {
\r
48 * // TODO: Log error
\r
54 * @author Tuukka Lehtonen
\r
56 public class SymbolPageView extends PageBookView {
\r
58 private static final String SYMBOL_VIEW_CONTEXT = "org.simantics.diagram.symbolLibrary";
\r
60 private ISessionContextProvider contextProvider;
\r
62 private IMemento memento;
\r
64 BijectionMap<SymbolProviderFactory, IPage> providerPageMap = new BijectionMap<SymbolProviderFactory, IPage>();
\r
67 public void createPartControl(Composite parent) {
\r
68 super.createPartControl(parent);
\r
70 IContextService cs = (IContextService) getSite().getService(IContextService.class);
\r
71 cs.activateContext(SYMBOL_VIEW_CONTEXT);
\r
74 @SuppressWarnings("rawtypes")
\r
76 protected Object getViewAdapter(Class adapter) {
\r
77 if (adapter == IContributedContentsView.class) {
\r
78 // This makes it possible to duplicate a PropertyPageView with another
\r
79 // secondary ID and make it show the same property page that was showing
\r
80 // in the original property page view.
\r
81 return new IContributedContentsView() {
\r
83 public IWorkbenchPart getContributingPart() {
\r
84 return getContributingEditor();
\r
88 if (adapter == ISessionContextProvider.class)
\r
89 return contextProvider;
\r
90 return super.getViewAdapter(adapter);
\r
94 * Returns the editor which contributed the current
\r
95 * page to this view.
\r
97 * @return the editor which contributed the current page
\r
98 * or <code>null</code> if no editor contributed the current page
\r
100 private IWorkbenchPart getContributingEditor() {
\r
101 return getCurrentContributingPart();
\r
105 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
\r
108 public void init(IViewSite site, IMemento memento) throws PartInitException {
\r
109 this.memento = memento;
\r
116 * @see org.eclipse.ui.part.PageBookView#init(org.eclipse.ui.IViewSite)
\r
119 public void init(IViewSite site) throws PartInitException {
\r
122 // This prevents the view from providing a selection to other
\r
123 // workbench parts, thus making them lose their selections which is not
\r
125 site.setSelectionProvider(null);
\r
127 contextProvider = SimanticsUI.getSessionContextProvider();
\r
131 public void saveState(IMemento memento) {
\r
132 if (this.memento != null) {
\r
133 memento.putMemento(this.memento);
\r
138 * Method declared on IWorkbenchPart.
\r
141 public void dispose() {
\r
142 // System.out.println("dispose: " + this);
\r
143 // Dispose of this before nullifying contextProvider because this
\r
144 // dispose may just need the context provider - at least PropertyPage
\r
148 contextProvider = null;
\r
152 protected IPage createDefaultPage(PageBook book) {
\r
153 Page page = new SymbolLibraryPage(EmptySymbolProviderFactory.INSTANCE);
\r
155 page.createControl(getPageBook());
\r
157 // MessagePage page = new MessagePage();
\r
159 // page.createControl(book);
\r
160 // page.setMessage(Messages.SymbolPageView_noSymbolsAvailable);
\r
165 protected PageRec doCreatePage(IWorkbenchPart part) {
\r
166 SymbolProviderFactory providerFactory = (SymbolProviderFactory) part.getAdapter(SymbolProviderFactory.class);
\r
167 if (providerFactory == null)
\r
170 IPage page = providerPageMap.getRight(providerFactory);
\r
171 if (page == null) {
\r
172 //System.out.println("create new symbol library page for part " + part + " and symbol provider factory " + providerFactory);
\r
173 Page newPage = new SymbolLibraryPage(providerFactory);
\r
175 newPage.createControl(getPageBook());
\r
177 providerPageMap.map(providerFactory, newPage);
\r
180 return new PageRec(part, page);
\r
184 protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
\r
185 IPage page = pageRecord.page;
\r
186 @SuppressWarnings("unused")
\r
187 SymbolProviderFactory provider = providerPageMap.removeWithRight(page);
\r
188 //System.out.println("destroy page " + page + " for symbol provider " + provider + " by closing part " + part);
\r
190 pageRecord.dispose();
\r
194 protected IWorkbenchPart getBootstrapPart() {
\r
195 IWorkbenchPage page = getSite().getPage();
\r
196 if (page != null) {
\r
197 IEditorPart editor = page.getActiveEditor();
\r
198 if (editor != null)
\r
200 return page.getActivePart();
\r
206 protected boolean isImportant(IWorkbenchPart part) {
\r
207 // Ignore all but editors.
\r
208 return part instanceof IEditorPart;
\r
212 * Method declared on IViewPart.
\r
213 * Treat this the same as part activation.
\r
216 public void partBroughtToTop(IWorkbenchPart part) {
\r
217 partActivated(part);
\r
221 // public void partActivated(IWorkbenchPart part) {
\r
222 // IWorkbenchPart source = getSourcePart(part);
\r
223 // //System.out.println("part activated: " + part + ", " + source);
\r
224 // super.partActivated(source);
\r
227 // private IWorkbenchPart getSourcePart(IWorkbenchPart part) {
\r
228 // IContributedContentsView view = (IContributedContentsView) part.getAdapter(IContributedContentsView.class);
\r
229 // if (view != null) {
\r
230 // IWorkbenchPart source = view.getContributingPart();
\r
231 // if (source != null)
\r