/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.actions; //import org.eclipse.core.runtime.IStatus; import java.util.ResourceBundle; import org.eclipse.jface.text.IFindReplaceTarget; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.texteditor.FindReplaceAction; import org.eclipse.ui.texteditor.IAbstractTextEditorHelpContextIds; import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds; import org.teiid.designer.ui.PluginConstants; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.UiPlugin; import org.teiid.designer.ui.common.actions.AbstractAction; import org.teiid.designer.ui.editors.ModelEditor; import org.teiid.designer.ui.editors.ModelObjectEditorPanel; /** * The <code>FindAction</code> class is the action that handles the global Find. * @since 8.0 */ public class FindAction extends AbstractAction implements IPartListener, FocusListener { /////////////////////////////////////////////////////////////////////////////////////////////// // FIELDS /////////////////////////////////////////////////////////////////////////////////////////////// private FindReplaceAction actEclipseFindReplaceAction; private boolean bHasFocus; private ModelObjectEditorPanel moepModelEditorPanel = null; private FocusEvent feMostRecentFocusGainEvent; /////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS /////////////////////////////////////////////////////////////////////////////////////////////// public FindAction() { super(UiPlugin.getDefault()); setImageDescriptor(UiPlugin.getDefault().getImageDescriptor(PluginConstants.Images.FIND)); } /////////////////////////////////////////////////////////////////////////////////////////////// // METHODS /////////////////////////////////////////////////////////////////////////////////////////////// /* (non-Javadoc) * @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection) */ @Override public void selectionChanged(IWorkbenchPart thePart, ISelection theSelection) { super.selectionChanged(thePart, theSelection); setEnableState( thePart ); } @Override protected void doRun() { FindReplaceAction actFindReplace = getFindReplaceAction(); actFindReplace.update(); actFindReplace.run(); } private void setEnableState(IWorkbenchPart part) { if (part != null && part instanceof ModelEditor) { ModelObjectEditorPanel panel = ((ModelEditor) part).getEditorContainer(); if (panel != null) { IFindReplaceTarget target = (IFindReplaceTarget) part.getAdapter(IFindReplaceTarget.class); if (target != null) { setEnabled(hasFocus() /* target.canPerformFind() */); } else { setEnabled(false); } } } else { setEnabled(false); } } private void setEnableState() { setEnableState( getCurrentWorkbenchPart() ); } private FindReplaceAction getFindReplaceAction() { ResourceBundle rb = ResourceBundle.getBundle( UiConstants.PLUGIN_ID + ".i18n" ); //$NON-NLS-1$ IWorkbenchPart workbenchPart = getCurrentWorkbenchPart(); actEclipseFindReplaceAction = new FindReplaceAction(rb, "ConstantEditor.title", workbenchPart); //$NON-NLS-1$ actEclipseFindReplaceAction .setHelpContextId(IAbstractTextEditorHelpContextIds.FIND_ACTION); actEclipseFindReplaceAction .setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_REPLACE); return actEclipseFindReplaceAction; } private IWorkbenchPart getCurrentWorkbenchPart() { IWorkbenchPage activePage = UiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage(); if (activePage != null) { IWorkbenchPart workbenchPart = activePage.getActiveEditor(); return workbenchPart; } // endif return null; } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart) */ @Override public void partActivated(IWorkbenchPart part) { if ( part instanceof ModelEditor ) { moepModelEditorPanel = ((ModelEditor)part).getEditorContainer(); if ( moepModelEditorPanel != null ) { moepModelEditorPanel.addFocusListener( this ); setEnableState(); } else { setEnabled(false); } } } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart) */ @Override public void partBroughtToTop(IWorkbenchPart part) { setEnableState(); } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart) */ @Override public void partClosed(IWorkbenchPart part) { setEnabled( false ); } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart) */ @Override public void partDeactivated(IWorkbenchPart part) { if ( part instanceof ModelEditor && moepModelEditorPanel == null) { moepModelEditorPanel = ((ModelEditor)part).getEditorContainer(); if ( moepModelEditorPanel != null ) { moepModelEditorPanel.removeFocusListener( this ); } } moepModelEditorPanel = null; setEnabled( false ); } /* (non-Javadoc) * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart) */ @Override public void partOpened(IWorkbenchPart part) { setEnableState(); } public boolean hasFocus() { return bHasFocus; } @Override public void focusLost( FocusEvent fe ) { // if this 'focusLost' is related to our current 'focusGain' widget, // then we are now in a no-focus state: if( (feMostRecentFocusGainEvent) != null && (fe.widget == feMostRecentFocusGainEvent.widget) ) { bHasFocus = false; } // reset enable state setEnableState(); } @Override public void focusGained( FocusEvent fe ) { bHasFocus = true; feMostRecentFocusGainEvent = fe; // reset enable state setEnableState(); } }