package rocks.inspectit.ui.rcp.handlers;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.handlers.HandlerUtil;
import rocks.inspectit.ui.rcp.editor.ISubView;
import rocks.inspectit.ui.rcp.editor.composite.AbstractCompositeSubView;
import rocks.inspectit.ui.rcp.editor.root.AbstractRootEditor;
import rocks.inspectit.ui.rcp.editor.search.ISearchExecutor;
import rocks.inspectit.ui.rcp.editor.search.OpenedSearchControlCache;
import rocks.inspectit.ui.rcp.editor.search.SearchControl;
/**
* The handler for activating the search box.
*
* @author Ivan Senic
*
*/
public class FindHandler extends AbstractHandler implements IHandler {
/**
* {@inheritDoc}
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
if (activeEditor instanceof AbstractRootEditor) {
AbstractRootEditor abstractRootEditor = (AbstractRootEditor) activeEditor;
ISearchExecutor searchExecutor = null;
ISubView searchSubView = null;
if (abstractRootEditor.getActiveSubView() instanceof ISearchExecutor) {
searchSubView = abstractRootEditor.getActiveSubView();
searchExecutor = (ISearchExecutor) abstractRootEditor.getActiveSubView();
} else {
searchSubView = findSearchExecutorView(abstractRootEditor.getSubView());
searchExecutor = (ISearchExecutor) searchSubView;
}
if ((null != searchExecutor) && (null != searchSubView)) {
ensureNoSearchOpened(abstractRootEditor.getSubView());
new SearchControl(searchExecutor, HandlerUtil.getActiveShellChecked(event), searchSubView.getControl(), activeEditor);
}
}
return null;
}
/**
* Ensures that no search control is opened for the given {@link ISubView}. If the view is
* composite, than it ensures than no child sub-view has control opened.
*
* @param subView
* SubView to check.
*/
private void ensureNoSearchOpened(ISubView subView) {
if (subView instanceof ISearchExecutor) {
SearchControl searchControl = OpenedSearchControlCache.getSearchControl((ISearchExecutor) subView);
if (null != searchControl) {
searchControl.closeControl();
}
} else if (subView instanceof AbstractCompositeSubView) {
AbstractCompositeSubView compositeSubView = (AbstractCompositeSubView) subView;
for (ISubView viewInCompositeSubView : compositeSubView.getSubViews()) {
ensureNoSearchOpened(viewInCompositeSubView);
}
}
}
/**
* Tries to find a {@link ISubView} that implement {@link ISearchExecutor} interface.
*
* @param subView
* {@link ISubView} to check.
* @return Sub-view.
*/
private ISubView findSearchExecutorView(ISubView subView) {
if (subView instanceof ISearchExecutor) {
return subView;
} else if (subView instanceof AbstractCompositeSubView) {
AbstractCompositeSubView compositeSubView = (AbstractCompositeSubView) subView;
for (ISubView viewInCompositeSubView : compositeSubView.getSubViews()) {
ISubView foundView = findSearchExecutorView(viewInCompositeSubView);
if (null != foundView) {
return foundView;
}
}
}
return null;
}
}