/******************************************************************************* * 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.ui.editor; import java.lang.reflect.Method; import org.eclipse.core.expressions.PropertyTester; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.console.TextConsolePage; import org.eclipse.ui.part.IPage; import org.eclipse.ui.part.MessagePage; import org.eclipse.ui.part.PageBookView; import de.loskutov.anyedit.AnyEditToolsPlugin; import de.loskutov.anyedit.IAnyEditConstants; import de.loskutov.anyedit.util.EclipseUtils; public class EditorPropertyTester extends PropertyTester { public EditorPropertyTester() { super(); } @Override public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { if(receiver instanceof IWorkbenchPart) { if ("hasModifiableDocument".equals(property)) { return hasModifiableDocument((IWorkbenchPart)receiver, args, expectedValue); } if ("hasDocument".equals(property)) { return hasDocument((IWorkbenchPart)receiver, args, expectedValue); } if ("showOpenType".equals(property)) { return showOpenType((IWorkbenchPart)receiver, args, expectedValue); } } return false; } private static boolean showOpenType(IWorkbenchPart receiver, Object[] args, Object expectedValue) { boolean hide = !EclipseUtils.hasJDT() || AnyEditToolsPlugin.getDefault().getPreferenceStore().getBoolean( IAnyEditConstants.HIDE_OPEN_TYPE_ACTION); return !hide; } private static boolean hasModifiableDocument(IWorkbenchPart part, Object[] args, Object expectedValue) { if(!(part instanceof IEditorPart)){ return false; } AbstractEditor ae = new AbstractEditor((IEditorPart) part); return ae.isEditorInputModifiable() && ae.getDocument() != null; } private static boolean hasDocument(IWorkbenchPart part, Object[] args, Object expectedValue) { if(part instanceof IEditorPart){ AbstractEditor ae = new AbstractEditor(part); return ae.getDocument() != null; } if(!(part instanceof IViewPart)){ return false; } IViewPart vp =(IViewPart) part; if (vp instanceof PageBookView) { IPage page = ((PageBookView) vp).getCurrentPage(); ITextViewer viewer = getViewer(page); return viewer != null && viewer.getDocument() != null; } TextViewer viewer = (TextViewer) vp.getAdapter(TextViewer.class); if(viewer != null){ return viewer.getDocument() != null; } ISelectionProvider sp = vp.getViewSite().getSelectionProvider(); if(sp instanceof ITextViewer){ return ((ITextViewer) sp).getDocument() != null; } return false; } public static ITextViewer getViewer(IPage page) { if(page == null){ return null; } if(page instanceof TextConsolePage) { return ((TextConsolePage)page).getViewer(); } if(page.getClass().equals(MessagePage.class)){ // empty page placeholder return null; } try { /* * org.eclipse.cdt.internal.ui.buildconsole.BuildConsolePage does not * extend TextConsolePage, so we get access to the viewer with dirty tricks */ Method method = page.getClass().getDeclaredMethod("getViewer", null); method.setAccessible(true); if(ITextViewer.class.isAssignableFrom(method.getReturnType())) { return (ITextViewer) method.invoke(page, null); } } catch (Exception e) { // AnyEditToolsPlugin.logError("Can't get page viewer from the console page", e); } return null; } }