/******************************************************************************* * Copyright (c) 2004, 2005 Sybase, Inc. and others. * * 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 * * Contributors: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.gef.editparts.AbstractTreeEditPart; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.views.properties.IPropertySource; /** * This is the abstract base <code>TreeEditPart</code> for pageflow elements. */ public class PageflowElementTreeEditPart extends AbstractTreeEditPart implements Adapter { /** Image descriptor of tree item for the different edit parts */ private static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault() .getImageDescriptor("facesconfig/Pageflow_Page16.gif"); //$NON-NLS-1$ private static final ImageDescriptor IMG_NODE = EditorPlugin.getDefault() .getImageDescriptor("facesconfig/FacesConfig_Pageflow16.gif"); //$NON-NLS-1$ /** Property resource for shared property view */ private IPropertySource propertySource = null; /** notifer to pageflow element */ private Notifier target = null; /** * Returns the image for the pageflow element. * * @param element - * pageflow element, such as Begin, End, Page, and Action. * @return - the image for the pageflow element */ public static Image getImage(PageflowElement element) { ImageDescriptor imageDescriptor = null; if (element instanceof PageflowPage) { imageDescriptor = IMG_PAGE; } else { imageDescriptor = IMG_NODE; } if (null == imageDescriptor) { return null; } Image image = EditorPlugin.getDefault().getImageRegistry().get( imageDescriptor.toString()); if (null == image) { EditorPlugin.getDefault().getImageRegistry().put( imageDescriptor.toString(), imageDescriptor); image = EditorPlugin.getDefault().getImageRegistry().get( imageDescriptor.toString()); } return image; } /** * Creates a new PageflowElementTreeEditPart instance. * * @param pageflowElement - * create a new edit part according to the pageflow model */ public PageflowElementTreeEditPart(PageflowElement pageflowElement) { super(pageflowElement); } /* * (non-Javadoc) * * @see IAdaptable#getAdapter(Class) */ public Object getAdapter(Class key) { /* * override the default behavior defined in AbstractEditPart which would * expect the model to be a property sourced. instead the editpart can * provide a property source */ if (key == IPropertySource.class) { return getPropertySource(); } return super.getAdapter(key); } /* * (non-Javadoc) * * @see AbstractTreeEditPart#getImage() */ protected Image getImage() { return getImage(getPageflowElement()); } /* * (non-Javadoc) * * @see PageflowElementEditPart#getPropertySource() */ private IPropertySource getPropertySource() { if (propertySource == null) { propertySource = new PageflowElementPropertySource( getPageflowElement()); } return propertySource; } /* * (non-Javadoc) * * @see Adapter#getTarget() */ public Notifier getTarget() { return target; } /* * (non-Javadoc) * * @see AbstractTreeEditPart#getText() */ protected String getText() { return (null != getPageflowElement().getName() ? getPageflowElement() .getName() : "[unnamed]"); //$NON-NLS-1$ } /** * Returns the model as <code>PageflowElement</code>. * * @return - the model as <code>PageflowElement</code> */ public PageflowElement getPageflowElement() { return (PageflowElement) getModel(); } /* * (non-Javadoc) * * @see Adapter#isAdapterForType(Object) */ public boolean isAdapterForType(Object type) { return type.equals(getModel().getClass()); } /* * (non-Javadoc) * * @see Adapter#notifyChanged(Notification) */ public void notifyChanged(Notification notification) { int type = notification.getEventType(); switch (type) { case Notification.ADD: case Notification.ADD_MANY: case Notification.REMOVE: case Notification.REMOVE_MANY: case Notification.SET: if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) { refreshVisuals(); } else { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){ public void run() { refreshVisuals(); } }); } break; } } /* * (non-Javadoc) * * @see Adapter#setTarget(Notifier) */ public void setTarget(Notifier newTarget) { target = newTarget; } /* * (non-Javadoc) * * @see AbstractGraphicalEditPart#activate() */ public void activate() { if (isActive()) return; // start listening for changes in the model hookIntoPageflowElement(getPageflowElement()); super.activate(); } /* * (non-Javadoc) * * @see AbstractGraphicalEditPart#deactivate() */ public void deactivate() { if (!isActive()) return; // stop listening for changes in the model unhookFromPageflowElement(getPageflowElement()); super.deactivate(); } /** * Registers this edit part as a listener for change notifications to the * specified pageflow element. * * @param element - * the pagelfow element that should be observed for change * notifications */ protected void hookIntoPageflowElement(PageflowElement element) { if (null != element) { element.eAdapters().add(this); } } /** * Removes this edit part from the specified pageflow element. Thus, it will * no longe receive change notifications. * * @param element * -the pagelfow element that should not be observed */ protected void unhookFromPageflowElement(PageflowElement element) { if (null != element) { element.eAdapters().remove(this); } } }