/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.views.palette; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties; import org.eclipse.core.runtime.Platform; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.texteditor.ITextEditor; import org.osgi.framework.Bundle; import org.jboss.tools.common.meta.action.SpecialWizard; import org.jboss.tools.common.meta.action.SpecialWizardFactory; import org.jboss.tools.common.meta.action.XActionInvoker; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.model.ui.dnd.ModelTransfer; import org.jboss.tools.common.model.ui.editor.EditorPartWrapper; public class PaletteCreator { public static final String PALETTE_GEF_ID = "org.jboss.tools.jst.web.ui"; //$NON-NLS-1$ IPalettePageAdapter palettePage; private IPaletteAdapter paletteAdapter = null; private Composite root = null; private Control palette = null; private IWorkbenchPart lastPart = null; private boolean lastPaletteEnabled = false; public PaletteCreator(IPalettePageAdapter palettePage) { this.palettePage = palettePage; } public Control createPartControlImpl(Composite parent) { paletteAdapter = createPaletteAdapter(); paletteAdapter.setPaletteContents(palettePage.getPaletteContents()); paletteAdapter.setPaletteViewPart(palettePage); root = new Composite(parent, SWT.NONE); root.setLayout(new FillLayout()); palette = paletteAdapter.createControl(root); return palette; } public void initActionBars() { paletteAdapter.initActionBars(); } public Control getControl() { return root; } private IPaletteAdapter createPaletteAdapter() { try { Bundle b = Platform.getBundle(PALETTE_GEF_ID); Class cls = b == null ? null : b.loadClass("org.jboss.tools.jst.web.ui.palette.PaletteAdapter"); //$NON-NLS-1$ if(cls != null) return (IPaletteAdapter)cls.newInstance(); } catch (ClassNotFoundException t) { //ignore } catch (InstantiationException e) { //ignore } catch (IllegalAccessException e) { //ignore } return new PaletteAdapter(); } public void dispose() { if (palette != null) { if (!palette.isDisposed()) palette.dispose(); palette = null; } if (root != null) { if (!root.isDisposed()) root.dispose(); root = null; } //TODO // getSite().getPage().removePartListener(this); if (paletteAdapter != null) paletteAdapter.dispose(); paletteAdapter = null; } public void setFocus() { if(palette != null && !palette.isDisposed()) palette.setFocus(); } public void partActivated(IWorkbenchPart part) { IEditorPart part1 = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); if (part1 instanceof IEditorPart) { paletteAdapter.setPaletteContents(new PaletteContents((IEditorPart)part1)); lastPaletteEnabled = true; paletteAdapter.setEnabled(lastPaletteEnabled); lastPart = part1; } else { paletteAdapter.setEnabled(false); } } public void partClosed(IWorkbenchPart part) { if (lastPart != null && palettePage.getPage().getActiveEditor() != lastPart) { lastPart = null; paletteAdapter.setPaletteContents(new PaletteContents(null)); paletteAdapter.setEnabled(lastPaletteEnabled = false); } } public ITextEditor getActiveTextEditor(){ IWorkbenchPage page = palettePage.getPage(); IEditorPart part = page.getActiveEditor(); if (part == null) return null; return getActiveTextEditor(part); } public void insertIntoEditor(XModelObject macro) { IWorkbenchPage page = palettePage.getPage(); IEditorPart part = page.getActiveEditor(); if (part == null) return; ITextEditor editor = getActiveTextEditor(part); /// It is not a text editor if(editor == null) return; /// Do we need a warning here? if(!editor.isEditable()) return; if(dropIntoEditor(editor, macro)) return; if(dropIntoEditor2(editor, macro)) return; //TODO implement a service /** String tagname = macro.getAttributeValue("name"); //$NON-NLS-1$ String startText = "" + macro.getAttributeValue("start text"); //$NON-NLS-1$ //$NON-NLS-2$ String endText = "" + macro.getAttributeValue("end text"); //$NON-NLS-1$ //$NON-NLS-2$ String newline = "" + macro.getAttributeValue("new line"); //$NON-NLS-1$ //$NON-NLS-2$ String reformat = "" + macro.getAttributeValue("automatically reformat tag body"); //$NON-NLS-1$ //$NON-NLS-2$ XModelObject parent = macro.getParent(); String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$ String libraryVersion = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_VERSION); //$NON-NLS-1$ String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$ String addTaglib = (parent == null) ? "" : parent.getAttributeValue("add taglib"); //$NON-NLS-1$ //$NON-NLS-2$ if (editor != null) { Properties properties = new Properties(); properties.setProperty(PaletteInsertHelper.PROPOPERTY_TAG_NAME, tagname); properties.setProperty(PaletteInsertHelper.PROPOPERTY_TAGLIBRARY_URI, uri); properties.setProperty(PaletteInsertHelper.PROPOPERTY_TAGLIBRARY_VERSION, libraryVersion); properties.setProperty(PaletteInsertHelper.PROPOPERTY_DEFAULT_PREFIX, defaultPrefix); if(startText != null) properties.setProperty(PaletteInsertHelper.PROPOPERTY_START_TEXT, startText); if(endText != null) properties.setProperty(PaletteInsertHelper.PROPOPERTY_END_TEXT, endText); properties.setProperty(PaletteInsertHelper.PROPOPERTY_REFORMAT_BODY, reformat); properties.setProperty(PaletteInsertHelper.PROPOPERTY_NEW_LINE, newline); properties.setProperty(PaletteInsertHelper.PROPOPERTY_ADD_TAGLIB, addTaglib); //TODO WARNING we cannot have here correct insert helper instance! PaletteInsertHelper.getInstance().insertIntoEditor( editor, properties ); page.activate(part); } */ } private boolean dropIntoEditor(ITextEditor editor, XModelObject macro) { try { Method m = editor.getClass().getMethod("runDropCommand", new Class[]{String.class, String.class}); //$NON-NLS-1$ if(m == null) return false; m.setAccessible(true); Properties p = new Properties(); p.setProperty("isDrag", "true"); //$NON-NLS-1$ //$NON-NLS-2$ XActionInvoker.invoke("CopyActions.Copy", macro, p); //$NON-NLS-1$ m.invoke(editor, new Object[]{ModelTransfer.MODEL, null}); return true; } catch (NoSuchMethodException ne) { return false; } catch (IllegalAccessException e) { ModelUIPlugin.getPluginLog().logError(e); return false; } catch (IllegalArgumentException e) { ModelUIPlugin.getPluginLog().logError(e); return false; } catch (InvocationTargetException e) { ModelUIPlugin.getPluginLog().logError(e); return false; } } private boolean dropIntoEditor2(ITextEditor editor, XModelObject macro) { SpecialWizard w = SpecialWizardFactory.createSpecialWizard("org.jboss.tools.jst.web.ui.internal.editor.outline.DefaultDropCommandRunner"); //$NON-NLS-1$ if(w == null) return false; Properties p = new Properties(); p.setProperty("isDrag", "true"); //$NON-NLS-1$ //$NON-NLS-2$ XActionInvoker.invoke("CopyActions.Copy", macro, p); //$NON-NLS-1$ p.setProperty("flavor", ModelTransfer.MODEL); //$NON-NLS-1$ p.put("textEditor", editor); //$NON-NLS-1$ w.setObject(p); int r = w.execute(); return r == 0; } public boolean isEnabled() { return lastPart != null; //lastTextEditor != null; } // TODO: NLS support private static final String ERROR_GETTING_ACTIVE_EDITOR = "Error while getting active text editor"; // FIXME: Rewrite without reflection private ITextEditor getActiveTextEditor(IWorkbenchPart part) { ITextEditor editor = null; if (part instanceof EditorPartWrapper) { part = ((EditorPartWrapper)part).getEditor(); } if (part instanceof ITextEditor) { editor = (ITextEditor)part; } else if (part instanceof MultiPageEditorPart) { try { Method m = MultiPageEditorPart.class.getDeclaredMethod("getActiveEditor", new Class[0]); //$NON-NLS-1$ m.setAccessible(true); Object o = m.invoke(part, new Object[0]); if (o instanceof ITextEditor) { editor = (ITextEditor)o; } } catch (NoSuchMethodException t) { ModelUIPlugin.getPluginLog().logError(ERROR_GETTING_ACTIVE_EDITOR, t); } catch (IllegalArgumentException t) { ModelUIPlugin.getPluginLog().logError(ERROR_GETTING_ACTIVE_EDITOR, t); } catch (IllegalAccessException t) { ModelUIPlugin.getPluginLog().logError(ERROR_GETTING_ACTIVE_EDITOR, t); } catch (InvocationTargetException t) { ModelUIPlugin.getPluginLog().logError(ERROR_GETTING_ACTIVE_EDITOR, t); } } return editor; } /** * Used for test * @return */ public IPaletteAdapter getAdapter() { return paletteAdapter; } }