]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/symbollibrary/ui/SymbolPageView.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / symbollibrary / ui / SymbolPageView.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.diagram.symbollibrary.ui;\r
13 \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
32 \r
33 /**\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
38  * \r
39  * <p>\r
40  * To get a symbol palette for your editor, add the following to your\r
41  * {@link IEditorPart#getAdapter(Class)} implementation:\r
42  * \r
43  * <pre>\r
44  *     if (c == ISymbolProviderFactory.class) {\r
45  *         try {\r
46  *             return DiagramTypeUtils.readSymbolProviderFactory(RequestProcessor, Resource diagram);\r
47  *         } catch (DatabaseException e) {\r
48  *             // TODO: Log error\r
49  *             return null;\r
50  *         }\r
51  *     }\r
52  * </pre>\r
53  * \r
54  * @author Tuukka Lehtonen\r
55  */\r
56 public class SymbolPageView extends PageBookView {\r
57 \r
58     private static final String                SYMBOL_VIEW_CONTEXT = "org.simantics.diagram.symbolLibrary";\r
59 \r
60     private ISessionContextProvider            contextProvider;\r
61 \r
62     private IMemento                           memento;\r
63 \r
64     BijectionMap<SymbolProviderFactory, IPage> providerPageMap     = new BijectionMap<SymbolProviderFactory, IPage>();\r
65 \r
66     @Override\r
67     public void createPartControl(Composite parent) {\r
68         super.createPartControl(parent);\r
69 \r
70         IContextService cs = (IContextService) getSite().getService(IContextService.class);\r
71         cs.activateContext(SYMBOL_VIEW_CONTEXT);\r
72     }\r
73 \r
74     @SuppressWarnings("rawtypes")\r
75     @Override\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
82                 @Override\r
83                 public IWorkbenchPart getContributingPart() {\r
84                     return getContributingEditor();\r
85                 }\r
86             };\r
87         }\r
88         if (adapter == ISessionContextProvider.class)\r
89             return contextProvider;\r
90         return super.getViewAdapter(adapter);\r
91     }\r
92 \r
93     /**\r
94      * Returns the editor which contributed the current\r
95      * page to this view.\r
96      *\r
97      * @return the editor which contributed the current page\r
98      * or <code>null</code> if no editor contributed the current page\r
99      */\r
100     private IWorkbenchPart getContributingEditor() {\r
101         return getCurrentContributingPart();\r
102     }\r
103 \r
104     /* (non-Javadoc)\r
105      * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)\r
106      */\r
107     @Override\r
108     public void init(IViewSite site, IMemento memento) throws PartInitException {\r
109         this.memento = memento;\r
110         init(site);\r
111     }\r
112 \r
113     /*\r
114      * (non-Javadoc)\r
115      * \r
116      * @see org.eclipse.ui.part.PageBookView#init(org.eclipse.ui.IViewSite)\r
117      */\r
118     @Override\r
119     public void init(IViewSite site) throws PartInitException {\r
120         super.init(site);\r
121 \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
124         // desirable.\r
125         site.setSelectionProvider(null);\r
126 \r
127         contextProvider = SimanticsUI.getSessionContextProvider();\r
128     }\r
129 \r
130     @Override\r
131     public void saveState(IMemento memento) {\r
132         if (this.memento != null) {\r
133             memento.putMemento(this.memento);\r
134         }\r
135     }\r
136 \r
137     /* (non-Javadoc)\r
138      * Method declared on IWorkbenchPart.\r
139      */\r
140     @Override\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
145         // disposal will.\r
146         super.dispose();\r
147 \r
148         contextProvider = null;\r
149     }\r
150 \r
151     @Override\r
152     protected IPage createDefaultPage(PageBook book) {\r
153         Page page = new SymbolLibraryPage(EmptySymbolProviderFactory.INSTANCE);\r
154         initPage(page);\r
155         page.createControl(getPageBook());\r
156         return page;\r
157 //        MessagePage page = new MessagePage();\r
158 //        initPage(page);\r
159 //        page.createControl(book);\r
160 //        page.setMessage(Messages.SymbolPageView_noSymbolsAvailable);\r
161 //        return page;\r
162     }\r
163 \r
164     @Override\r
165     protected PageRec doCreatePage(IWorkbenchPart part) {\r
166         SymbolProviderFactory providerFactory = (SymbolProviderFactory) part.getAdapter(SymbolProviderFactory.class);\r
167         if (providerFactory == null)\r
168             return null;\r
169 \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
174             initPage(newPage);\r
175             newPage.createControl(getPageBook());\r
176 \r
177             providerPageMap.map(providerFactory, newPage);\r
178             page = newPage;\r
179         }\r
180         return new PageRec(part, page);\r
181     }\r
182 \r
183     @Override\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
189         page.dispose();\r
190         pageRecord.dispose();\r
191     }\r
192 \r
193     @Override\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
199                 return editor;\r
200             return page.getActivePart();\r
201         }\r
202         return null;\r
203     }\r
204 \r
205     @Override\r
206     protected boolean isImportant(IWorkbenchPart part) {\r
207         // Ignore all but editors.\r
208         return part instanceof IEditorPart;\r
209     }\r
210 \r
211     /* (non-Javadoc)\r
212      * Method declared on IViewPart.\r
213      * Treat this the same as part activation.\r
214      */\r
215     @Override\r
216     public void partBroughtToTop(IWorkbenchPart part) {\r
217         partActivated(part);\r
218     }\r
219 \r
220 //    @Override\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
225 //    }\r
226 //\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
232 //                return source;\r
233 //        }\r
234 //        return part;\r
235 //    }\r
236 \r
237 }\r