/******************************************************************************* * 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 { /** * the structured text editor containing the viewer */ protected final StructuredTextEditor _editor; private Document _document; private Logger _log = PDPlugin.getLogger(SourceViewerCommand.class); /** * @param label * @param editor */ public SourceViewerCommand(String label, StructuredTextEditor editor) { super(); _editor = editor; IDOMSourceEditingTextTools tools = getSourceEditingTextTools(); _document = tools.getDOMDocument(); } /** * @return the text tools */ 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. * @return true if preExec succeeded */ 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); } /** * @return the dom model */ 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(); } } } /** * execute */ public abstract void doExecute(); /** * set the selection */ public abstract void setSelection(); }