/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.query.relational; import java.util.Collections; import java.util.List; import javax.swing.event.TreeModelListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWTableDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryable; import org.eclipse.persistence.tools.workbench.utility.filters.Filter; import org.eclipse.persistence.tools.workbench.utility.node.Node; /** * The tree model for the QueryableTree. * Tree nodes are created when the method getChild() is called * */ final class QueryableTreeModel implements TreeModel { private DefaultMutableTreeNode rootDescriptor; private Filter queryableFilter; //a list of queryables for the root node which not a QueryableTreeNode private List queryableObjects; QueryableTreeModel(DefaultMutableTreeNode root) { this(root, Filter.NULL_INSTANCE); } QueryableTreeModel(DefaultMutableTreeNode root, Filter queryableFilter) { super(); this.rootDescriptor = root; this.queryableFilter = queryableFilter; this.queryableObjects = buildQueryableObjects(); } protected Filter getQueryableFilter() { return this.queryableFilter; } public Object getRoot() { return this.rootDescriptor; } MWTableDescriptor getDescriptor() { return (MWTableDescriptor)((DefaultMutableTreeNode)getRoot()).getUserObject(); } List buildQueryableObjects() { List list = getDescriptor().getQueryables(this.queryableFilter); Collections.sort(list, Node.DEFAULT_COMPARATOR); return list; } public Object getChild(Object parent, int index) { MWQueryable queryableObject; if (QueryableTreeNode.class.isAssignableFrom(parent.getClass())) { queryableObject = ((MWQueryable) ((QueryableTreeNode) parent).getUserObject()).subQueryableElementAt(index, this.queryableFilter); } else {//the root node(the descriptor) is the parent queryableObject = (MWQueryable) this.queryableObjects.get(index); } if (((DefaultMutableTreeNode) parent).getChildCount() > index) { return ((DefaultMutableTreeNode) parent).getChildAt(index); } QueryableTreeNode childNode = new QueryableTreeNode(queryableObject, !queryableObject.isLeaf(this.queryableFilter)); ((DefaultMutableTreeNode) parent).add(childNode); return childNode; } public int getChildCount(Object parent) { if (parent == getRoot()) return this.queryableObjects.size(); else { return ((QueryableTreeNode)parent).getQueryable().subQueryableElements(this.queryableFilter).size(); } } public boolean isLeaf(Object node) { if (node == getRoot()) return false; return ((QueryableTreeNode)node).isLeaf(this.queryableFilter); } public void valueForPathChanged(TreePath path, Object newValue) { //The tree will not change, so i do not need to implement this method } public int getIndexOfChild(Object parent, Object child) { if (parent == getRoot()) return this.queryableObjects.indexOf(((QueryableTreeNode)child).getQueryable()); else { List children =((QueryableTreeNode)child).getQueryable().subQueryableElements(this.queryableFilter); if (children != null && children.size() > 0) return children.indexOf(((QueryableTreeNode)child).getQueryable()); } return 0; } public void addTreeModelListener(TreeModelListener l) { //The tree will not change, so i don't need any listeners } public void removeTreeModelListener(TreeModelListener l) { //The tree will not change, so i don't need any listeners } }