View Javadoc

1   // $Id:UsedTypesTreeModelAdapter.java 12 2008-02-18 23:04:22Z Michael Engelhardt $
2   /*
3    * xsAnalyzer - XML schema analyzing tool. Copyright (C) 2008 Michael Engelhardt
4    * 
5    * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
6    * License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later
7    * version.
8    * 
9    * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
10   * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11   * 
12   * You should have received a copy of the GNU General Public License along with this program; if not, write to the Free
13   * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14   */
15  /**
16   * 
17   */
18  package de.mindcrimeilab.xsanalyzer.model;
19  
20  import java.util.ArrayList;
21  import java.util.Collections;
22  import java.util.List;
23  import java.util.Map;
24  import java.util.Set;
25  import java.util.Vector;
26  
27  import javax.swing.event.TreeModelListener;
28  import javax.swing.tree.DefaultMutableTreeNode;
29  import javax.swing.tree.TreeModel;
30  import javax.swing.tree.TreePath;
31  
32  import org.apache.xerces.xs.XSObject;
33  import org.apache.xerces.xs.XSObjectList;
34  
35  import de.mindcrimeilab.xsanalyzer.util.DefaultMutableTreeNodeComparator;
36  import de.mindcrimeilab.xsanalyzer.util.NameComparator;
37  
38  /**
39   * @author Michael Engelhardt<me@mindcrime-ilab.de>
40   * @author $Author:Michael Engelhardt $
41   * @version $Revision:12 $
42   * 
43   */
44  public class UsedTypesTreeModelAdapter implements TreeModel {
45  
46      private final static String ROOT_NODE = "Used Types";
47  
48      private final Vector<TreeModelListener> treeModelListeners = new Vector<TreeModelListener>();
49  
50      private final Map<XSObject, ? extends XSObjectList> usedBy;
51  
52      private final List<DefaultMutableTreeNode> types;
53  
54      public UsedTypesTreeModelAdapter(Map<XSObject, ? extends XSObjectList> usage) {
55          usedBy = usage;
56          final Set<XSObject> keySet = usedBy.keySet();
57          types = new ArrayList<DefaultMutableTreeNode>(keySet.size());
58          for (XSObject xso : keySet) {
59              if (null != xso) {
60                  types.add(new DefaultMutableTreeNode(xso));
61              }
62          }
63          Collections.sort(types, new DefaultMutableTreeNodeComparator(new NameComparator()));
64      }
65  
66      /*
67       * (non-Javadoc)
68       * 
69       * @see javax.swing.tree.TreeModel#addTreeModelListener(javax.swing.event.TreeModelListener)
70       */
71      @Override
72      public void addTreeModelListener(TreeModelListener l) {
73          treeModelListeners.addElement(l);
74      }
75  
76      /*
77       * (non-Javadoc)
78       * 
79       * @see javax.swing.tree.TreeModel#getChild(java.lang.Object, int)
80       */
81      @Override
82      public Object getChild(Object parent, int index) {
83          Object child;
84          if (parent == UsedTypesTreeModelAdapter.ROOT_NODE) {
85              child = types.get(index);
86          }
87          else if (parent instanceof DefaultMutableTreeNode) {
88              DefaultMutableTreeNode tn = (DefaultMutableTreeNode) parent;
89              XSObjectList list = usedBy.get(tn.getUserObject());
90              child = list.item(index);
91          }
92          else {
93              child = null;
94          }
95          return child;
96      }
97  
98      /*
99       * (non-Javadoc)
100      * 
101      * @see javax.swing.tree.TreeModel#getChildCount(java.lang.Object)
102      */
103     @Override
104     public int getChildCount(Object parent) {
105         int count;
106         if (parent == UsedTypesTreeModelAdapter.ROOT_NODE) {
107             count = types.size();
108         }
109         else if (parent instanceof DefaultMutableTreeNode) {
110             DefaultMutableTreeNode tn = (DefaultMutableTreeNode) parent;
111             XSObjectList list = usedBy.get(tn.getUserObject());
112             count = list.getLength();
113         }
114         else {
115             count = 0;
116         }
117         return count;
118     }
119 
120     /*
121      * (non-Javadoc)
122      * 
123      * @see javax.swing.tree.TreeModel#getIndexOfChild(java.lang.Object, java.lang.Object)
124      */
125     @Override
126     public int getIndexOfChild(Object parent, Object child) {
127         int index = 0;
128         if (parent == UsedTypesTreeModelAdapter.ROOT_NODE) {
129             index = types.indexOf(child);
130         }
131         else if (parent instanceof DefaultMutableTreeNode) {
132             DefaultMutableTreeNode tn = (DefaultMutableTreeNode) parent;
133             XSObjectList list = usedBy.get(tn.getUserObject());
134             for (int i = 0; i < list.getLength(); ++i) {
135                 if (child.equals(list.item(i))) {
136                     index = i;
137                     break;
138                 }
139             }
140         }
141         else {
142             index = 0;
143         }
144         return index;
145     }
146 
147     /*
148      * (non-Javadoc)
149      * 
150      * @see javax.swing.tree.TreeModel#getRoot()
151      */
152     @Override
153     public Object getRoot() {
154         return UsedTypesTreeModelAdapter.ROOT_NODE;
155     }
156 
157     /*
158      * (non-Javadoc)
159      * 
160      * @see javax.swing.tree.TreeModel#isLeaf(java.lang.Object)
161      */
162     @Override
163     public boolean isLeaf(Object node) {
164         return 0 == getChildCount(node);
165     }
166 
167     /*
168      * (non-Javadoc)
169      * 
170      * @see javax.swing.tree.TreeModel#removeTreeModelListener(javax.swing.event.TreeModelListener)
171      */
172     @Override
173     public void removeTreeModelListener(TreeModelListener l) {
174         treeModelListeners.removeElement(l);
175     }
176 
177     /*
178      * (non-Javadoc)
179      * 
180      * @see javax.swing.tree.TreeModel#valueForPathChanged(javax.swing.tree.TreePath, java.lang.Object)
181      */
182     @Override
183     public void valueForPathChanged(TreePath path, Object newValue) {
184         System.out.println("*** valueForPathChanged : " + path + " --> " + newValue);
185     }
186 
187 }