/******************************************************************************* * Copyright (c) 2006, 2007 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ // This is taken from org.eclipse.pde.internal.ui.editor.text.PDESelectAnnotationRulerAction package net.sf.eclipsefp.haskell.ui.internal.editors.haskell; import java.util.Iterator; import java.util.ResourceBundle; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextOperationTarget; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.IAnnotationAccessExtension; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.IVerticalRulerInfo; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.ITextEditorExtension; import org.eclipse.ui.texteditor.SelectMarkerRulerAction; public class QuickFixAction extends SelectMarkerRulerAction { private boolean fIsEditable; private final ITextEditor fTextEditor; private Position fPosition; private final ResourceBundle fBundle; private final String fPrefix; public QuickFixAction( final ResourceBundle bundle, final String prefix, final ITextEditor editor, final IVerticalRulerInfo ruler ) { super( bundle, prefix, editor, ruler ); fTextEditor = editor; fBundle = bundle; fPrefix = prefix; } @Override public void run() { runWithEvent( null ); } /* * @see * org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event * ) * * @since 3.2 */ @Override public void runWithEvent( final Event event ) { if( fIsEditable ) { ITextOperationTarget operation = ( ITextOperationTarget )fTextEditor .getAdapter( ITextOperationTarget.class ); final int opCode = ISourceViewer.QUICK_ASSIST; if( operation != null && operation.canDoOperation( opCode ) ) { fTextEditor.selectAndReveal( fPosition.getOffset(), fPosition.getLength() ); operation.doOperation( opCode ); } return; } super.run(); } @Override public void update() { checkReadOnly(); if( fIsEditable ) { initialize( fBundle, fPrefix + "QuickFix." ); //$NON-NLS-1$ } super.update(); } private void checkReadOnly() { fPosition = null; fIsEditable = false; AbstractMarkerAnnotationModel model = getAnnotationModel(); IAnnotationAccessExtension annotationAccess = getAnnotationAccessExtension(); IDocument document = getDocument(); if( model == null ) { return; } @SuppressWarnings("unchecked") Iterator<Annotation> iter = model.getAnnotationIterator(); int layer = Integer.MIN_VALUE; while( iter.hasNext() ) { Annotation annotation = iter.next(); if( annotation.isMarkedDeleted() ) { continue; } int annotationLayer = annotationAccess!=null?annotationAccess.getLayer( annotation ):Integer.MIN_VALUE; if( annotationAccess != null ) { if( annotationLayer < layer ) { continue; } } Position position = model.getPosition( annotation ); if( !includesRulerLine( position, document ) ) { continue; } boolean isReadOnly = fTextEditor instanceof ITextEditorExtension && ( ( ITextEditorExtension )fTextEditor ).isEditorInputReadOnly(); if( !isReadOnly ) { fPosition = position; fIsEditable = true; layer = annotationLayer; continue; } } } }