]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.workbench/src/org/simantics/workbench/internal/contributions/search/BrowserView.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.workbench / src / org / simantics / workbench / internal / contributions / search / BrowserView.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2014 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  *     Semantum Oy\r
12  *******************************************************************************/\r
13 package org.simantics.workbench.internal.contributions.search;\r
14 \r
15 import java.net.URL;\r
16 \r
17 import org.eclipse.swt.SWT;\r
18 import org.eclipse.swt.browser.Browser;\r
19 import org.eclipse.swt.widgets.Composite;\r
20 import org.eclipse.ui.PlatformUI;\r
21 import org.eclipse.ui.part.ViewPart;\r
22 import org.simantics.Simantics;\r
23 import org.simantics.db.Session;\r
24 import org.simantics.db.layer0.request.ActiveModels;\r
25 import org.simantics.db.management.ISessionContext;\r
26 import org.simantics.db.management.ISessionContextChangedListener;\r
27 import org.simantics.db.management.SessionContextChangedEvent;\r
28 import org.simantics.db.service.LifecycleSupport;\r
29 import org.simantics.utils.ui.SWTUtils;\r
30 import org.simantics.workbench.search.ISearchService;\r
31 import org.simantics.workbench.search.ISearchService.ResultBrowser;\r
32 import org.simantics.workbench.search.SearchQuery;\r
33 \r
34 /**\r
35  * A very non-configurable Web browser view for search trim.\r
36  * \r
37  * @author Tuukka Lehtonen\r
38  */\r
39 public class BrowserView extends ViewPart {\r
40 \r
41     /**\r
42      * ID of this view's plug-in extension.\r
43      */\r
44     public static final String ID = "org.simantics.workbench.search.browser";\r
45 \r
46     /**\r
47      * Used as a property of this view to keep track of the last search query\r
48      * performed with this view. This information is needed to know whether or\r
49      * not to initialize the view with default contents after it has been\r
50      * created. This depends on whether the creation was caused by a simple\r
51      * activation of the view or an actual search being performed.\r
52      */\r
53     public static final String LAST_QUERY_PROPERTY = "org.simantics.workbench.search.browser.lastQuery";\r
54 \r
55     private Browser              browser;\r
56     private boolean              disposed;\r
57     private ActiveModelsListener currentListener;\r
58 \r
59     @Override\r
60     public void createPartControl(Composite parent) {\r
61         browser = new org.eclipse.swt.browser.Browser(parent, SWT.NONE);\r
62 \r
63         // Ensure the view receives some browser content even when no searches\r
64         // have been performed yet.\r
65         scheduleInitializeViewContent(false);\r
66 \r
67         // Make sure that the contents of the view are reset every time the set\r
68         // of active models changes. This must be because what is searchable depends\r
69         // completely on the active models. When there is no active model, the search\r
70         // will find nothing.\r
71         Simantics.getSessionContextProvider().addContextChangedListener(sessionListener);\r
72         trackActiveModels(Simantics.peekSession());\r
73     }\r
74 \r
75     private ISessionContextChangedListener sessionListener = new ISessionContextChangedListener() {\r
76         @Override\r
77         public void sessionContextChanged(SessionContextChangedEvent event) {\r
78             ISessionContext ctx = event.getNewValue();\r
79             final Session newSession = ctx != null ? ctx.peekSession() : null;\r
80             // Synchronize session changes to the UI thread to keep threading more predictable.\r
81             SWTUtils.asyncExec(browser, new Runnable() {\r
82                 @Override\r
83                 public void run() {\r
84                     if (!disposed)\r
85                         trackActiveModels(newSession);\r
86                 }\r
87             });\r
88         }\r
89     };\r
90 \r
91     private void trackActiveModels(Session session) {\r
92         if (currentListener != null) {\r
93             currentListener.dispose();\r
94             currentListener = null;\r
95         }\r
96         if (session != null) {\r
97                 \r
98                         LifecycleSupport lfs = session.peekService(LifecycleSupport.class);\r
99                         if (lfs == null)\r
100                                 return;\r
101                         if (lfs.isClosed())\r
102                                 return;\r
103                 \r
104             ActiveModelsListener listener = new ActiveModelsListener(new Runnable() {\r
105                 @Override\r
106                 public void run() {\r
107                     scheduleInitializeViewContent(true);\r
108                 }\r
109             });\r
110                         \r
111             // Make sure that the listener is disposed if the session is disposed.\r
112             session.registerService(ActiveModelsListener.class, listener);\r
113             session.asyncRequest(new ActiveModels(Simantics.getProjectResource()), listener);\r
114             this.currentListener = listener;\r
115         }\r
116     }\r
117 \r
118     protected void scheduleInitializeViewContent(final boolean force) {\r
119         SWTUtils.asyncExec(browser, new Runnable() {\r
120             @Override\r
121             public void run() {\r
122                 if (disposed)\r
123                     return;\r
124                 // If SearchServiceImpl hasn't performed any queries yet,\r
125                 // then we shall initialize the view contents at this point.\r
126                 String lastQuery = getPartProperty(LAST_QUERY_PROPERTY);\r
127                 if (force || lastQuery == null)\r
128                     initializeViewContent();\r
129             }\r
130         });\r
131     }\r
132 \r
133     protected void initializeViewContent() {\r
134         SearchQuery query = new SearchQuery("");\r
135         query.setSearchFlag("Name", "on");\r
136         query.setSearchFlag("Types", "on");\r
137         ISearchService searchService = (ISearchService) PlatformUI.getWorkbench().getService(ISearchService.class);\r
138         if (searchService != null)\r
139             searchService.performQuery(query, ResultBrowser.VIEW, false);\r
140     }\r
141 \r
142     @Override\r
143     public void dispose() {\r
144         disposed = true;\r
145         super.dispose();\r
146     }\r
147 \r
148     public boolean isDisposed() {\r
149         return disposed;\r
150     }\r
151 \r
152     @Override\r
153     public void setFocus() {\r
154         browser.setFocus();\r
155     }\r
156 \r
157     public org.eclipse.swt.browser.Browser getBrowser() {\r
158         return browser;\r
159     }\r
160 \r
161     public void setUrl(URL url) {\r
162         getBrowser().setUrl(url.toString());\r
163     }\r
164 \r
165     @Override\r
166     public void setContentDescription(String description) {\r
167         super.setContentDescription(description);\r
168     }\r
169 \r
170 }\r