/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.xml.ui.editor; import java.util.Collections; import java.util.EventObject; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.provider.INotifyChangedListener; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IWorkbenchWindow; import org.teiid.core.designer.event.EventObjectListener; import org.teiid.designer.core.notification.util.NotificationUtilities; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.diagram.ui.editor.DiagramController; import org.teiid.designer.diagram.ui.editor.DiagramEditor; import org.teiid.designer.mapping.choice.IChoiceObject; import org.teiid.designer.mapping.factory.ChoiceFactoryManager; import org.teiid.designer.mapping.factory.DefaultMappableTree; import org.teiid.designer.mapping.factory.IChoiceFactory; import org.teiid.designer.mapping.factory.IMappableTree; import org.teiid.designer.mapping.factory.TreeMappingAdapter; import org.teiid.designer.mapping.ui.UiPlugin; import org.teiid.designer.mapping.ui.choice.ChoicePanel; import org.teiid.designer.mapping.ui.editor.MappingDiagramController; import org.teiid.designer.metamodels.xml.XmlChoice; import org.teiid.designer.metamodels.xml.provider.XmlChoiceItemProvider; import org.teiid.designer.metamodels.xml.provider.XmlDocumentItemProviderAdapterFactory; import org.teiid.designer.transformation.ui.UiConstants; import org.teiid.designer.transformation.ui.actions.ITransformationDiagramActionConstants; import org.teiid.designer.ui.editors.ModelEditor; import org.teiid.designer.ui.editors.ModelEditorPage; import org.teiid.designer.ui.editors.ModelObjectEditorPage; import org.teiid.designer.ui.editors.MultiPageModelEditor; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * InputSetObjectEditorPage is the class for editing Transformation Objects. * * @since 8.0 */ public class XmlChoiceObjectEditorPage implements ModelObjectEditorPage, INotifyChangedListener, UiConstants, ITransformationDiagramActionConstants, IAdaptable, EventObjectListener { private static final String TITLE_TEXT = org.teiid.designer.mapping.ui.UiConstants.Util.getString("ChoicePanel.title.text"); //$NON-NLS-1$ private static final String TITLE_TOOLTIP = org.teiid.designer.mapping.ui.UiConstants.Util.getString("ChoicePanel.title.toolTip"); //$NON-NLS-1$ private static final String COLON = ": "; //$NON-NLS-1$ private static final String SLASH = " / "; //$NON-NLS-1$ private ChoicePanel pnlChoicePanel; private IChoiceObject icoChoiceObject; private ModelEditor parentModelEditor; /** * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#canClose() * @since 5.0.1 */ @Override public boolean canClose() { return true; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { pnlChoicePanel = new ChoicePanel( parent, icoChoiceObject ); // WHY DO WE NEED THIS LINE?: pnlChoicePanel.setBusinessObject( icoChoiceObject ); //Register to listen for Change Notifications ModelUtilities.addNotifyChangedListener( this ); } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#getControl() */ @Override public Control getControl() { return pnlChoicePanel; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#getTitle() */ @Override public String getTitle() { XmlDocumentItemProviderAdapterFactory xdipaf = new XmlDocumentItemProviderAdapterFactory(); XmlChoiceItemProvider ipChoiceItemProvider = (XmlChoiceItemProvider)xdipaf.createXmlChoiceAdapter(); String sChoiceText = ipChoiceItemProvider.getText( icoChoiceObject.getChoice() ); String sParentText = ModelUtilities.getEMFLabelProvider().getText( icoChoiceObject.getParent() ); return TITLE_TEXT + COLON + sParentText + SLASH + sChoiceText; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#getTitleToolTip() */ @Override public String getTitleToolTip() { return TITLE_TOOLTIP; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#getTitleImage() */ @Override public Image getTitleImage() { return null; } @Override public boolean isDirty() { return false; } /** * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#canEdit(java.lang.Object, org.eclipse.ui.IEditorPart) * @since 5.0.1 */ @Override public boolean canEdit(Object modelObject, IEditorPart editor) { // System.out.println("[XmlChoiceObjectEditorPage.canEdit] object is: " + modelObject ); //$NON-NLS-1$ // System.out.println("[XmlChoiceObjectEditorPage.canEdit] object class is: " + modelObject.getClass().getName() ); //$NON-NLS-1$ if ( modelObject != null && modelObject instanceof XmlChoice ) { // System.out.println("[XmlChoiceObjectEditorPage.canEdit] returning TRUE"); //$NON-NLS-1$ icoChoiceObject = getChoiceObjectForInput( modelObject ); if ( icoChoiceObject == null ) { // System.out.println("[XmlChoiceObjectEditorPage.canEdit] icoChoiceObject == NULL!!!!!"); //$NON-NLS-1$ } return true; } // System.out.println("[XmlChoiceObjectEditorPage.canEdit] returning FALSE"); //$NON-NLS-1$ return false; } public void setMappingAdapters() { // obtain the root tree node that is being displayed in the mapping diagram IWorkbenchWindow window = UiPlugin.getDefault().getCurrentWorkbenchWindow(); IEditorPart editorPart = window.getActivePage().getActiveEditor(); if ( editorPart instanceof ModelEditor ) { ModelEditorPage editorPage = (ModelEditorPage)((ModelEditor)editorPart).getCurrentPage(); if ( editorPage instanceof DiagramEditor ) { DiagramController controller = ((DiagramEditor) editorPage).getDiagramController(); if ( controller instanceof MappingDiagramController ) { // get the adapters from the diagram controller TreeMappingAdapter mapping = ((MappingDiagramController) controller).getMappingAdapter(); IMappableTree mappableTree = ((MappingDiagramController) controller).getMappableTree(); pnlChoicePanel.setMappingAdapters(mapping, mappableTree); } else { // need to get one somehow EObject docRoot = icoChoiceObject.getRoot(); TreeMappingAdapter mapping = new TreeMappingAdapter(docRoot); IMappableTree mappableTree = new DefaultMappableTree(docRoot); pnlChoicePanel.setMappingAdapters(mapping, mappableTree); } } } } /** * @See org.teiid.designer.ui.editors.ModelObjectEditor#edit(org.eclipse.emf.ecore.EObject) */ @Override public void edit( Object modelObject ) { icoChoiceObject = getChoiceObjectForInput( modelObject ); // jh fix for Defect 11991 pnlChoicePanel.setBusinessObject(icoChoiceObject); setMappingAdapters(); } private IChoiceObject getChoiceObjectForInput( Object modelObject ) { IChoiceObject ico = null; if ( modelObject instanceof EObject ) { EObject eo = (EObject)modelObject; IChoiceFactory icfFactory = ChoiceFactoryManager.getChoiceFactory( eo ); if ( icfFactory != null ) { ico = icfFactory.createChoiceObject( eo ); } } return ico; } public String getObjectText() { return null; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#deactivate() */ @Override public boolean deactivate() { //Unregister for Change Notifications ModelUtilities.removeNotifyChangedListener( this ); return true; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#addPropertyListener(org.eclipse.ui.IPropertyListener) */ @Override public void addPropertyListener(IPropertyListener listener) { } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#removePropertyListener(org.eclipse.ui.IPropertyListener) */ @Override public void removePropertyListener(IPropertyListener listener) { } /* (non-Javadoc) jhTODO: leave the notifyChanged listening * here in the controller (XmlChoiceObjectEditorPage). * @see org.eclipse.emf.edit.provider.INotifyChangedListener#notifyChanged(org.eclipse.emf.common.notify.Notification) */ @Override public void notifyChanged(Notification notification) { //// System.out.println("[XmlChoiceObjectEditorPage.notifyChanged] TOP" ); //$NON-NLS-1$ if( shouldProcessNotification(notification) && NotificationUtilities.isChanged(notification) ) { update(); } } private void update() { //// System.out.println("[XmlChoiceObjectEditorPage.update] TOP" ); //$NON-NLS-1$ // if( isActive ) { pnlChoicePanel.refreshFromBusinessObject(); // } } private boolean shouldProcessNotification(Notification notification) { //// final Object notifier = ModelerCore.getModelEditor().getChangedObject(notification); //// //Object changedFeature = notification.getFeature(); //// if( notifier != null && NotificationUtilities.isEObjectNotifier(notification) ) { //// EObject eObj = NotificationUtilities.getEObject(notification); //// // Respond to changes in the Current Mapping Root //// if(eObj instanceof TransformationMappingRoot) { //// TransformationMappingRoot notifierMappingRoot = (TransformationMappingRoot)eObj; //// if(notifierMappingRoot.equals(currentMappingRoot)) { //// return true; //// } //// } else if(eObj instanceof SqlTransformation) { //// SqlTransformation notifierSqlTransformation = (SqlTransformation)notifier; //// SqlTransformation currentSqlTransformation = (SqlTransformation)TransformationHelper.getMappingHelper(currentMappingRoot); //// if(notifierSqlTransformation!=null && notifierSqlTransformation.equals(currentSqlTransformation)) { //// return true; //// } //// } //// } return true; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#contributeToolbarActions(org.eclipse.jface.action.ToolBarManager) */ @Override public void contributeExportedActions( IMenuManager menu ) { // jhTODO: do we have any actions? I do not think so... if(menu == null) return; } /** * * @see org.teiid.designer.ui.editors.IEditorActionExporter#getAdditionalModelingActions(org.eclipse.jface.viewers.ISelection) * @since 5.0 */ @Override public List<IAction> getAdditionalModelingActions( ISelection selection ) { // jhTODO: do we have any actions? I do not think so... return Collections.EMPTY_LIST; } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditor#contributeToolbarActions(org.eclipse.jface.action.ToolBarManager) */ @Override public void contributeToolbarActions(ToolBarManager toolBarMgr) { // System.out.println("[XmlChoiceObjectEditorPage.contributeToolbarActions] TOP"); //$NON-NLS-1$ if(toolBarMgr == null) return; // System.out.println("[XmlChoiceObjectEditorPage.contributeToolbarActions] About to call the panel's contributeToobarActions"); //$NON-NLS-1$ pnlChoicePanel.contributeToolbarActions( toolBarMgr ); } /* (non-Javadoc) * @See org.teiid.designer.ui.editors.ModelObjectEditorPage#doSave() */ @Override public void doSave(boolean isClosing) { // there's no difference to this panel between isClosing true and false deactivate(); } @Override public Object getAdapter( Class key ) { // System.out.println("[TranformationObjectEditorPage.getAdapter]"); //$NON-NLS-1$ Object oResult = null; // if (key.equals(IFindReplaceTarget.class)) { // if ( hasFocus() ) { // oResult = getCurrentSqlEditor().getTextViewer().getFindReplaceTarget(); // } // } // // if ( StyledText.class.equals( key ) ) { // oResult = getTextWidget(); // } return oResult; } /** * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#updateReadOnlyState() * @since 4.2 */ @Override public void updateReadOnlyState() { } /* (non-Javadoc) * * @See org.teiid.designer.ui.editors.ModelObjectEditorPage#isEditingObject(java.lang.Object) * @since 4.2 */ @Override public boolean isEditingObject(Object modelObject) { if( icoChoiceObject != null && modelObject != null ) { IChoiceObject tempChoiceObject = getChoiceObjectForInput( modelObject ); if( tempChoiceObject != null && tempChoiceObject.equals(icoChoiceObject)) return true; } return false; } /** * * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#getEditableObject(java.lang.Object) * @since 4.2 */ @Override public Object getEditableObject(Object modelObject) { if (modelObject != null && modelObject instanceof XmlChoice) { return modelObject; } return null; } /** * * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#isResourceValid() * @since 4.2 */ @Override public boolean isResourceValid() { if( icoChoiceObject != null ) { ModelResource mr = ModelUtilities.getModelResourceForModelObject(icoChoiceObject.getParent()); if( mr != null ) return true; } return false; } /** * Method that handles Events from the SqlEditorPanel. * @param e the EventObject */ @Override public void processEvent(EventObject e) { } /** * Does nothing. * * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#initialize(org.teiid.designer.ui.editors.MultiPageModelEditor) * @since 5.0.1 */ @Override public void initialize(MultiPageModelEditor editor) { if( editor instanceof ModelEditor ) { this.parentModelEditor = (ModelEditor)editor; } } /** * Does nothing. * * @see org.teiid.designer.ui.editors.ModelObjectEditorPage#setOverride(org.teiid.designer.ui.editors.ModelObjectEditorPage) * @since 5.0.1 */ @Override public void setOverride(ModelObjectEditorPage editor) { } @Override public ModelEditor getParentModelEditor() { return this.parentModelEditor; } }