blob: 938f87139cb7993ab8e29fdba0439422cda5dc27 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Tom Seidel, Remus Software
* 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:
* Tom Seidel - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.htmltext.commands;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import org.eclipse.mylyn.htmltext.HtmlComposer;
import org.eclipse.mylyn.htmltext.model.TriState;
/**
* A command is a wrapper for a JavaScript command which is executed in the context of a {@link HtmlComposer}. It can
* has a state (see {@link TriState} )which is calculated by the {@link HtmlComposer} if possible.
*
* @author Tom Seidel <tom.seidel@remus-software.org>
*/
public abstract class Command {
protected HtmlComposer composer;
private TriState state;
protected PropertyChangeSupport listeners = new PropertyChangeSupport(this);
public void execute() {
composer.execute(this);
}
public Object executeWithReturn() {
return composer.executeWithReturn(this);
}
public abstract String getCommandIdentifier();
protected String getCommandDefinitionStub() {
return "";
}
/**
* Returns the "native" JavaScript command which executed against a {@link HtmlComposer}
*
* @return the command to execute
*/
public String getCommand() {
return "integration.executeCommand('" + getCommandIdentifier() + "');";
}
/**
* Returns the current state of the command. Can change if the selected dom node within the editor changes
*
* @return
*/
public TriState getState() {
return state;
}
/**
* Sets the state of the command. It's not intended that clients are setting the state.
*
* @param state
* the state to set
*/
public void setState(TriState state) {
TriState oldValue = this.state;
this.state = state;
firePropertyChange("state", oldValue, state);
}
public void addPropertyChangeListener(final PropertyChangeListener l) {
if (l == null) {
throw new IllegalArgumentException();
}
listeners.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(final PropertyChangeListener l) {
listeners.removePropertyChangeListener(l);
}
protected void firePropertyChange(final String prop, final Object old, final Object newValue) {
if (listeners.hasListeners(prop)) {
listeners.firePropertyChange(prop, old, newValue);
}
}
public void setComposer(HtmlComposer composer) {
this.composer = composer;
if (trackCommand()) {
composer.trackCommand(this);
}
}
/**
* Indicates whether the commands state should be set by the {@link HtmlComposer}. If the editor should track this
* event the underlying ckeditor must be a command defined which has the same id like in
* {@link #getCommandIdentifier()}.
*
* @return <code>true</code> if the composer should set changes to the commands state, else <code>false</code>.
*/
protected boolean trackCommand() {
return true;
}
public void dispose() {
// does nothing by default
}
}