1 package com.atlassian.theplugin.idea.crucible.tree;
2
3 import com.atlassian.theplugin.commons.crucible.api.model.PredefinedFilter;
4 import com.atlassian.theplugin.crucible.model.CrucibleFilterListModel;
5 import com.atlassian.theplugin.crucible.model.CrucibleReviewListModel;
6
7 import javax.swing.tree.DefaultMutableTreeNode;
8 import javax.swing.tree.DefaultTreeModel;
9 import javax.swing.tree.TreePath;
10 import java.util.ArrayList;
11
12
13
14
15 public class CrucibleFilterTreeModel extends DefaultTreeModel {
16 private CrucibleFilterListModel filterModel;
17 private final CrucibleReviewListModel reviewListModel;
18
19
20 public CrucibleFilterTreeModel(CrucibleFilterListModel filterModel, CrucibleReviewListModel reviewListModel) {
21 super(new DefaultMutableTreeNode(), false);
22 this.filterModel = filterModel;
23 this.reviewListModel = reviewListModel;
24 }
25
26 @Override
27 public Object getChild(Object parent, int index) {
28 if (parent == root) {
29 DefaultMutableTreeNode p = (DefaultMutableTreeNode) parent;
30
31 if (index == 0) {
32
33 if (index < p.getChildCount()) {
34 return p.getChildAt(index);
35 }
36
37 CrucibleMyReviewsTreeNode node = new CrucibleMyReviewsTreeNode(reviewListModel);
38 p.add(node);
39 return node;
40
41 } else if (index <= getNumberOfCustomFilters()) {
42
43 if (index < p.getChildCount()) {
44 return p.getChildAt(index);
45 }
46
47 CrucibleCustomFilterTreeNode node =
48 new CrucibleCustomFilterTreeNode(filterModel.getCustomFilter(), reviewListModel);
49 p.add(node);
50 return node;
51 } else if (index == getNumberOfCustomFilters() + 1) {
52
53 if (index < p.getChildCount()) {
54 return p.getChildAt(index);
55 }
56
57 CrucibleRecentlyOpenFilterTreeNode node = new CrucibleRecentlyOpenFilterTreeNode(
58 filterModel.getRecentlyOpenReviewsFilter(), reviewListModel);
59 p.add(node);
60 return node;
61 }
62 } else if (parent instanceof CrucibleMyReviewsTreeNode && index < filterModel.getPredefinedFilters().size()) {
63
64 CrucibleMyReviewsTreeNode p = (CrucibleMyReviewsTreeNode) parent;
65
66 PredefinedFilter predefinedFilter = (PredefinedFilter) (filterModel.getPredefinedFilters()).toArray()[index];
67
68 if (predefinedFilter != null) {
69
70 if (index < p.getChildCount()) {
71 return p.getChildAt(index);
72 }
73
74 CruciblePredefinedFilterTreeNode n =
75 new CruciblePredefinedFilterTreeNode(predefinedFilter, reviewListModel);
76 p.add(n);
77 return n;
78 }
79 }
80 return null;
81 }
82
83 @Override
84 public int getChildCount(Object parent) {
85 if (parent == root) {
86
87 return 1 + getNumberOfCustomFilters() + 1;
88 } else if (parent instanceof CrucibleMyReviewsTreeNode) {
89 return filterModel.getPredefinedFilters().size();
90 }
91
92 return 0;
93 }
94
95 @Override
96 public Object getRoot() {
97 return super.getRoot();
98 }
99
100 @Override
101 public boolean isLeaf(Object node) {
102 if (node == super.getRoot()
103 || node instanceof CrucibleMyReviewsTreeNode) {
104 return false;
105 }
106
107 return true;
108 }
109
110 public int getNumberOfCustomFilters() {
111 return 1;
112 }
113
114 @Override
115 public void valueForPathChanged(TreePath path, Object newValue) {
116 System.out.println("valueForPathChanged");
117 }
118
119 @Override
120 public int getIndexOfChild(Object parent, Object child) {
121 if (parent == root) {
122 if (child instanceof CruciblePredefinedFilterTreeNode) {
123 PredefinedFilter predefinedFilter = ((CruciblePredefinedFilterTreeNode) child).getFilter();
124 return new ArrayList<PredefinedFilter>(filterModel.getPredefinedFilters()).indexOf(predefinedFilter);
125
126 } else if (child instanceof CrucibleCustomFilterTreeNode) {
127
128 return filterModel.getPredefinedFilters().size();
129 }
130 }
131
132 return -1;
133 }
134 }