| /******************************************************************************* |
| * 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 |
| } |
| |
| } |