Search is cleared when closing editor
diff --git a/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF
index 96473fa..8fcbaad 100644
--- a/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF
@@ -23,5 +23,6 @@
org.eclipse.core.databinding.property,
org.eclipse.rmf.reqif10.xhtml.edit,
com.google.guava,
- org.eclipse.help
+ org.eclipse.help,
+ org.eclipse.core.resources
Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java
index 7dc5df1..9c594b5 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java
@@ -13,7 +13,9 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.rmf.reqif10.ReqIF;
@@ -22,10 +24,13 @@
import org.eclipse.rmf.reqif10.search.filter.IFilter;
import org.eclipse.rmf.reqif10.search.filter.SimpleCompoundFilter;
import org.eclipse.rmf.reqif10.search.ui.ReqIFSearchUIPlugin;
+import org.eclipse.rmf.reqif10.search.ui.UsageSearchResult;
import org.eclipse.search.ui.ISearchPage;
import org.eclipse.search.ui.ISearchPageContainer;
import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search2.internal.ui.SearchView;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
@@ -37,6 +42,9 @@
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
@@ -48,6 +56,7 @@
*
* @author jastram
*/
+@SuppressWarnings("restriction")
public class ReqIFSearchPage extends DialogPage implements ISearchPage {
/**
@@ -64,6 +73,7 @@
/** A search always relates to a {@link ReqIF}. */
private ReqIF reqif;
+ private static IPartListener2 listener;
@Override
public void createControl(Composite parent) {
@@ -72,7 +82,7 @@
setControl(parent);
// Forbit use without a ReqIF.
- reqif = findRelevantReqif();
+ reqif = getReqifEditor() != null ? getReqifEditor().getReqif() : null;
if (reqif == null) {
createNoSearchMessage(parent);
return;
@@ -88,20 +98,23 @@
// Restore previous filters.
restoreFilter();
-
+
// The plugin help-id is broken.
PlatformUI
.getWorkbench()
.getHelpSystem()
.setHelp(parent,
"org.eclipse.rmf.reqif10.search.ui.reqifSearchHelp");
+
+ attachPartListener();
}
-
+
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
// Required, so that the correct help is shown.
- if (true) pane.setFocus();
+ if (true)
+ pane.setFocus();
}
private void createNoSearchMessage(Composite parent) {
@@ -173,11 +186,12 @@
}
private void restoreFilter() {
- SimpleCompoundFilter wrapperFilter = lastSearches.get(reqif);
- if (wrapperFilter == null) return;
-
+ SimpleCompoundFilter wrapperFilter = lastSearches.get(reqif);
+ if (wrapperFilter == null)
+ return;
+
or.setSelection(wrapperFilter.isOrFilter());
- and.setSelection(! wrapperFilter.isOrFilter());
+ and.setSelection(!wrapperFilter.isOrFilter());
for (IFilter filter : wrapperFilter.getFilters()) {
FilterPanel filterPanel = new FilterPanel(pane, reqif, filter);
@@ -189,34 +203,42 @@
/**
* Looks for an active ReqIF editor.
+ *
* @return the active ReqIF or null if none found.
*/
- private ReqIF findRelevantReqif() {
+ private Reqif10Editor getReqifEditor() {
IEditorPart editor = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (editor instanceof Reqif10Editor) {
- return ((Reqif10Editor) editor).getReqif();
+ return (Reqif10Editor) editor;
}
if (editor instanceof SpecificationEditor) {
- return ((SpecificationEditor) editor).getReqifEditor().getReqif();
+ return ((SpecificationEditor) editor).getReqifEditor();
}
return null;
}
- @SuppressWarnings("restriction")
@Override
public boolean performAction() {
SimpleCompoundFilter filter = getFilter();
// Only search if we have filters.
- if (filter == null || filter.getFilters().size() == 0) return false;
+ if (filter == null || filter.getFilters().size() == 0)
+ return false;
// Stores the current query as last query.
lastSearches.put(reqif, filter);
ISearchQuery query = new FilterSearchQuery(reqif, filter);
- // Actual search, as taken from org.eclipse.rmf.reqif10.search.ui.page
- org.eclipse.search2.internal.ui.SearchView searchView = null;
+ NewSearchUI.runQueryInForeground(new ProgressMonitorDialog(getShell()),
+ query);
+ getSearchView().showSearchResult(query.getSearchResult());
+ return true;
+ }
+
+ // Actual search, as taken from org.eclipse.rmf.reqif10.search.ui.page
+ private SearchView getSearchView() {
+ SearchView searchView = null;
try {
searchView = (org.eclipse.search2.internal.ui.SearchView) PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage()
@@ -224,16 +246,10 @@
} catch (final PartInitException e) {
ReqIFSearchUIPlugin.INSTANCE.log(e);
}
-
- NewSearchUI.runQueryInForeground(new ProgressMonitorDialog(getShell()),
- query);
- if (searchView != null) {
- searchView.showSearchResult(query.getSearchResult());
- }
- return true;
+ return searchView;
}
- /**
+ /**
* Saving the last search upon closing.
*/
@Override
@@ -248,7 +264,8 @@
* Retrieves the filters from the pane in a {@link SimpleCompoundFilter}.
*/
private SimpleCompoundFilter getFilter() {
- if (pane == null) return null;
+ if (pane == null)
+ return null;
ArrayList<IFilter> filters = new ArrayList<IFilter>();
for (Control control : pane.getChildren()) {
if (control instanceof FilterPanel) {
@@ -257,12 +274,80 @@
filters.add(filter);
}
}
-
+
return new SimpleCompoundFilter(filters, or.getSelection());
}
@Override
public void setContainer(ISearchPageContainer container) {
}
-
+
+ /**
+ * We attach a part listener to close related searches in the Search view.
+ * There is only one (static) PartListener, which is created lazily.
+ */
+ private void attachPartListener() {
+ // Don't do anything if it already exists.
+ if (listener != null) return;
+
+ listener = new IPartListener2() {
+ @Override
+ public void partClosed(IWorkbenchPartReference partRef) {
+ IWorkbenchPart part = partRef.getPart(false);
+ if (!(part instanceof Reqif10Editor)) {
+ return;
+ }
+
+ ReqIF closingReqif = ((Reqif10Editor) part).getReqif();
+
+ ISearchResult searchResult = getSearchView()
+ .getCurrentSearchResult();
+ if (searchResult instanceof UsageSearchResult) {
+ Set<Resource> keys = ((UsageSearchResult) searchResult)
+ .getSearchEntries().keySet();
+ for (Resource resource : keys) {
+ if (resource.getURI().equals(
+ closingReqif.eResource().getURI())) {
+ getSearchView().showEmptySearchPage(partRef.getId());
+ return;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void partVisible(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partInputChanged(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partHidden(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPartReference partRef) {
+ }
+
+ @Override
+ public void partActivated(IWorkbenchPartReference partRef) {
+ }
+ };
+
+ System.out.println("Attaching listener.");
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+ .addPartListener(listener);
+
+ }
+
}