1 31 32 package org.opencms.util.ant; 33 34 import java.awt.BorderLayout ; 35 import java.awt.Container ; 36 import java.awt.Dimension ; 37 import java.awt.GridLayout ; 38 import java.awt.Toolkit ; 39 import java.awt.event.ActionEvent ; 40 import java.awt.event.ActionListener ; 41 import java.awt.event.WindowAdapter ; 42 import java.awt.event.WindowEvent ; 43 import java.util.Enumeration ; 44 import java.util.Iterator ; 45 import java.util.LinkedList ; 46 import java.util.List ; 47 import java.util.StringTokenizer ; 48 49 import javax.swing.BorderFactory ; 50 import javax.swing.BoxLayout ; 51 import javax.swing.JButton ; 52 import javax.swing.JDialog ; 53 import javax.swing.JFrame ; 54 import javax.swing.JLabel ; 55 import javax.swing.JPanel ; 56 import javax.swing.JScrollPane ; 57 import javax.swing.JTree ; 58 import javax.swing.border.Border ; 59 import javax.swing.tree.DefaultMutableTreeNode ; 60 import javax.swing.tree.DefaultTreeModel ; 61 import javax.swing.tree.TreeModel ; 62 import javax.swing.tree.TreeNode ; 63 import javax.swing.tree.TreePath ; 64 65 78 public class CmsAntTaskSelectionTreeDialog extends JDialog implements ActionListener { 79 80 81 private static final int C_BORDER_SIZE = 10; 82 83 84 private static final long serialVersionUID = -8439685952987222098L; 85 86 87 protected boolean m_aborted = false; 88 89 90 private List m_allModuleList; 91 92 93 private final Border m_border = BorderFactory.createEmptyBorder(C_BORDER_SIZE, C_BORDER_SIZE, 0, C_BORDER_SIZE); 94 95 96 private final JPanel m_buttons = new JPanel (); 97 98 99 private final JButton m_cancel = new JButton ("Cancel"); 100 101 102 private final JPanel m_content = new JPanel (); 103 104 105 private JLabel m_label = null; 106 107 108 private final JButton m_ok = new JButton ("Ok"); 109 110 111 private final CmsAntTaskSelectionTreePrompt m_promptTask; 112 113 114 private final JButton m_selAll = new JButton ("All"); 115 116 117 private final JButton m_selNone = new JButton ("None"); 118 119 120 private JTree m_tree; 121 122 129 public CmsAntTaskSelectionTreeDialog(CmsAntTaskSelectionTreePrompt promptTask) { 130 131 super((JFrame )null, promptTask.getTitle(), true); 132 m_promptTask = promptTask; 133 134 m_label = new JLabel (m_promptTask.getPrompt()); 135 136 addWindowListener(new WindowAdapter () { 137 138 public void windowClosed(WindowEvent e) { 139 140 setVisible(false); 141 } 142 }); 143 144 getRootPane().setDefaultButton(m_ok); 145 Container contentPane = getContentPane(); 146 contentPane.setLayout(new BoxLayout (contentPane, BoxLayout.Y_AXIS)); 147 148 m_label.setBorder(m_border); 149 if (!m_promptTask.isSingleSelection()) { 150 JPanel p1 = new JPanel (); 151 p1.add(new JLabel ("Select: ")); 152 m_selAll.addActionListener(this); 153 p1.add(m_selAll); 154 m_selNone.addActionListener(this); 155 p1.add(m_selNone); 156 JPanel p = new JPanel (new BorderLayout ()); 157 p.add(m_label, BorderLayout.NORTH); 158 p.add(p1, BorderLayout.SOUTH); 159 contentPane.add(p); 160 } else { 161 getContentPane().add(m_label); 162 } 163 164 JScrollPane scrollpane = new JScrollPane (m_content); 165 scrollpane.setBorder(m_border); 166 167 scrollpane.setPreferredSize(new Dimension (300, 800)); 168 this.parseModuleList(); 171 TreeModel treeModel = createTree(); 172 m_tree = new SelectionTree(); 173 m_tree.setModel(treeModel); 174 m_tree.setRootVisible(false); 175 m_tree.setShowsRootHandles(true); 176 expandTree(new TreePath (treeModel.getRoot())); 177 selectDefaultNodes((DefaultMutableTreeNode )treeModel.getRoot(), "", new TreePath (treeModel.getRoot())); 178 179 m_content.setLayout(new GridLayout (1, 1)); 182 m_content.add(m_tree); 183 m_content.setBorder(BorderFactory.createLoweredBevelBorder()); 184 185 contentPane.add(scrollpane); 186 187 m_buttons.setBorder(BorderFactory.createEmptyBorder( 188 C_BORDER_SIZE, 189 C_BORDER_SIZE, 190 C_BORDER_SIZE / 2, 191 C_BORDER_SIZE)); 192 m_ok.addActionListener(this); 193 m_buttons.add(m_ok); 194 m_cancel.addActionListener(this); 195 m_buttons.add(m_cancel); 196 getContentPane().add(m_buttons, BorderLayout.SOUTH); 197 198 pack(); 199 } 200 201 204 public void actionPerformed(ActionEvent e) { 205 206 Object source = e.getSource(); 207 if (source == m_ok) { 208 m_aborted = false; 209 setVisible(false); 210 } else if (source == m_cancel) { 211 m_aborted = true; 212 setVisible(false); 213 } else if (source == m_selAll) { 214 m_tree.setSelectionPath(new TreePath (m_tree.getModel().getRoot())); 215 } else if (source == m_selNone) { 216 m_tree.clearSelection(); 217 } 218 m_tree.invalidate(); 219 m_tree.repaint(); 221 } 222 223 229 public String getSelection() { 230 231 center(); 232 setVisible(true); 233 234 StringBuffer ret = new StringBuffer (); 236 TreePath [] pathArr = m_tree.getSelectionPaths(); 238 if (pathArr == null) { 240 pathArr = new TreePath [0]; 241 } 242 TreePath path; 243 StringBuffer pathString; 244 DefaultMutableTreeNode node; 245 246 for (int i = 0; i < pathArr.length; i++) { 252 pathString = new StringBuffer (); 253 path = pathArr[i]; 254 Object [] entries = path.getPath(); 256 for (int j = 1; j < entries.length; j++) { 258 pathString.append(entries[j]); 259 if (j < entries.length - 1) { 260 pathString.append("."); 261 } 262 } 263 node = (DefaultMutableTreeNode )path.getLastPathComponent(); 264 if (node.isLeaf()) { 265 ret.append(pathString.toString()); 266 ret.append(CmsAntTaskSelectionTreePrompt.LIST_SEPARATOR); 267 } else { 268 if (m_allModuleList.contains(pathString.toString())) { 271 ret.append(pathString.toString()); 272 ret.append(CmsAntTaskSelectionTreePrompt.LIST_SEPARATOR); 273 } else { 274 } 276 278 ret.append(getSubpaths(node, pathString.toString())); 279 } 280 281 } 282 dispose(); 283 if (m_aborted || ret.toString().trim().length() < CmsAntTaskSelectionTreePrompt.LIST_SEPARATOR.length()) { 284 return null; 285 } else { 286 return ret.toString(); 287 } 288 } 289 290 298 private void center() { 299 300 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 301 Dimension window = getSize(); 302 int height = window.height; 304 int width = window.width; 305 if (window.height > screen.height) { 306 window.height = screen.height; 307 height = screen.height - 50; 308 width = width + 50; 309 } 310 if (window.width > screen.width) { 311 window.width = screen.width; 312 } 313 int xCoord = (screen.width / 2 - window.width / 2); 314 int yCoord = (screen.height / 2 - window.height / 2); 315 setLocation(xCoord, yCoord); 316 setSize(width, height); 317 } 318 319 private TreeModel createTree() { 320 321 DefaultMutableTreeNode root = new DefaultMutableTreeNode ("root"); 323 TreeModel tm = new DefaultTreeModel (root); 324 Iterator itModules = m_allModuleList.iterator(); 325 StringTokenizer itPath; 326 Enumeration childEnum; 327 String pathElement; 328 DefaultMutableTreeNode node, child; 329 boolean found = false; 330 while (itModules.hasNext()) { 331 itPath = new StringTokenizer ((String )itModules.next(), "."); 332 node = root; 333 while (itPath.hasMoreTokens()) { 334 pathElement = itPath.nextToken(); 336 childEnum = node.children(); 337 found = false; 338 while (childEnum.hasMoreElements()) { 339 child = (DefaultMutableTreeNode )childEnum.nextElement(); 340 if (pathElement.equals(child.getUserObject())) { 341 342 node = child; 345 found = true; 346 break; 347 } 348 } 349 if (!found) { 350 child = new DefaultMutableTreeNode (); 352 child.setUserObject(pathElement); 353 node.add(child); 354 node = child; 355 } 356 } 357 } 358 return tm; 359 360 } 361 362 368 private void expandTree(TreePath treePath) { 369 370 if (treePath.getPathCount() == m_promptTask.getExpansionLevels()) { 371 m_tree.expandPath(treePath); 372 373 } else { 374 DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode )treePath.getLastPathComponent(); 375 Enumeration children = treeNode.children(); 376 while (children.hasMoreElements()) { 377 expandTree(treePath.pathByAddingChild(children.nextElement())); 378 } 379 } 380 381 } 382 383 private String getSubpaths(TreeNode node, String parentPath) { 384 385 Enumeration children = node.children(); 386 TreeNode child; 387 String path = parentPath; 388 StringBuffer ret = new StringBuffer (); 389 while (children.hasMoreElements()) { 390 child = (TreeNode )children.nextElement(); 391 if (parentPath.length() == 0) { 392 path = child.toString(); 393 } else { 394 path = parentPath + "." + child.toString(); 395 } 396 if (child.isLeaf()) { 397 ret.append(path); 398 ret.append(CmsAntTaskSelectionTreePrompt.LIST_SEPARATOR); 399 } else { 400 ret.append(getSubpaths(child, path)); 401 } 402 } 403 return ret.toString(); 404 } 405 406 412 private void parseModuleList() { 413 414 m_allModuleList = new LinkedList (); 415 StringTokenizer itPaths = new StringTokenizer ( 416 m_promptTask.getAllValues(), 417 CmsAntTaskSelectionPrompt.LIST_SEPARATOR); 418 419 String token; 420 while (itPaths.hasMoreElements()) { 421 token = itPaths.nextToken().trim(); 422 m_allModuleList.add(token); 423 } 424 } 425 426 431 private void selectDefaultNodes(DefaultMutableTreeNode node, String path, TreePath treePath) { 432 433 String defaultString = m_promptTask.getDefaultValue(); 435 if ("root".equalsIgnoreCase(defaultString.trim())) { 436 if (node == m_tree.getModel().getRoot()) { 437 m_tree.setSelectionPath(treePath); 438 } 439 } else { 440 StringTokenizer tokenizer = new StringTokenizer (defaultString, CmsAntTaskSelectionTreePrompt.LIST_SEPARATOR); 441 String defaultEntry; 442 while (tokenizer.hasMoreTokens()) { 443 defaultEntry = tokenizer.nextToken(); 444 if (node.getLevel() == 0) { 446 System.out.println("Preselection: " + defaultEntry); 447 } 448 if (defaultEntry.equals(path)) { 449 m_tree.addSelectionPath(treePath); 450 return; 451 } 452 } 453 Enumeration children = node.children(); 454 DefaultMutableTreeNode subNode; 455 String subPath; 456 while (children.hasMoreElements()) { 457 subPath = path; 458 if (subPath.length() != 0) { 459 subPath += "."; 460 } 461 subNode = (DefaultMutableTreeNode )children.nextElement(); 462 subPath += subNode.toString(); 463 selectDefaultNodes(subNode, subPath, treePath.pathByAddingChild(subNode)); 464 } 465 466 } 467 } 468 } | Popular Tags |