/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.xmind.core.ITopic;
import org.xmind.gef.IGraphicalViewer;
import org.xmind.gef.part.IPart;
import org.xmind.gef.ui.actions.IActionRegistry;
import org.xmind.gef.ui.actions.ISelectionAction;
import org.xmind.gef.ui.actions.PageAction;
import org.xmind.gef.ui.editor.IGraphicalEditorPage;
public abstract class SelectionRetargetAction extends PageAction implements
ISelectionAction, IPropertyChangeListener {
private IAction handler = null;
private String oldText = null;
private String oldToolTipText = null;
private ImageDescriptor oldImage = null;
private ImageDescriptor oldDisabledImage = null;
private ImageDescriptor oldHoverImage = null;
private boolean oldEnabled = false;
protected SelectionRetargetAction(IGraphicalEditorPage page) {
super(page);
}
protected SelectionRetargetAction(String id, IGraphicalEditorPage page) {
super(id, page);
}
public void run() {
if (isDisposed())
return;
if (handler != null) {
handler.run();
} else {
runWithNoHandler();
}
}
protected abstract void runWithNoHandler();
protected void setHandler(IAction handler) {
if (handler != this.handler) {
if (this.handler != null) {
this.handler.removePropertyChangeListener(this);
}
if (handler != null) {
handler.addPropertyChangeListener(this);
}
}
this.handler = handler;
update(null);
}
public void setText(String text) {
this.oldText = text;
update(TEXT);
}
public void setToolTipText(String toolTipText) {
this.oldToolTipText = toolTipText;
update(TOOL_TIP_TEXT);
}
public void setImageDescriptor(ImageDescriptor newImage) {
this.oldImage = newImage;
update(IMAGE);
}
public void setDisabledImageDescriptor(ImageDescriptor newImage) {
this.oldDisabledImage = newImage;
update(IMAGE);
}
public void setHoverImageDescriptor(ImageDescriptor newImage) {
this.oldHoverImage = newImage;
update(IMAGE);
}
public void setEnabled(boolean enabled) {
this.oldEnabled = enabled;
update(ENABLED);
}
protected void doSetText(String text) {
super.setText(text);
}
protected void doSetToolTipText(String toolTipText) {
super.setToolTipText(toolTipText);
}
protected void doSetImageDescriptor(ImageDescriptor image) {
super.setImageDescriptor(image);
}
protected void doSetDisabledImageDescriptor(ImageDescriptor image) {
super.setDisabledImageDescriptor(image);
}
protected void doSetHoverImageDescriptor(ImageDescriptor image) {
super.setHoverImageDescriptor(image);
}
protected void doSetEnabled(boolean enabled) {
super.setEnabled(enabled);
}
protected void update(String id) {
boolean textChanged = id == null || TEXT.equals(id);
boolean tooltipChanged = id == null || TOOL_TIP_TEXT.equals(id);
boolean imageChanged = id == null || IMAGE.equals(id);
boolean enabledChanged = id == null || ENABLED.equals(id);
if (textChanged) {
doSetText(handler == null ? oldText : handler.getText());
}
if (tooltipChanged) {
doSetToolTipText(handler == null ? oldToolTipText : handler
.getToolTipText());
}
if (imageChanged) {
doSetImageDescriptor(handler == null ? oldImage : handler
.getImageDescriptor());
doSetDisabledImageDescriptor(handler == null ? oldDisabledImage
: handler.getDisabledImageDescriptor());
doSetHoverImageDescriptor(handler == null ? oldHoverImage : handler
.getHoverImageDescriptor());
}
if (enabledChanged) {
doSetEnabled(handler == null ? oldEnabled : handler.isEnabled());
}
}
protected IAction getHandler() {
return handler;
}
public void setSelection(ISelection selection) {
setHandler(findHandler(selection));
}
private IAction findHandler(ISelection selection) {
if (selection == null || selection.isEmpty())
return null;
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
if (ss.size() != 1)
return null;
Object o = ss.getFirstElement();
if (o instanceof ITopic) {
IGraphicalViewer viewer = getViewer();
if (viewer == null)
return null;
IPart part = viewer.findPart(o);
if (part == null)
return null;
IActionRegistry actionRegistry = (IActionRegistry) part
.getAdapter(IActionRegistry.class);
if (actionRegistry == null)
return null;
IAction action = actionRegistry.getAction(getHandlerId());
if (action == this)
return null;
return action;
}
}
return null;
}
protected abstract String getHandlerId();
public void propertyChange(PropertyChangeEvent event) {
update(event.getProperty());
}
}