blob: f105e3d6bcda28503080ae91a44e9628ff8196b2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.commands;
import org.eclipse.core.runtime.Assert;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
/**
* @author mengbo
*/
public abstract class SourceViewerCommand extends Command {
protected StructuredTextEditor _editor;
private Document _document;
private Logger _log = PDPlugin.getLogger(SourceViewerCommand.class);
/**
*
*/
public SourceViewerCommand(String label, StructuredTextEditor editor) {
super();
_editor = editor;
IDOMSourceEditingTextTools tools = getSourceEditingTextTools();
_document = tools.getDOMDocument();
}
protected IDOMSourceEditingTextTools getSourceEditingTextTools() {
IDOMSourceEditingTextTools tools = (IDOMSourceEditingTextTools) _editor
.getAdapter(ISourceEditingTextTools.class);
return tools;
}
/**
* preExecute and postExecute is a pair. () SHOULD NOT throw any exception,
* if it throw any exception, it should catch itself and return false to
* indicate not continue.
*/
protected final boolean preExecute() {
int position = 0;
int length = 0;
ISelection selection = _editor.getTextViewer().getSelection();
if (selection instanceof TextSelection) {
position = ((TextSelection) selection).getOffset();
length = ((TextSelection) selection).getLength();
}
getModel().beginRecording(this, getLabel(), position, length);
getModel().aboutToChangeModel();
return true;
}
/**
* if preExecute() return true, then this method will always be called even
* preExecute()/doExecute() and postExecute() fail.
*/
protected final void postExecute() {
getModel().changedModel();
getModel().endRecording(this);
setSelection();
}
/**
* format the specified node in source code. Utility method that can be
* called by child classes
*
* @param node
*/
public final void formatNode(Node node) {
new HTMLFormatProcessorImpl().formatNode(node);
}
protected IDOMModel getModel() {
Assert.isTrue(_document != null && _document instanceof IDOMNode);
return ((IDOMNode) _document).getModel();
}
public final void execute() {
boolean ok = preExecute();
if (ok) {
try {
doExecute();
} catch (Exception ex) {
// "Error in command execution"
_log.error("Error.SourceViewerCommand.Execution", ex); //$NON-NLS-1$
} finally {
postExecute();
}
}
}
public abstract void doExecute();
public abstract void setSelection();
}