/******************************************************************************* * 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.ui.outline; import java.util.ArrayList; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.model.WorkbenchContentProvider; import org.jboss.tools.common.model.XFilteredTreeConstraint; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.XModelObjectCache; public class XModelObjectContentProvider extends WorkbenchContentProvider { XFilteredTreeConstraint[] filters = null; XModelObjectCache cache; private Viewer viewer = null; public void setRoot(XModelObjectCache cache) { if(isEqualObject(cache)) return; this.cache = cache; if(viewer != null) { viewer.refresh(); ((TreeViewer)viewer).expandToLevel(2); if(cache != null) viewer.setSelection(new StructuredSelection(cache.getObject())); } } private boolean isEqualObject(XModelObjectCache cache) { if(this.cache == null && cache == null) return true; if(this.cache == null || cache == null) return false; return (this.cache.getObject() == cache.getObject()); } public void addFilter(XFilteredTreeConstraint filter) { if(filters == null) { filters = new XFilteredTreeConstraint[]{filter}; } else { XFilteredTreeConstraint[] fs = new XFilteredTreeConstraint[filters.length + 1]; System.arraycopy(filters, 0, fs, 0, filters.length); fs[filters.length] = filter; filters = fs; } } public Object[] getChildren(Object element) { if(!(element instanceof XModelObject)) return new XModelObject[0]; XModelObject o = (XModelObject)element; XModelObject[] os = o.getChildren(); if(filters == null || os.length == 0) return os; if(isHidingAllChildren(o)) return new XModelObject[0]; if(!isHidingSomeChildren(o)) return os; ArrayList<XModelObject> l = new ArrayList<XModelObject>(); for (int i = 0; i < os.length; i++) if(accepts(os[i])) l.add(os[i]); return l.toArray(new XModelObject[0]); } public Object[] getElements(Object element) { XModelObject o = cache == null ? null : cache.getObject(); return (o == null) ? new Object[0] : new Object[]{o}; } public Object getParent(Object element) { if(!(element instanceof XModelObject)) return null; XModelObject o = (XModelObject)element; return o.getParent(); } private boolean isHidingAllChildren(XModelObject o) { if(filters == null) return false; for (int i = 0; i < filters.length; i++) if(filters[i].isHidingAllChildren(o)) return true; return false; } private boolean isHidingSomeChildren(XModelObject o) { if(filters == null) return false; for (int i = 0; i < filters.length; i++) if(filters[i].isHidingSomeChildren(o)) return true; return false; } private boolean accepts(XModelObject o) { if(filters == null) return true; for (int i = 0; i < filters.length; i++) if(filters[i].accepts(o)) return true; return false; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { super.inputChanged(viewer, oldInput, newInput); this.viewer = viewer; if(viewer instanceof TreeViewer) { ((TreeViewer)viewer).setAutoExpandLevel(2); } if(viewer == null || viewer.getControl() == null || viewer.getControl().isDisposed()) return; viewer.refresh(); if(viewer.getSelection() == null || viewer.getSelection().isEmpty()) { if(cache != null) viewer.setSelection(new StructuredSelection(cache.getObject())); } } public void dispose() { super.dispose(); viewer = null; filters = null; } }