1 package org.columba.mail.gui.tree; 17 18 import java.io.IOException ; 19 import java.io.InputStream ; 20 21 import javax.swing.JPopupMenu ; 22 import javax.swing.event.EventListenerList ; 23 import javax.swing.event.TreeExpansionEvent ; 24 import javax.swing.event.TreeSelectionEvent ; 25 import javax.swing.event.TreeSelectionListener ; 26 import javax.swing.event.TreeWillExpandListener ; 27 import javax.swing.tree.DefaultMutableTreeNode ; 28 import javax.swing.tree.ExpandVetoException ; 29 import javax.swing.tree.TreeModel ; 30 import javax.swing.tree.TreePath ; 31 import javax.swing.tree.TreeSelectionModel ; 32 33 import org.columba.api.gui.frame.IFrameMediator; 34 import org.columba.core.gui.menu.ExtendablePopupMenu; 35 import org.columba.core.gui.menu.MenuXMLDecoder; 36 import org.columba.core.io.DiskIO; 37 import org.columba.core.xml.XmlElement; 38 import org.columba.mail.config.IFolderItem; 39 import org.columba.mail.folder.IMailFolder; 40 import org.columba.mail.gui.tree.comparator.FolderComparator; 41 import org.columba.mail.gui.tree.comparator.UnreadFolderComparator; 42 import org.columba.mail.gui.tree.util.FolderTreeCellRenderer; 43 44 47 public class TreeController implements TreeSelectionListener , 48 TreeWillExpandListener , ITreeController { 49 50 private IMailFolder selectedFolder; 51 52 private TreeView view; 53 54 private IFrameMediator frameController; 55 56 private ExtendablePopupMenu menu; 57 58 private FolderComparator folderComparator; 59 60 protected EventListenerList listenerList = new EventListenerList (); 61 62 70 public TreeController(IFrameMediator controller, FolderTreeModel model) { 71 frameController = controller; 72 73 view = new TreeView(model); 74 view.setSortingEnabled(false); 75 76 view.addTreeWillExpandListener(this); 77 78 FolderTreeCellRenderer renderer = new FolderTreeCellRenderer(); 79 view.setCellRenderer(renderer); 80 81 getView().setTransferHandler(new TreeViewTransferHandler(controller)); 82 getView().setDragEnabled(true); 83 84 getView().getSelectionModel().setSelectionMode( 85 TreeSelectionModel.SINGLE_TREE_SELECTION); 86 87 getView().addTreeSelectionListener(this); 88 89 } 90 91 94 public void sortAscending(boolean ascending) { 95 folderComparator.setAscending(ascending); 96 view.setSortingComparator(folderComparator); 97 } 98 99 104 public TreeView getView() { 105 return view; 106 } 107 108 114 public void setSelected(IMailFolder folder) { 115 view.clearSelection(); 116 117 TreePath path = folder.getSelectionTreePath(); 118 119 124 view.setSelectionPath(path); 125 view.expandPath(path); 126 127 this.selectedFolder = folder; 128 129 } 130 131 134 public void createPopupMenu() { 135 try { 136 InputStream is = DiskIO 137 .getResourceStream("org/columba/mail/action/tree_contextmenu.xml"); 138 139 menu = new MenuXMLDecoder(frameController).createPopupMenu(is); 140 } catch (IOException e) { 141 e.printStackTrace(); 142 } 143 } 144 145 150 public JPopupMenu getPopupMenu() { 151 return menu; 152 } 153 154 157 public IMailFolder getSelected() { 158 return selectedFolder; 159 } 160 161 166 public IFrameMediator getFrameController() { 167 return frameController; 168 } 169 170 174 175 176 public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException { 177 IMailFolder treeNode = (IMailFolder) e.getPath().getLastPathComponent(); 178 179 if (treeNode == null) { 180 return; 181 } 182 183 saveExpandedState(treeNode, e.getPath()); 185 } 186 187 188 public void treeWillCollapse(TreeExpansionEvent e) { 189 IMailFolder treeNode = (IMailFolder) e.getPath().getLastPathComponent(); 190 191 if (treeNode == null) { 192 return; 193 } 194 195 saveExpandedState(treeNode, e.getPath()); 197 } 198 199 207 private void saveExpandedState(IMailFolder folder, TreePath path) { 208 IFolderItem item = folder.getConfiguration(); 209 210 XmlElement property = item.getElement("property"); 211 212 if (!getView().isExpanded(path)) { 215 property.addAttribute("expanded", "true"); 216 } else { 217 property.addAttribute("expanded", "false"); 218 } 219 } 220 221 224 public TreeModel getModel() { 225 return getView().getModel(); 226 } 227 228 231 public void setSortingEnabled(boolean enabled) { 232 view.setSortingEnabled(enabled); 233 } 234 235 public void setSortingMode(SORTING_MODE_ENUM sortingMode, boolean ascending) { 236 237 if (sortingMode == SORTING_MODE_ENUM.ALPHABETICAL) { 238 setFolderComparator(new FolderComparator(ascending)); 239 } else if (sortingMode == SORTING_MODE_ENUM.UNREAD_COUNT) { 240 setFolderComparator(new UnreadFolderComparator(ascending)); 241 } else { 242 } 244 } 245 246 252 private void setFolderComparator(FolderComparator comparator) { 253 folderComparator = comparator; 254 view.setSortingComparator(folderComparator); 255 } 256 257 public void addFolderSelectionListener(IFolderSelectionListener l) { 258 listenerList.add(IFolderSelectionListener.class, l); 259 } 260 261 public void removeFolderSelectionListener(IFolderSelectionListener l) { 262 listenerList.remove(IFolderSelectionListener.class, l); 263 } 264 265 protected void fireFolderSelectionChangedEvent(IMailFolder folder) { 266 267 IFolderSelectionEvent e = new FolderSelectionEvent(this, folder); 268 Object [] listeners = listenerList.getListenerList(); 270 271 for (int i = listeners.length - 2; i >= 0; i -= 2) { 274 if (listeners[i] == IFolderSelectionListener.class) { 275 ((IFolderSelectionListener) listeners[i + 1]) 276 .selectionChanged(e); 277 } 278 } 279 } 280 281 public void valueChanged(TreeSelectionEvent e) { 282 DefaultMutableTreeNode node = (DefaultMutableTreeNode ) getView() 283 .getLastSelectedPathComponent(); 284 285 if (node == null) 286 return; 287 288 fireFolderSelectionChangedEvent((IMailFolder)node); 290 } 291 292 } | Popular Tags |