/******************************************************************************* * 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.jsf.ui.navigator; import org.jboss.tools.common.model.XModel; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.event.XModelTreeEvent; import org.jboss.tools.common.model.impl.XModelImpl; import org.jboss.tools.common.model.ui.navigator.TreeViewerModelListenerImpl; import org.jboss.tools.jsf.model.JSFConstants; import org.jboss.tools.jsf.model.pv.JSFProjectTagLibs; import org.jboss.tools.jsf.model.pv.JSFProjectTreeConstants; import org.jboss.tools.jsf.model.pv.JSFProjectsRoot; import org.jboss.tools.jst.web.model.pv.WebProjectNode; import org.jboss.tools.jst.web.tld.model.TLDUtil; public class JsfProjectsTreeListener extends TreeViewerModelListenerImpl { public void nodeChanged(XModelTreeEvent event) { XModelObject source = event.getModelObject(); JSFProjectsRoot root = (JSFProjectsRoot)getProjectRoot(source.getModel()); if(root == null) return; if(!root.isLoaded()) { if(source.getFileType() != XModelObject.NONE) { super.updateNode(root); } return; } if(source.getModelEntity().getName().startsWith("FileWebApp")) { //$NON-NLS-1$ WebProjectNode n = getProjectRoot(source.getModel()); if(n != null) n.invalidate(); } else if(JSFProjectTagLibs.isTLDFile(source)) { invalidateTagLibs(source.getModel()); super.nodeChanged(event); } else { super.nodeChanged(event); } if(!(source instanceof WebProjectNode)) { WebProjectNode n = getProjectRoot(source.getModel()); if(n == null) return; XModelObject p = n.getTreeParent(source); if(p instanceof WebProjectNode) { ((XModelImpl)p.getModel()).fireNodeChanged(p, p.getPath()); } } } protected WebProjectNode getProjectRoot(XModel model) { return (WebProjectNode)model.getByPath("root:JSFProjects"); //$NON-NLS-1$ } public void structureChanged(XModelTreeEvent event) { if (viewer.getControl() == null || viewer.getControl().isDisposed()) return; XModelObject source = event.getModelObject(); JSFProjectsRoot root = (JSFProjectsRoot)getProjectRoot(source.getModel()); if(root == null || !root.isLoaded()) return; if(event.kind() == XModelTreeEvent.CHILD_ADDED) { XModelObject c = (XModelObject)event.getInfo(); String entity = c.getModelEntity().getName(); if("FilePROPERTIES".equals(c.getModelEntity().getName())) { //$NON-NLS-1$ invalidateBundles(source.getModel()); } else if(JSFProjectTagLibs.isTLDFile(c) || TLDUtil.isFaceletTaglib(c) || "FileSystemJar".equals(entity)) { //$NON-NLS-1$ invalidateTagLibs(source.getModel()); } else if(entity.startsWith(JSFConstants.ENT_FACESCONFIG)) { invalidateConfig(source.getModel()); } else if("JSFManagedBean".equals(entity) || "JSFManagedBean20".equals(entity)) { //$NON-NLS-1$ invalidateFolder(source.getModel(), JSFProjectTreeConstants.BEANS); } else if("JSFReferencedBean".equals(entity)) { //$NON-NLS-1$ invalidateFolder(source.getModel(), JSFProjectTreeConstants.BEANS); } else if("FileTiles".equals(entity)) { //$NON-NLS-1$ invalidateFolder(source.getModel(), "Tiles"); //$NON-NLS-1$ } else if("FileFolder".equals(entity)) { //$NON-NLS-1$ WebProjectNode n = getProjectRoot(source.getModel()); if(n != null) n.invalidate(); } } else if(event.kind() == XModelTreeEvent.CHILD_REMOVED) { String entity = source.getModelEntity().getName(); if(source.getFileType() > XModelObject.FILE) { WebProjectNode n = getProjectRoot(source.getModel()); if(n != null) n.invalidate(); return; } else if("FileSystems".equals(entity)) { //$NON-NLS-1$ invalidateTagLibs(source.getModel()); } else if("JSFManagedBeans".equals(entity) || "JSFManagedBeans20".equals(entity)) { //$NON-NLS-1$ invalidateFolder(source.getModel(), JSFProjectTreeConstants.BEANS); } else if("JSFReferencedBeans".equals(entity)) { //$NON-NLS-1$ invalidateFolder(source.getModel(), JSFProjectTreeConstants.BEANS); } } else if(event.kind() == XModelTreeEvent.STRUCTURE_CHANGED) { String entity = event.getModelObject().getModelEntity().getName(); if("FileSystemJar".equals(entity)) { //$NON-NLS-1$ invalidateTagLibs(source.getModel()); } } super.structureChanged(event); } private void invalidateBundles(XModel model) { invalidateFolder(model, JSFProjectTreeConstants.RESOURCE_BUNDLES); } private void invalidateTagLibs(XModel model) { invalidateFolder(model, JSFProjectTreeConstants.TAG_LIBRARIES); } private void invalidateConfig(XModel model) { invalidateFolder(model, JSFProjectTreeConstants.CONFIGURATION); invalidateFolder(model, JSFProjectTreeConstants.BEANS); } private void invalidateFolder(XModel model, String name) { WebProjectNode n = getProjectRoot(model); if(n == null) return; WebProjectNode b = (WebProjectNode)n.getChildByPath(name); b.invalidate(); } }