/******************************************************************************* * 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.impl.trees; import java.util.*; import org.jboss.tools.common.meta.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.util.*; import org.jboss.tools.common.model.filesystems.FileSystemsHelper; import org.jboss.tools.common.model.filesystems.impl.*; public class FileSystemsTree extends DefaultSiftedTree { private XFilteredTreeConstraint[] constraints = new XFilteredTreeConstraint[0]; protected String prefix = createPrefix(); public FileSystemsTree() {} public void dispose() {} protected String createPrefix() { return "FileSystems$"; } public void setModel(XModel model) { this.model = model; XModelObject root = getRoot(); if(root instanceof FileSystemsImpl) { FileSystemsImpl fs = (FileSystemsImpl)root; fs.updateOverlapped(); } load(); } public XModelObject getRoot() { return FileSystemsHelper.getFileSystems(model); } private void load() { XMapping m = model.getMetaData().getMapping("FilteredTreeConstraints"); //$NON-NLS-1$ if(m == null) return; ArrayList<XFilteredTreeConstraint> l = new ArrayList<XFilteredTreeConstraint>(); String[] ks = m.getKeys(); for (int i = 0; i < ks.length; i++) { if(!isConstraintRelevant(ks[i])) continue; String v = m.getValue(ks[i]); XFilteredTreeConstraint c = null; try { c = (XFilteredTreeConstraint)ModelFeatureFactory.getInstance().createFeatureInstance(v); } catch (ClassCastException e) { ModelPlugin.getPluginLog().logError(e); } if(c == null) continue; c.update(model); l.add(c); } constraints = (XFilteredTreeConstraint[])l.toArray(new XFilteredTreeConstraint[l.size()]); } protected boolean isConstraintRelevant(String key) { return key.startsWith(prefix); } public boolean hasChildren(XModelObject object) { /// if(object.getFileType() == XModelObject.FILE && XModelObjectConstants.YES.equals(object.get("_hasErrors_"))) return false; for (int i = 0; i < constraints.length; i++) if(constraints[i].isHidingAllChildren(object)) return false; return super.hasChildren(object); } public XModelObject[] getChildren(XModelObject object) { if(!hasChildren(object)) return new XModelObject[0]; for (int i = 0; i < constraints.length; i++) if(constraints[i].isHidingSomeChildren(object)) return getNonHiddenChildren(object); return super.getChildren(object); } private XModelObject[] getNonHiddenChildren(XModelObject object) { ArrayList<XModelObject> l = new ArrayList<XModelObject>(); XModelObject[] os = object.getChildren(); for (int i = 0; i < os.length; i++) if(accepts(os[i])) l.add(os[i]); return l.toArray(new XModelObject[l.size()]); } private boolean accepts(XModelObject object) { for (int i = 0; i < constraints.length; i++) if(!constraints[i].accepts(object)) return false; return true; } /** * Tree may represent some model object with another model object * to build new hierarchy, e.g. bean object representing both * java file and managed bean in jsf tree. * @param object * @return */ public XModelObject getRepresentation(XModelObject object) { return object; } }