1 21 22 package org.armedbear.j.mail; 23 24 import java.awt.Color ; 25 import java.awt.Component ; 26 import java.awt.Graphics ; 27 import java.awt.Point ; 28 import java.awt.event.InputEvent ; 29 import java.awt.event.MouseEvent ; 30 import java.awt.event.MouseListener ; 31 import java.util.Enumeration ; 32 import javax.swing.JTree ; 33 import javax.swing.tree.DefaultMutableTreeNode ; 34 import javax.swing.tree.DefaultTreeCellRenderer ; 35 import javax.swing.tree.TreePath ; 36 import javax.swing.tree.TreeSelectionModel ; 37 import org.armedbear.j.Buffer; 38 import org.armedbear.j.Display; 39 import org.armedbear.j.Editor; 40 import org.armedbear.j.Frame; 41 import org.armedbear.j.NavigationComponent; 42 import org.armedbear.j.Utilities; 43 44 public final class FolderTree extends JTree implements NavigationComponent, 45 MouseListener 46 { 47 private final Frame frame; 48 49 private FolderTree(Frame frame) 50 { 51 super(FolderTreeModel.getDefaultModel()); 52 this.frame = frame; 53 getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 54 setRootVisible(false); 55 toggleClickCount = 1; 56 setCellRenderer(new TreeCellRenderer (this)); 57 addMouseListener(this); 58 } 59 60 public static FolderTree getInstance(Frame frame) 61 { 62 Object obj = frame.getFolderTree(); 63 if (obj instanceof FolderTree) 64 return (FolderTree) obj; 65 FolderTree tree = new FolderTree(frame); 66 frame.setFolderTree(tree); 67 return tree; 68 } 69 70 public void refresh() {} 71 72 public void updatePosition() 73 { 74 int row = -1; 75 final Buffer buf = frame.getCurrentEditor().getBuffer(); 76 MailboxURL url = null; 77 if (buf instanceof Mailbox) 78 url = ((Mailbox)buf).getUrl(); 79 else if (buf instanceof MessageBuffer) { 80 Mailbox mailbox = ((MessageBuffer)buf).getMailbox(); 81 if (mailbox != null) 82 url = mailbox.getUrl(); 83 } 84 if (url != null) { 85 DefaultMutableTreeNode root = 86 (DefaultMutableTreeNode ) getModel().getRoot(); 87 if (root != null) { 88 Enumeration nodes = root.depthFirstEnumeration(); 89 while (nodes.hasMoreElements()) { 90 DefaultMutableTreeNode node = 91 (DefaultMutableTreeNode ) nodes.nextElement(); 92 if (node.getUserObject() instanceof Folder) { 93 Folder folder = (Folder) node.getUserObject(); 94 if (url.equals(folder.getUrl())) { 95 scrollPathToVisible(new TreePath (node.getPath())); 96 final int limit = getRowCount(); 97 for (int i = 0; i < limit; i++) { 98 TreePath treepath = getPathForRow(i); 99 if (treepath != null && 100 treepath.getLastPathComponent() == node) { 101 row = i; 102 break; 103 } 104 } 105 } 106 } 107 } 108 } 109 } 110 if (row >= 0) 111 setSelectionRow(row); 112 else 113 clearSelection(); 114 repaint(); 115 } 116 117 public final String getLabelText() 118 { 119 return "Folders"; 120 } 121 122 public void mousePressed(MouseEvent e) {} 123 124 public void mouseReleased(MouseEvent e) {} 125 126 public void mouseClicked(MouseEvent e) 127 { 128 final Editor editor = frame.getCurrentEditor(); 129 final int modifiers = e.getModifiers(); 130 if (modifiers != InputEvent.BUTTON1_MASK && 131 modifiers != InputEvent.BUTTON2_MASK) { 132 e.consume(); 133 editor.setFocusToDisplay(); 134 return; 135 } 136 Point point = e.getPoint(); 137 TreePath treePath = getPathForLocation(point.x, point.y); 138 if (treePath != null) { 139 DefaultMutableTreeNode node = 140 (DefaultMutableTreeNode ) treePath.getLastPathComponent(); 141 Object object = node.getUserObject(); 142 if (object instanceof Folder) { 143 Folder folder = (Folder) object; 144 MailboxURL url = folder.getUrl(); 145 editor.setWaitCursor(); 146 MailCommands.openMailbox(editor, url); 147 editor.updateDisplay(); 148 editor.setDefaultCursor(); 149 } 150 } 151 editor.setFocusToDisplay(); 152 } 153 154 public void mouseEntered(MouseEvent e) {} 155 156 public void mouseExited(MouseEvent e) 157 { 158 updatePosition(); 159 frame.getCurrentEditor().setFocusToDisplay(); 160 } 161 162 private static class TreeCellRenderer extends DefaultTreeCellRenderer 163 { 164 private static final Color noFocusSelectionBackground = 165 new Color (208, 208, 208); 166 167 private JTree tree; 168 private Color oldBackgroundSelectionColor; 169 170 TreeCellRenderer(JTree tree) 171 { 172 super(); 173 this.tree = tree; 174 oldBackgroundSelectionColor = getBackgroundSelectionColor(); 175 setOpenIcon(Utilities.getIconFromFile("dir_open.png")); 176 setClosedIcon(Utilities.getIconFromFile("dir_close.png")); 177 setLeafIcon(Utilities.getIconFromFile("mailbox.png")); 178 } 179 180 public Component getTreeCellRendererComponent( 181 JTree tree, 182 Object value, 183 boolean selected, 184 boolean expanded, 185 boolean leaf, 186 int row, 187 boolean hasFocus) 188 { 189 super.getTreeCellRendererComponent(tree, value, selected, expanded, 190 leaf, row, hasFocus); 191 if (selected) 192 super.setForeground(getTextSelectionColor()); 193 else 194 super.setForeground(getTextNonSelectionColor()); 195 if (Editor.getCurrentFrame().getFocusedComponent() == tree) 196 setBackgroundSelectionColor(oldBackgroundSelectionColor); 197 else 198 setBackgroundSelectionColor(noFocusSelectionBackground); 199 return this; 200 } 201 202 public void paintComponent(Graphics g) 203 { 204 Display.setRenderingHints(g); 205 super.paintComponent(g); 206 } 207 } 208 } 209 | Popular Tags |