/**
* Copyright (c) 2013 by JP Moresmau
* This code is made available under the terms of the Eclipse Public License,
* version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html
*/
package net.sf.eclipsefp.haskell.ui.internal.editors.text;
import java.util.ResourceBundle;
import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.source.IOverviewRuler;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.projection.ProjectionViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.texteditor.TextOperationAction;
/**
* A viewer handling the toggle comment operation
*
* @author JP Moresmau
*
*/
public class HaskellViewer extends ProjectionViewer {
public static final int TOGGLE_COMMENT=ISourceViewer.INFORMATION+10;
private String[] defaultPrfs;
public HaskellViewer( final Composite parent, final IVerticalRuler ruler,
final IOverviewRuler overviewRuler, final boolean showsAnnotationOverview, final int styles ) {
super( parent, ruler, overviewRuler, showsAnnotationOverview, styles );
}
@Override
public void setDefaultPrefixes( final String[] defaultPrefixes, final String contentType ) {
super.setDefaultPrefixes( defaultPrefixes, contentType );
defaultPrfs=defaultPrefixes;
}
@Override
public void doOperation( final int operation ) {
if (TOGGLE_COMMENT==operation){
ITextSelection selection= (ITextSelection) getSelection();
IDocument document= getDocument();
try {
IRegion reg=document.getLineInformation( selection.getStartLine() );
String s=document.get( reg.getOffset(), reg.getLength() ).trim();
if (defaultPrfs!=null && defaultPrfs.length>0){
if (s.startsWith( defaultPrfs[0] )){
shift(true, false, true);
} else {
shift(true, true, true);
}
}
} catch (BadLocationException x) {
HaskellUIPlugin.log( x );
}
return;
}
super.doOperation( operation );
}
@Override
public boolean canDoOperation( final int operation ) {
if (TOGGLE_COMMENT==operation){
return true;
}
return super.canDoOperation( operation );
}
/**
* Create a standard text operation action
*/
public static TextOperationAction createTextOpAction( final TextEditor ed,final String actionIdName, final String resourcePrefix, final int targetId,
final String actionDefinitionId ) {
ResourceBundle bundle = HaskellUIPlugin.getDefault().getResourceBundle();
TextOperationAction action = new TextOperationAction( bundle, resourcePrefix + ".", ed, targetId ); //$NON-NLS-1$
action.setActionDefinitionId( actionDefinitionId );
ed.setAction( actionIdName, action );
ed.markAsStateDependentAction( actionIdName, true );
return action;
}
}