| author | nipkow | 
| Wed, 08 Mar 2023 08:10:22 +0100 | |
| changeset 77574 | c2603cc154fa | 
| parent 74015 | 12b1f4649ab1 | 
| permissions | -rw-r--r-- | 
| 3599 | 1 | /*************************************************************************** | 
| 74015 | 2 | Title: graphbrowser/TreeNode.java | 
| 3599 | 3 | Author: Stefan Berghofer, TU Muenchen | 
| 50473 | 4 | Options: :tabSize=4: | 
| 3599 | 5 | |
| 6 | This class contains methods for storing and manipulating directory | |
| 7 | trees (e.g. collapsing / uncollapsing directory branches). | |
| 8 | ***************************************************************************/ | |
| 9 | ||
| 74015 | 10 | package isabelle.graphbrowser; | 
| 3599 | 11 | |
| 12 | import java.awt.*; | |
| 13 | import java.util.*; | |
| 14 | ||
| 15 | ||
| 16 | public class TreeNode | |
| 17 | {
 | |
| 18 | int starty,endy,number; | |
| 19 | String name,path; | |
| 20 | ||
| 21 | Vector leaves=new Vector(10,10); | |
| 22 | boolean unfold=false; | |
| 23 | ||
| 24 | 	public void insertNode(String n,String d,String p,int num,boolean u) {
 | |
| 25 | 		if (d.length()==0) {
 | |
| 26 | leaves.addElement(new TreeNode(n,p,num)); | |
| 27 | unfold=unfold||u; | |
| 28 | 		} else {
 | |
| 29 | unfold=unfold||u; | |
| 30 | String str1,str2; | |
| 31 | 			if (d.indexOf('/')<0) {
 | |
| 32 | str1=d;str2=""; | |
| 33 | 			} else {
 | |
| 34 | 				str1=d.substring(0,d.indexOf('/'));
 | |
| 35 | 				str2=d.substring(d.indexOf('/')+1);
 | |
| 36 | } | |
| 37 | ||
| 38 | Enumeration e1=leaves.elements(); | |
| 39 | TreeNode nd=null; | |
| 40 | ||
| 41 | 			while (e1.hasMoreElements()) {
 | |
| 42 | TreeNode nd2=(TreeNode)(e1.nextElement()); | |
| 43 | 				if (nd2.name.equals(str1)) {
 | |
| 44 | nd=nd2;break; | |
| 45 | } | |
| 46 | } | |
| 47 | 			if (nd==null) {
 | |
| 48 | nd=new TreeNode(str1,"",-1); | |
| 49 | leaves.addElement(nd); | |
| 50 | } | |
| 51 | nd.insertNode(n,str2,p,num,u); | |
| 52 | } | |
| 53 | } | |
| 54 | ||
| 55 | 	public TreeNode(String n,String p,int num) {
 | |
| 56 | name=n; | |
| 57 | path=p; | |
| 58 | number=num; | |
| 59 | } | |
| 60 | ||
| 61 | 	public TreeNode(String n,String p,int num,boolean u) {
 | |
| 62 | this(n,p,num); | |
| 63 | unfold=u; | |
| 64 | } | |
| 65 | ||
| 66 | 	public int getNumber() { return number; }
 | |
| 67 | ||
| 68 | public TreeNode lookup(int y) | |
| 69 | 	{
 | |
| 70 | if (y>=starty && y<endy) return this; | |
| 71 | else | |
| 72 | if (unfold) | |
| 73 | for (int i=0;i<leaves.size();i++) | |
| 74 | 			{
 | |
| 75 | TreeNode t=((TreeNode)leaves.elementAt(i)).lookup(y); | |
| 76 | if (t!=null) return t; | |
| 77 | } | |
| 78 | return null; | |
| 79 | } | |
| 80 | ||
| 81 | public boolean select() | |
| 82 | 	{
 | |
| 83 | 		if (!leaves.isEmpty()) {
 | |
| 84 | if (unfold) collapse(); | |
| 85 | else unfold=true; | |
| 86 | return true; | |
| 87 | } | |
| 88 | return false; | |
| 89 | } | |
| 90 | ||
| 91 | public void collapse() | |
| 92 | 	{
 | |
| 93 | unfold=false; | |
| 74014 | 94 | /*Integer.valueOf | 
| 3599 | 95 | for(int i=0;i<leaves.size();i++) | 
| 96 | ((Tree)leaves.elementAt(i)).collapse(); | |
| 97 | */ | |
| 98 | } | |
| 99 | ||
| 100 | 	void collapsedNodes(Vector v) {
 | |
| 74014 | 101 | if (number>=0) v.addElement(Integer.valueOf(number)); | 
| 3599 | 102 | Enumeration e1=leaves.elements(); | 
| 103 | while (e1.hasMoreElements()) | |
| 104 | ((TreeNode)(e1.nextElement())).collapsedNodes(v); | |
| 105 | } | |
| 106 | ||
| 107 | 	public void collapsedDirectories(Vector v) {
 | |
| 108 | 		if (!unfold) {
 | |
| 109 | Vector v2=new Vector(10,10); | |
| 110 | v.addElement(new Directory(this,name,v2)); | |
| 111 | collapsedNodes(v2); | |
| 112 | 		} else {
 | |
| 113 | Enumeration e1=leaves.elements(); | |
| 114 | 			while (e1.hasMoreElements()) {
 | |
| 115 | TreeNode tn=(TreeNode)(e1.nextElement()); | |
| 116 | if (!tn.leaves.isEmpty()) | |
| 117 | tn.collapsedDirectories(v); | |
| 118 | } | |
| 119 | } | |
| 120 | } | |
| 121 | ||
| 122 | public Dimension draw(Graphics g,int x,int y,TreeNode t) | |
| 123 | 	{
 | |
| 11873 
38dc46b55d7e
Moved font settings from TreeNode to TreeBrowser.
 berghofe parents: 
9407diff
changeset | 124 | FontMetrics fm=g.getFontMetrics(g.getFont()); | 
| 3599 | 125 | int h=fm.getHeight(); | 
| 9407 | 126 | int e=(int) (h / 10) + 1; | 
| 127 | 		int down_x[]={x + e, x + h - e, x + (int)(h / 2)};
 | |
| 128 | 		int down_y[]={y + e, y + e, y + (int)(3 * h / 4) - e};
 | |
| 129 | 		int right_x[]={x + e, x + (int)(3 * h / 4) - e, x + e};
 | |
| 130 | 		int right_y[]={y + e, y + (int)(h / 2), y + h - e};
 | |
| 3599 | 131 | int dx=0; | 
| 132 | ||
| 133 | if (unfold) | |
| 134 | 		{
 | |
| 135 | g.setColor(Color.green); | |
| 136 | g.fillPolygon(down_x,down_y,3); | |
| 137 | g.setColor(Color.black); | |
| 6657 | 138 | g.drawString(name,x+h+4,y+fm.getAscent()); | 
| 3599 | 139 | starty=y;endy=y+h; | 
| 6657 | 140 | dx=Math.max(dx,x+h+4+fm.stringWidth(name)); | 
| 3599 | 141 | y+=h+5; | 
| 142 | for(int i=0;i<leaves.size();i++) | |
| 143 | 			{
 | |
| 6657 | 144 | Dimension d=((TreeNode)leaves.elementAt(i)).draw(g,x+h+4,y,t); | 
| 3599 | 145 | y=d.height; | 
| 146 | dx=Math.max(dx,d.width); | |
| 147 | } | |
| 148 | } | |
| 149 | else | |
| 150 | 		{
 | |
| 151 | g.setColor(leaves.isEmpty() ? Color.blue : Color.red); | |
| 152 | g.fillPolygon(right_x,right_y,3); | |
| 153 | if (this==t && leaves.isEmpty()) | |
| 154 | 			{
 | |
| 155 | g.setColor(Color.white); | |
| 6657 | 156 | g.fillRect(x+h+4,y,fm.stringWidth(name),h); | 
| 3599 | 157 | } | 
| 158 | g.setColor(Color.black); | |
| 6657 | 159 | g.drawString(name,x+h+4,y+fm.getAscent()); | 
| 3599 | 160 | starty=y;endy=y+h; | 
| 6657 | 161 | dx=Math.max(dx,x+h+4+fm.stringWidth(name)); | 
| 3599 | 162 | y+=h+5; | 
| 163 | } | |
| 164 | return new Dimension(dx,y); | |
| 165 | } | |
| 166 | } | |
| 167 | ||
| 168 |