/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.editor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.jboss.tools.common.core.resources.XModelObjectEditorInput; import org.jboss.tools.common.editor.NullEditorPart; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IReusableEditor; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.SubActionBars; import org.eclipse.ui.internal.part.NullEditorInput; import org.eclipse.ui.part.EditorPart; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.part.Page; import org.eclipse.ui.part.WorkbenchPart; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.util.IEditorWrapper; public class EditorPartWrapper extends EditorPart implements IReusableEditor, IEditorWrapper { public static final String EDITOR_ID = "org.jboss.tools.common.model.ui.editor.EditorPartWrapper"; //$NON-NLS-1$ IEditorPart editor; String entity = null; public IEditorInput getEditorInput() { return super.getEditorInput(); } public IEditorSite getEditorSite() { return super.getEditorSite(); } public void gotoMarker(IMarker marker) { if(editor != null) { try { Class editorClass = editor.getClass(); Method method = editorClass.getMethod("gotoMarker",new Class[]{IMarker.class}); //$NON-NLS-1$ method.setAccessible(true); method.invoke(editor,new Object[]{marker}); } catch(NoSuchMethodException e1) { ignore(); } catch(IllegalAccessException e2) { ignore(); } catch(InvocationTargetException e3) { ModelUIPlugin.getPluginLog().logError(e3); } } } void ignore() { //do nothing } public void init(IEditorSite site, IEditorInput input) throws PartInitException { input = XModelObjectEditorInput.checkInput(input); if(input instanceof NullEditorInput) { entity = ""; //$NON-NLS-1$ editor = new NullEditorPart(); editor.init(site, input); setSite(site); super.setInput(input); return; } entity = computeEntity(input); EditorPartWrapperExtension extension = EditorPartWrapperExtension.getInstance(); EditorPartFactory f = extension.getFactory(entity); editor = f.createEditorPart(); if(editor != null) { ((WorkbenchPart)editor).setInitializationData(f.getConfigurationElement(), "", null); //$NON-NLS-1$ } editor.init(site, input); setSite(site); editor.addPropertyListener(new PCL()); super.setInput(input); } public void setInput(IEditorInput input) { super.setInput(input); if(editor != null) { editor.dispose(); editor = null; } if(parent != null && !parent.isDisposed()) { Control[] cs = parent.getChildren(); for (int i = 0; i < cs.length; i++) { if(!cs[i].isDisposed()) cs[i].dispose(); } } try { init((IEditorSite)getSite(), input); } catch (PartInitException e) { ModelUIPlugin.getPluginLog().logError(e); return; } if(parent != null && !parent.isDisposed()) { createPartControl(parent); } if(wrapper != null) { IContentOutlinePage outline = (IContentOutlinePage)editor.getAdapter(IContentOutlinePage.class); wrapper.setOutline(outline); if(outline instanceof Page) { ((SubActionBars)wrapper.getSite().getActionBars()).dispose(); ((Page)outline).init(wrapper.getSite()); wrapper.getSite().getActionBars().updateActionBars(); Control[] cs = wrapper.control.getChildren(); for (int i = 0; i < cs.length; i++) { if(!cs[i].isDisposed()) cs[i].dispose(); } outline.createControl(wrapper.control); outline.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); wrapper.control.update(); wrapper.control.layout(); wrapper.control.getParent().update(); wrapper.control.getParent().layout(); wrapper.control.getParent().getParent().update(); wrapper.control.getParent().getParent().layout(); ((SubActionBars)wrapper.getSite().getActionBars()).getToolBarManager().update(true); } } } static String DEFAULT_ENTITY = "xml"; //$NON-NLS-1$ private String computeEntity(IEditorInput input) { if(!(input instanceof IModelObjectEditorInput)) return DEFAULT_ENTITY; IModelObjectEditorInput i = (IModelObjectEditorInput)input; XModelObject o = i.getXModelObject(); if(o == null) return DEFAULT_ENTITY; EditorPartWrapperExtension extension = EditorPartWrapperExtension.getInstance(); EditorPartFactory f = extension.getFactory(o.getModelEntity().getName()); if(f == null) return DEFAULT_ENTITY; return o.getModelEntity().getName(); } public void addPropertyListener(IPropertyListener l) { super.addPropertyListener(l); if(editor != null) editor.addPropertyListener(l); } Composite parent; public void createPartControl(Composite parent) { this.parent = parent; if(editor != null) editor.createPartControl(parent); parent.layout(); } public void dispose() { if(editor != null) { editor.dispose(); editor = null; } super.dispose(); } public IWorkbenchPartSite getSite() { return (editor == null || true ) ? super.getSite() : editor.getSite(); } public String getTitle() { if(editor != null && !super.getTitle().equals(editor.getTitle())) { String title = editor.getTitle(); setPartName(title); } return super.getTitle(); } public Image getTitleImage() { return (editor == null) ? super.getTitleImage() : editor.getTitleImage(); } public String getTitleToolTip() { return (editor == null) ? super.getTitleToolTip() : editor.getTitleToolTip(); } public void removePropertyListener(IPropertyListener l) { super.removePropertyListener(l); if(editor != null) editor.removePropertyListener(l); } public void setFocus() { if(editor != null) editor.setFocus(); } COPWrapper wrapper = null; public Object getAdapter(Class adapter) { if(editor == null) { return super.getAdapter(adapter); } if(adapter != null && adapter.isAssignableFrom(IContentOutlinePage.class)) { if(wrapper != null) return wrapper; wrapper = new COPWrapper(); IContentOutlinePage outline = (IContentOutlinePage)editor.getAdapter(adapter); wrapper.setOutline(outline); return wrapper; } return editor.getAdapter(adapter); } public void doSave(IProgressMonitor monitor) { if(editor != null) editor.doSave(monitor); } public void doSaveAs() { if(editor != null) editor.doSaveAs(); } public boolean isDirty() { return (editor != null && editor.isDirty()); } public boolean isSaveAsAllowed() { return (editor != null && editor.isSaveAsAllowed()); } public boolean isSaveOnCloseNeeded() { return (editor != null && editor.isSaveOnCloseNeeded()); } public IEditorPart getEditor() { return editor; } public String getEntity() { return entity; } class PCL implements IPropertyListener { public void propertyChanged(Object source, int i) { if(i == IEditorPart.PROP_INPUT && getEditorInput() != editor.getEditorInput()) { EditorPartWrapper.super.setInput(editor.getEditorInput()); } firePropertyChange(i); } } } class COPWrapper extends ContentOutlinePage { IContentOutlinePage outline; Composite control; private ArrayList<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>(); public COPWrapper() {} public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.add(listener); if(outline != null) outline.addSelectionChangedListener(listener); } public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.remove(listener); if(outline != null) outline.removeSelectionChangedListener(listener); } public void setOutline(IContentOutlinePage outline) { this.outline = outline; if(outline != null) for (ISelectionChangedListener l: selectionChangedListeners) { outline.addSelectionChangedListener(l); } } public void init(IPageSite pageSite) { super.init(pageSite); if(outline instanceof Page) { ((Page)outline).init(pageSite); } } public Control getControl() { return control; } public void createControl(Composite parent) { control = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 0; control.setLayout(layout); control.setLayoutData(new GridData(GridData.FILL_BOTH)); if(outline != null) { outline.createControl(control); outline.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); } } public ISelection getSelection() { return outline != null ? outline.getSelection() : null; } public void selectionChanged(SelectionChangedEvent event) { if(outline instanceof ContentOutlinePage) { ((ContentOutlinePage)outline).selectionChanged(event); } } public void setFocus() { if(outline != null) outline.setFocus(); } public void setSelection(ISelection selection) { if(outline != null) outline.setSelection(selection); } public void dispose() { if(outline != null) outline.dispose(); if(control != null) { if(!control.isDisposed()) control.dispose(); control = null; } super.dispose(); } }