blob: 91bed8d070ba1f12d8e9d18e5135d37dff2cbedb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.palette;
import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.tools.SelectionTool;
public class BPELSelectionTool extends SelectionTool {
public BPELSelectionTool() {
super();
}
/**
* The following method is a workaround for a problem between
* the GEF SelectionTool and how AbstractTextEditor is created. The
* problem can be reproduced (without this workaround) as follows:
* Select an edit part on the canvas that has a property tab with
* a Text editor in it (e.g. Receive - Documentation). Select the tab
* as well to make sure the editor is created. Now select an edit part
* that does not have the same tab (so, no text editor - e.g. a Variable).
* Select back the first edit part. Check your log or console for a NPE.
*
* What happens underneath is: When you select the edit part (mouse down),
* the selection tool handles the MouseDown event activating its drag tracker
* and setting its current viewer. That selection causes a selection changed
* event to be triggered that ends up setting a new input for the properties view.
* The particular tab on the properties view needs a text editor and creates
* one. When creating the text editor, AbstractTextEditor (temporarily) sets the
* focus to the editor's parent composite. When that happens the edit part
* loses focus and the SelectionTool handles the FocusOut event by deactivating
* the drag tracker and setting its current viewer to null. When you release
* the mouse (mouse up) the selection tool tries to calculate the selection but
* it does not have a viewer anymore which causes the NPE.
*
* The following workaround tests if we are notifying the properties view for
* a selection change and ignores the FocusOut event in that case.
*/
@Override
protected boolean handleFocusLost() {
if (isSelectionChangeBeingBroadcasted()) return true;
return super.handleFocusLost();
}
protected boolean isSelectionChangeBeingBroadcasted() {
BPELEditor editor = (BPELEditor) ((DefaultEditDomain)getDomain()).getEditorPart();
return editor.getAdaptingSelectionProvider().isBroadcastingSelectionChange();
}
/**
* This workaround is similar to the one in handleFocusLost(). In this particular case
* there was also a timing issue related to when we received the button up event.
*/
@Override
protected boolean handleButtonUp(int button) {
if (isSelectionChangeBeingBroadcasted()) return true;
return super.handleButtonUp(button);
}
/**
* This workaround is similar to the one in handleFocusLost(). In this particular case
* there was also a timing issue related to when we received the button exit event.
*/
@Override
protected boolean handleViewerExited() {
if (isSelectionChangeBeingBroadcasted()) return true;
return super.handleViewerExited();
}
}