// Copyright (c) 2007-2008 by Leif Frenzel - see http://leiffrenzel.de // 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.refactoring.actions; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.HaskellEditor; import net.sf.eclipsefp.haskell.ui.internal.refactoring.RefInfo; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.texteditor.AbstractTextEditor; import org.eclipse.ui.texteditor.ITextEditor; abstract class RefAction extends AbstractHandler { final RefInfo info = new RefInfo(); private IEditorPart targetEditor; private ISelection selection; private boolean haveFile; abstract void openWizard(); @Override public Object execute( final ExecutionEvent event ) { IEditorPart editor = HandlerUtil.getActiveEditor( event ); setActiveEditor(null,editor); run(null); return null; } // interface methods of IEditorActionDelegate ///////////////////////////////////////////// public void run( final IAction action ) { if( !haveFile ) { refuse(); } else { if (targetEditor instanceof AbstractTextEditor){ selection = ((AbstractTextEditor)targetEditor).getSelectionProvider().getSelection(); } if( selection != null && selection instanceof ITextSelection ) { applySelection( ( ITextSelection )selection ); if( saveAll() ) { openWizard(); } } } } public void setActiveEditor( final IAction action, final IEditorPart editor ) { this.targetEditor = editor; haveFile = false; if( getFile() != null ) { haveFile = true; } } public void selectionChanged( final IAction action, final ISelection selection ) { this.selection = selection; } // helping functions //////////////////// private void applySelection( final ITextSelection textSelection ) { info.setOffset( textSelection.getOffset() ); int start = textSelection.getStartLine(); info.setLine( start ); info.setColumn( computeColumn( start, textSelection.getOffset() ) ); info.setText( textSelection.getText() ); info.setSourceFile( getFile() ); info.setTargetEditor( targetEditor ); } private int computeColumn( final int start, final int offset ) { int result = 0; if( targetEditor instanceof HaskellEditor ) { try { HaskellEditor haskellEditor = ( HaskellEditor )targetEditor; IDocument doc = haskellEditor.getDocument(); result = offset - doc.getLineOffset( start ); } catch( BadLocationException ex ) { // ignore and assume column zero } } return result; } private void refuse() { String title = UITexts.mkPointFree_refuseDlg_title; String message = UITexts.mkPointFree_refuseDlg_message; MessageDialog.openInformation( getShell(), title, message ); } Shell getShell() { Shell result = null; if( targetEditor != null ) { result = targetEditor.getSite().getShell(); } else { result = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); } return result; } private IFile getFile() { IFile result = null; if( targetEditor instanceof ITextEditor ) { ITextEditor editor = ( ITextEditor )targetEditor; IEditorInput input = editor.getEditorInput(); if( input instanceof IFileEditorInput ) { result = ( ( IFileEditorInput )input ).getFile(); } } return result; } private static boolean saveAll() { IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); return IDE.saveAllEditors( new IResource[] { workspaceRoot }, false ); } }