/** * Copyright (c) 2006, 2007 Borland Software Corporation * * 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: * bblajer - initial API and implementation */ package org.eclipse.gmf.runtime.lite.edit.parts.update; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EContentAdapter; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; public class UpdateManager extends EContentAdapter { private final EditPartViewer myViewer; public UpdateManager(EditPartViewer viewer) { myViewer = viewer; } public void notifyChanged(Notification msg) { super.notifyChanged(msg); if (msg.isTouch()) { return; } Collection<IUpdatableEditPart> affectedEditParts = findAffectedParts(msg); for(IUpdatableEditPart next : affectedEditParts) { if (next instanceof IExternallyUpdatableEditPart) { for (IExternallyUpdatableEditPart.ExternalRefresher nextExternalRefresher : ((IExternallyUpdatableEditPart) next).getExternalRefreshers()) { if (nextExternalRefresher.isAffectingEvent(msg)) { nextExternalRefresher.refresh(); } } } IUpdatableEditPart.Refresher refresher = next.getRefresher((EStructuralFeature)msg.getFeature(), msg); if (refresher != null) { refresher.refresh(); } } } private Collection<IUpdatableEditPart> findAffectedParts(Notification msg) { Object notifier = msg.getNotifier(); if (notifier instanceof EObject) { org.eclipse.gmf.runtime.notation.View view = getView((EObject) notifier); if (view != null) { EditPart affectedEditPart = (EditPart) myViewer.getEditPartRegistry().get(view); if (affectedEditPart instanceof IUpdatableEditPart) { if (msg.getFeature() == NotationPackage.eINSTANCE.getView_Visible() && affectedEditPart.getParent() instanceof IUpdatableEditPart) { return Arrays.asList((IUpdatableEditPart) affectedEditPart, (IUpdatableEditPart) affectedEditPart.getParent()); } return Collections.singleton((IUpdatableEditPart) affectedEditPart); } return Collections.emptyList(); } } return Collections.emptyList(); } private View getView(EObject offspring) { while (offspring != null && offspring instanceof View == false || isFiltered((View) offspring)) { offspring = offspring.eContainer(); } return (View) offspring; } protected boolean isFiltered(View view) { return myViewer.getEditPartRegistry().get(view) == null; } }