/******************************************************************************* * Copyright (c) 2009 Andrey Loskutov. * 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 * Contributor: Andrey Loskutov - initial API and implementation *******************************************************************************/ package de.loskutov.anyedit.actions; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IEditorActionDelegate; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IViewActionDelegate; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.eclipse.ui.handlers.HandlerUtil; import de.loskutov.anyedit.AnyEditToolsPlugin; import de.loskutov.anyedit.ui.editor.AbstractEditor; import de.loskutov.anyedit.ui.preferences.CombinedPreferences; import de.loskutov.anyedit.util.EclipseUtils; /** * @author Andrey */ public abstract class AbstractAction extends AbstractHandler implements IWorkbenchWindowActionDelegate, IViewActionDelegate, IEditorActionDelegate { protected AbstractEditor editor; private IFile file; private IWorkbenchWindow window; private IWorkbenchPart part; private CombinedPreferences combinedPreferences; public AbstractAction() { super(); } @Override public Object execute(final ExecutionEvent event) throws ExecutionException { window = HandlerUtil.getActiveWorkbenchWindow(event); if (window != null && isEnabled()) { part = HandlerUtil.getActivePart(event); run(new Action(){ @Override public String getId() { return event.getCommand().getId(); } }); } else { part = null; } return null; } protected IViewPart getViewPart() { return part instanceof IViewPart? (IViewPart)part : null; } @Override public void run(IAction action) { if(action == null){ return; } setEditor( createActiveEditorDelegate()); } protected AbstractEditor createActiveEditorDelegate() { return new AbstractEditor(EclipseUtils.getActiveEditor()); } @Override public void dispose() { if(editor != null){ editor.dispose(); editor = null; } window = null; part = null; } public void setEditor(AbstractEditor editor) { if(getEditor() != null){ getEditor().dispose(); } this.editor = editor; combinedPreferences = null; } @Override public void setActiveEditor(IAction action, IEditorPart targetEditor) { combinedPreferences = null; if(targetEditor == null){ return; } setEditor(new AbstractEditor(targetEditor)); } protected AbstractEditor getEditor() { return editor; } @Override public void init(IWorkbenchWindow window1) { window = window1; } @Override public void selectionChanged(IAction action, ISelection selection) { // unused } /** * @return could return null, if we do not have associated file and operating on * editor inputs instead */ public IFile getFile() { IFile myFile = file; if(myFile == null && getEditor() != null){ myFile = getEditor().getIFile(); } return myFile; } /** * @param file to perform operation on */ public void setFile(IFile file) { this.file = file; combinedPreferences = null; } /** * @return may be null if this action is not yet initialized */ public IWorkbenchWindow getWindow(){ return window; } @Override public final void init(IViewPart view) { this.part = view; } public CombinedPreferences getCombinedPreferences() { if(combinedPreferences != null){ return combinedPreferences; } IFile file1 = getFile(); IScopeContext context = null; if (file1 != null) { IProject project = file1.getProject(); if (project != null) { context = new ProjectScope(project); } } combinedPreferences = new CombinedPreferences(context, AnyEditToolsPlugin.getDefault().getPreferenceStore()); return combinedPreferences; } }