/*
* Copyright (c) 2003-2004 Christopher Lenz and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Christopher Lenz - initial API and implementation
*
* $Id: UncommentAction.java,v 1.1 2004-09-02 18:11:50 jsurfer Exp $
*/
package net.sourceforge.phpeclipse.css.ui.internal.editor;
import java.util.ResourceBundle;
import net.sourceforge.phpeclipse.css.ui.internal.text.CssPartitionScanner;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRewriteTarget;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorExtension2;
import org.eclipse.ui.texteditor.TextEditorAction;
/**
* (Heavily inspired by the RemoveBlockComment class in JDT-UI)
*/
public class UncommentAction extends TextEditorAction {
// Constructors ------------------------------------------------------------
/**
* Creates a new instance.
*
* @param bundle the resource bundle
* @param prefix a prefix to be prepended to the various resource keys
* (described in ResourceAction
constructor), or
* null
if none
* @param editor the text editor
*/
public UncommentAction(ResourceBundle bundle, String prefix,
ITextEditor editor) {
super(bundle, prefix, editor);
}
// TextEditorAction Implementation -----------------------------------------
/**
* @see org.eclipse.jface.action.Action#run()
*/
public void run() {
if (!isEnabled()) {
return;
}
ITextEditor editor = getTextEditor();
if ((editor == null) || !ensureEditable(editor)) {
return;
}
ITextSelection selection = getCurrentSelection();
if (!isValidSelection(selection)) {
return;
}
IDocumentProvider docProvider = editor.getDocumentProvider();
IEditorInput input = editor.getEditorInput();
if (docProvider == null || input == null) {
return;
}
IDocument document = docProvider.getDocument(input);
if (document == null) {
return;
}
IRewriteTarget target = (IRewriteTarget)
editor.getAdapter(IRewriteTarget.class);
if (target != null) {
target.beginCompoundChange();
}
try {
ITypedRegion region = getBlockCommentRegion(document, selection);
if (region != null) {
int offset = region.getOffset();
document.replace(offset, 2, ""); //$NON-NLS-1$
document.replace(offset + region.getLength() - 4, 2,
""); //$NON-NLS-1$
}
} catch (BadLocationException e) {
// ignore
} finally {
if (target != null) {
target.endCompoundChange();
}
}
}
// Private Methods ---------------------------------------------------------
/**
* Ensures that the editor is modifyable. If the editor is an instance of
* ITextEditorExtension2
, its
* validateEditorInputState
method is called, otherwise, the
* result of isEditable
is returned.
*
* @param editor the editor to be checked
* @return true
if the editor is editable, false
* otherwise
*/
private boolean ensureEditable(ITextEditor editor) {
if (editor instanceof ITextEditorExtension2) {
ITextEditorExtension2 extension = (ITextEditorExtension2) editor;
return extension.validateEditorInputState();
}
return editor.isEditable();
}
/**
* Returns the block comment typed region enclosing the position at the end
* of selection
or null
if there is no block
* comment at this position.
*
* @param selection the caret position (the end of the selection is taken as
* the position)
* @return the block comment region at the selection's end, or
* null
*/
private ITypedRegion getBlockCommentRegion(IDocument document,
ITextSelection selection) {
try {
ITypedRegion region = document.getPartition(
selection.getOffset() + selection.getLength());
if (CssPartitionScanner.CSS_COMMENT.equals(region.getType())) {
return region;
}
} catch (BadLocationException e) {
// ignore
}
return null;
}
/**
* Returns the editor's selection, or null
if no selection can
* be obtained or the editor is null
.
*
* @return the selection of the action's editor, or null
*/
private ITextSelection getCurrentSelection() {
ITextEditor editor = getTextEditor();
if (editor != null) {
ISelectionProvider provider = editor.getSelectionProvider();
if (provider != null) {
ISelection selection = provider.getSelection();
if (selection instanceof ITextSelection) {
return (ITextSelection) selection;
}
}
}
return null;
}
/**
* Checks whether given selection is valid, i.e. neither null
* or empty.
*
* @param selection the selection to check
* @return true
if the selection is valid, false
* otherwise
*/
private boolean isValidSelection(ITextSelection selection) {
if (selection != null) {
return (!selection.isEmpty() && (selection.getLength() > 0));
}
return false;
}
}