/******************************************************************************* * 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(); } }