PageRenderTime 25ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/atlassian/uwc/ui/organizer/HierarchyTool.java

https://bitbucket.org/atlassianlabs/universal-wiki-connector
Java | 416 lines | 306 code | 106 blank | 4 comment | 46 complexity | 95a05c537df305b3f7e06bfc219a218f MD5 | raw file
  1. package com.atlassian.uwc.ui.organizer;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.util.ArrayList;
  7. import java.util.Enumeration;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import javax.swing.BorderFactory;
  11. import javax.swing.Box;
  12. import javax.swing.JButton;
  13. import javax.swing.JLabel;
  14. import javax.swing.JOptionPane;
  15. import javax.swing.JPanel;
  16. import javax.swing.JScrollPane;
  17. import javax.swing.JSeparator;
  18. import javax.swing.JSplitPane;
  19. import javax.swing.JTree;
  20. import javax.swing.tree.DefaultMutableTreeNode;
  21. import javax.swing.tree.DefaultTreeCellRenderer;
  22. import javax.swing.tree.DefaultTreeModel;
  23. import javax.swing.tree.DefaultTreeSelectionModel;
  24. import javax.swing.tree.TreeModel;
  25. import org.apache.log4j.Logger;
  26. import com.atlassian.uwc.ui.UWCForm2;
  27. public class HierarchyTool {
  28. protected UWCForm2 uwcForm;
  29. public JPanel hierarchyToolPanel;
  30. private JTree originalTree;
  31. private JTree modifiedTree;
  32. private JScrollPane originalTreeViewScrollPane;
  33. private JScrollPane modifiedTreeViewScrollPane;
  34. private JPanel originalTreePanel;
  35. private JPanel modifiedTreePanel;
  36. private JSplitPane treeSplitPane;
  37. private JPanel buttonPanel;
  38. private JButton finishButton;
  39. private JButton cancelButton;
  40. private JButton helpButton;
  41. private static final String FINISH_BUTTON_LABEL = "Finish";
  42. private static final String CANCEL_BUTTON_LABEL = "Cancel";
  43. private static final String HELP_BUTTON_LABEL = "Help";
  44. private static final String ORIGINAL_TREE_LABEL = "Original Structure";
  45. private static final String MODIFIED_TREE_LABEL = "Modified Structure";
  46. private static final String HELP_MSG =
  47. "Reorganize the wiki pages in the \'Modified Structure\' tree \n" +
  48. "by dragging and dropping. Click \'Finish\' to rearrange the wiki.\n" +
  49. "The \'Orignal Structure\' tree is to be used as a reference.";
  50. public static Logger logger = Logger.getLogger(HierarchyTool.class);
  51. public HierarchyTool(UWCForm2 aUWCForm) {
  52. uwcForm = aUWCForm;
  53. initialize();
  54. }
  55. private void initialize() {
  56. getHierarchyToolPanel().add(getTreeSplitPane(), BorderLayout.CENTER);
  57. getHierarchyToolPanel().add(getButtonPanel(), BorderLayout.SOUTH);
  58. getHierarchyToolPanel().setPreferredSize(new Dimension(500, 400));
  59. spaceSplitPanes();
  60. }
  61. private JPanel getHierarchyToolPanel() {
  62. if (hierarchyToolPanel == null) {
  63. hierarchyToolPanel = new JPanel(new BorderLayout());
  64. hierarchyToolPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
  65. spaceSplitPanes();
  66. }
  67. return hierarchyToolPanel;
  68. }
  69. private WikiPage getParent(List aHierarchicalList, int aParentID) {
  70. Iterator hierarchicalListIt = aHierarchicalList.iterator();
  71. while (hierarchicalListIt.hasNext()) {
  72. WikiPage page = (WikiPage)hierarchicalListIt.next();
  73. if (page.getPageID() == aParentID) {
  74. return page;
  75. }
  76. WikiPage possibleParent = getParent(page.getChildPages(), aParentID);
  77. if (possibleParent != null) {
  78. return possibleParent;
  79. }
  80. }
  81. return null;
  82. }
  83. private void constructWikiPageHierarchy(List aHierarchy, List aFlatList) {
  84. List minimizedFlatList = new ArrayList();
  85. Iterator flatListIt = aFlatList.iterator();
  86. while (flatListIt.hasNext()) {
  87. WikiPage page = (WikiPage)flatListIt.next();
  88. if (page.getParentID() == 0) {
  89. aHierarchy.add(page);
  90. continue;
  91. }
  92. WikiPage parent = getParent(aHierarchy, page.getParentID());
  93. if (parent != null) {
  94. parent.getChildPages().add(page);
  95. } else {
  96. minimizedFlatList.add(page);
  97. }
  98. }
  99. if (minimizedFlatList.size() == aFlatList.size()) {
  100. // There are orphan pages
  101. logger.error("There are " + minimizedFlatList.size() + " orphaned pages.");
  102. return;
  103. }
  104. if (minimizedFlatList.size() > 0) {
  105. constructWikiPageHierarchy(aHierarchy, minimizedFlatList);
  106. }
  107. }
  108. private void addPageNodes(DefaultMutableTreeNode aParent, WikiPage aWikiPage) {
  109. Iterator childPagesIt = aWikiPage.getChildPages().iterator();
  110. while (childPagesIt.hasNext()) {
  111. WikiPage childPage = (WikiPage)childPagesIt.next();
  112. DefaultMutableTreeNode childPageNode = new DefaultMutableTreeNode(childPage);
  113. aParent.add(childPageNode);
  114. addPageNodes(childPageNode, childPage);
  115. }
  116. }
  117. private TreeModel getOriginalTreeModel() {
  118. List wikiPageHierarchy = new ArrayList();
  119. constructWikiPageHierarchy(wikiPageHierarchy, WikiPage.getExampleFlatList());
  120. DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(new DefaultMutableTreeNode());
  121. Iterator rootPagesIt = wikiPageHierarchy.iterator();
  122. while (rootPagesIt.hasNext()) {
  123. WikiPage rootPage = (WikiPage)rootPagesIt.next();
  124. DefaultMutableTreeNode rootPageNode = new DefaultMutableTreeNode(rootPage);
  125. rootNode.add(rootPageNode);
  126. addPageNodes(rootPageNode, rootPage);
  127. }
  128. return new DefaultTreeModel(rootNode);
  129. }
  130. private JTree getOriginalTree() {
  131. if (originalTree == null) {
  132. originalTree = new JTree();
  133. originalTree.setRowHeight(-1);
  134. originalTree.setBounds(0, 0, 78, 72);
  135. originalTree.setShowsRootHandles(true);
  136. originalTree.setRootVisible(false);
  137. originalTree.setEditable(false);
  138. originalTree.setBackground(getHierarchyToolPanel().getBackground());
  139. DefaultTreeCellRenderer renderer =
  140. (DefaultTreeCellRenderer)originalTree.getCellRenderer();
  141. renderer.setBackgroundNonSelectionColor(
  142. getHierarchyToolPanel().getBackground());
  143. originalTree.setModel(getOriginalTreeModel());
  144. }
  145. return originalTree;
  146. }
  147. private JScrollPane getOriginalTreeViewScrollPane() {
  148. if (originalTreeViewScrollPane == null) {
  149. originalTreeViewScrollPane = new JScrollPane();
  150. originalTreeViewScrollPane.setViewportView(getOriginalTree());
  151. }
  152. return originalTreeViewScrollPane;
  153. }
  154. protected JPanel getOriginalTreePanel() {
  155. if (originalTreePanel == null) {
  156. originalTreePanel = new JPanel(new BorderLayout(2, 2));
  157. Box treeLabel = Box.createHorizontalBox();
  158. treeLabel.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 0));
  159. treeLabel.add(new JLabel(ORIGINAL_TREE_LABEL));
  160. originalTreePanel.add(treeLabel, BorderLayout.NORTH);
  161. originalTreePanel.add(getOriginalTreeViewScrollPane(),
  162. BorderLayout.CENTER);
  163. }
  164. return originalTreePanel;
  165. }
  166. private JTree getModifiedTree() {
  167. if (modifiedTree == null) {
  168. modifiedTree = new JTree();
  169. modifiedTree.setRowHeight(-1);
  170. modifiedTree.setBounds(0, 0, 78, 72);
  171. modifiedTree.setShowsRootHandles(true);
  172. modifiedTree.setRootVisible(false);
  173. modifiedTree.getSelectionModel().
  174. setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
  175. modifiedTree.setDragEnabled(true);
  176. modifiedTree.setTransferHandler(new DNDTreeSourceListener());
  177. modifiedTree.setDropTarget(new DNDTreeTargetListener());
  178. modifiedTree.setModel(getOriginalTreeModel());
  179. }
  180. return modifiedTree;
  181. }
  182. private JScrollPane getModifiedTreeViewScrollPane() {
  183. if (modifiedTreeViewScrollPane == null) {
  184. modifiedTreeViewScrollPane = new JScrollPane();
  185. modifiedTreeViewScrollPane.setViewportView(getModifiedTree());
  186. }
  187. return modifiedTreeViewScrollPane;
  188. }
  189. protected JPanel getModifiedTreePanel() {
  190. if (modifiedTreePanel == null) {
  191. modifiedTreePanel = new JPanel(new BorderLayout(2, 2));
  192. Box treeLabel = Box.createHorizontalBox();
  193. treeLabel.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 0));
  194. treeLabel.add(new JLabel(MODIFIED_TREE_LABEL));
  195. modifiedTreePanel.add(treeLabel, BorderLayout.NORTH);
  196. modifiedTreePanel.add(getModifiedTreeViewScrollPane(),
  197. BorderLayout.CENTER);
  198. }
  199. return modifiedTreePanel;
  200. }
  201. protected JSplitPane getTreeSplitPane() {
  202. if (treeSplitPane == null) {
  203. treeSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
  204. treeSplitPane.add(getOriginalTreePanel(), JSplitPane.LEFT);
  205. treeSplitPane.add(getModifiedTreePanel(), JSplitPane.RIGHT);
  206. treeSplitPane.setContinuousLayout(true);
  207. }
  208. return treeSplitPane;
  209. }
  210. public void spaceSplitPanes() {
  211. getTreeSplitPane().setDividerLocation(180);
  212. }
  213. private JPanel getButtonPanel() {
  214. if (buttonPanel == null) {
  215. buttonPanel = new JPanel(new BorderLayout(0, 10));
  216. buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
  217. // Align the buttons in a horizontal box
  218. Box buttonBox = Box.createHorizontalBox();
  219. buttonBox.add(Box.createHorizontalStrut(5));
  220. buttonBox.add(getFinishButton());
  221. buttonBox.add(Box.createHorizontalStrut(5));
  222. buttonBox.add(getCancelButton());
  223. buttonBox.add(Box.createHorizontalStrut(5));
  224. buttonBox.add(getHelpButton());
  225. buttonBox.add(Box.createHorizontalStrut(5));
  226. // Add a separator line to the panel
  227. buttonPanel.add(new JSeparator(), BorderLayout.NORTH);
  228. // Add the horizontal button box to the button panel
  229. buttonPanel.add(buttonBox, BorderLayout.EAST);
  230. }
  231. return buttonPanel;
  232. }
  233. private JButton getFinishButton() {
  234. if (finishButton == null) {
  235. finishButton = new JButton(FINISH_BUTTON_LABEL);
  236. finishButton.addActionListener(new ActionListener() {
  237. public void actionPerformed(ActionEvent e) {
  238. commitHeirarchyChanges();
  239. }
  240. });
  241. }
  242. return finishButton;
  243. }
  244. private void commitHeirarchyChanges() {
  245. int answer = JOptionPane.showConfirmDialog(
  246. getHierarchyToolPanel(),
  247. "Would you like to commit the changes?",
  248. "Committing Hierarchy Changes",
  249. JOptionPane.YES_NO_OPTION);
  250. if (answer == JOptionPane.NO_OPTION) {
  251. closeHierarchyTool();
  252. return;
  253. }
  254. DefaultMutableTreeNode rootNode =
  255. (DefaultMutableTreeNode)getModifiedTree().getModel().getRoot();
  256. List newHierarchy = new ArrayList();
  257. constructFlatHierarchy(rootNode, newHierarchy);
  258. Iterator flatHierarchyIt = newHierarchy.iterator();
  259. while (flatHierarchyIt.hasNext()) {
  260. WikiPage page = (WikiPage) flatHierarchyIt.next();
  261. System.out.println("Wiki Page: " + page);
  262. }
  263. closeHierarchyTool();
  264. }
  265. public void constructFlatHierarchy(DefaultMutableTreeNode aNode, List aFlatHierarchy) {
  266. if (aNode.getUserObject() instanceof WikiPage) {
  267. aFlatHierarchy.add(aNode.getUserObject());
  268. }
  269. if (aNode.getChildCount() >= 0) {
  270. for (Enumeration e = aNode.children(); e.hasMoreElements(); ) {
  271. DefaultMutableTreeNode childNode =
  272. (DefaultMutableTreeNode)e.nextElement();
  273. constructFlatHierarchy(childNode, aFlatHierarchy);
  274. }
  275. }
  276. }
  277. private JButton getCancelButton() {
  278. if (cancelButton == null) {
  279. cancelButton = new JButton(CANCEL_BUTTON_LABEL);
  280. cancelButton.addActionListener(new ActionListener() {
  281. public void actionPerformed(ActionEvent e) {
  282. closeHierarchyTool();
  283. }
  284. });
  285. }
  286. return cancelButton;
  287. }
  288. private void closeHierarchyTool() {
  289. UWCForm2.hierarchyToolFrame.setVisible(false);
  290. getModifiedTree().setModel(getOriginalTreeModel());
  291. }
  292. private JButton getHelpButton() {
  293. if (helpButton == null) {
  294. helpButton = new JButton(HELP_BUTTON_LABEL);
  295. helpButton.addActionListener(new ActionListener() {
  296. public void actionPerformed(ActionEvent e) {
  297. showHelpScreen();
  298. }
  299. });
  300. }
  301. return helpButton;
  302. }
  303. private void showHelpScreen() {
  304. JOptionPane.showMessageDialog(
  305. getHierarchyToolPanel(),
  306. HELP_MSG,
  307. "Hierarchy Tool Help",
  308. JOptionPane.QUESTION_MESSAGE);
  309. }
  310. }