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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
12 *******************************************************************************/
\r
13 package org.simantics.workbench.internal.contributions.search;
\r
15 import java.net.URL;
\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
35 * A very non-configurable Web browser view for search trim.
\r
37 * @author Tuukka Lehtonen
\r
39 public class BrowserView extends ViewPart {
\r
42 * ID of this view's plug-in extension.
\r
44 public static final String ID = "org.simantics.workbench.search.browser";
\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
53 public static final String LAST_QUERY_PROPERTY = "org.simantics.workbench.search.browser.lastQuery";
\r
55 private Browser browser;
\r
56 private boolean disposed;
\r
57 private ActiveModelsListener currentListener;
\r
60 public void createPartControl(Composite parent) {
\r
61 browser = new org.eclipse.swt.browser.Browser(parent, SWT.NONE);
\r
63 // Ensure the view receives some browser content even when no searches
\r
64 // have been performed yet.
\r
65 scheduleInitializeViewContent(false);
\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
75 private ISessionContextChangedListener sessionListener = new ISessionContextChangedListener() {
\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
85 trackActiveModels(newSession);
\r
91 private void trackActiveModels(Session session) {
\r
92 if (currentListener != null) {
\r
93 currentListener.dispose();
\r
94 currentListener = null;
\r
96 if (session != null) {
\r
98 LifecycleSupport lfs = session.peekService(LifecycleSupport.class);
\r
101 if (lfs.isClosed())
\r
104 ActiveModelsListener listener = new ActiveModelsListener(new Runnable() {
\r
106 public void run() {
\r
107 scheduleInitializeViewContent(true);
\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
118 protected void scheduleInitializeViewContent(final boolean force) {
\r
119 SWTUtils.asyncExec(browser, new Runnable() {
\r
121 public void run() {
\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
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
143 public void dispose() {
\r
148 public boolean isDisposed() {
\r
153 public void setFocus() {
\r
154 browser.setFocus();
\r
157 public org.eclipse.swt.browser.Browser getBrowser() {
\r
161 public void setUrl(URL url) {
\r
162 getBrowser().setUrl(url.toString());
\r
166 public void setContentDescription(String description) {
\r
167 super.setContentDescription(description);
\r