1 package com.atlassian.theplugin.idea.jira;
2
3 import com.atlassian.theplugin.commons.util.MiscUtil;
4 import com.atlassian.theplugin.commons.remoteapi.ServerData;
5 import com.atlassian.theplugin.configuration.JiraFilterConfigurationBean;
6 import com.atlassian.theplugin.configuration.JiraFilterEntryBean;
7 import com.atlassian.theplugin.configuration.JiraWorkspaceConfiguration;
8 import com.atlassian.theplugin.idea.ui.ScrollableTwoColumnPanel;
9 import com.atlassian.theplugin.jira.api.JIRAQueryFragment;
10 import com.atlassian.theplugin.jira.model.*;
11 import com.intellij.openapi.project.Project;
12 import org.apache.commons.lang.StringUtils;
13
14 import javax.swing.*;
15 import javax.swing.border.TitledBorder;
16 import java.awt.*;
17 import java.awt.event.ActionEvent;
18 import java.awt.event.ActionListener;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.List;
22 import java.util.Map;
23
24
25
26
27 public class JiraManualFilterDetailsPanel extends JPanel {
28 private JIRAFilterListModel listModel;
29 private final ScrollableTwoColumnPanel panel = new ScrollableTwoColumnPanel();
30 private final Project project;
31 private final JiraWorkspaceConfiguration jiraProjectCfg;
32 private final JIRAServerModel jiraServerModel;
33 private final JButton editButton = new JButton("Edit");
34 private ServerData jiraServer;
35 private JIRAManualFilter jiraManualFilter;
36
37 JiraManualFilterDetailsPanel(JIRAFilterListModel listModel,
38 JiraWorkspaceConfiguration jiraProjectCfg,
39 Project project,
40 JIRAServerModel jiraServerModel) {
41 super(new BorderLayout());
42 this.jiraProjectCfg = jiraProjectCfg;
43 this.listModel = listModel;
44 this.project = project;
45 this.jiraServerModel = jiraServerModel;
46 createPanelContent();
47
48 listModel.addModelListener(new JIRAFilterListModelListener() {
49 public void modelChanged(JIRAFilterListModel aListModel) {
50 JiraManualFilterDetailsPanel.this.listModel = aListModel;
51 }
52
53 public void manualFilterChanged(final JIRAManualFilter manualFilter, final ServerData server) {
54
55 setFilter(manualFilter, server);
56 }
57
58 public void serverRemoved(final JIRAFilterListModel aListModel) {
59 JiraManualFilterDetailsPanel.this.listModel = aListModel;
60 }
61
62 public void serverAdded(final JIRAFilterListModel jiraFilterListModel) {
63 JiraManualFilterDetailsPanel.this.listModel = jiraFilterListModel;
64 }
65
66 public void serverNameChanged(final JIRAFilterListModel jiraFilterListModel) {
67 JiraManualFilterDetailsPanel.this.listModel = jiraFilterListModel;
68 }
69
70 });
71
72 listModel.addFrozenModelListener(new FrozenModelListener() {
73 public void modelFrozen(FrozenModel model, boolean frozen) {
74 setEnabled(!frozen);
75 editButton.setEnabled(!frozen);
76 }
77 });
78
79 }
80
81
82 private void createPanelContent() {
83
84 final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
85 buttonPanel.add(editButton);
86 this.add(buttonPanel, BorderLayout.SOUTH);
87 this.add(panel, BorderLayout.CENTER);
88 final TitledBorder border = BorderFactory.createTitledBorder("Custom Filter");
89
90 this.setBorder(border);
91 editButton.addActionListener(new ActionListener() {
92
93
94 public void actionPerformed(ActionEvent event) {
95 final JiraIssuesFilterPanel jiraIssuesFilterPanel
96 = new JiraIssuesFilterPanel(project, jiraServerModel, listModel, jiraServer);
97
98 if (jiraServer != null && jiraManualFilter != null) {
99 final java.util.List<JIRAQueryFragment> listClone = new ArrayList<JIRAQueryFragment>();
100 for (JIRAQueryFragment fragment : jiraManualFilter.getQueryFragment()) {
101 if (fragment != null) {
102 listClone.add(fragment.getClone());
103 }
104 }
105 jiraIssuesFilterPanel.setFilter(listClone);
106 }
107 jiraIssuesFilterPanel.show();
108
109 if (jiraIssuesFilterPanel.getExitCode() == 0) {
110 JIRAManualFilter manualFilter = jiraManualFilter;
111 listModel.clearManualFilter(jiraServer);
112 manualFilter.getQueryFragment().addAll(jiraIssuesFilterPanel.getFilter());
113 listModel.setManualFilter(jiraServer, manualFilter);
114
115
116 jiraProjectCfg.getJiraFilterConfiguaration(jiraServer.getServerId().toString())
117 .setManualFilterForName(JiraFilterConfigurationBean.MANUAL_FILTER,
118 serializeFilter(jiraIssuesFilterPanel.getFilter()));
119 listModel.fireManualFilterChanged(manualFilter, jiraServer);
120 }
121
122 }
123 });
124 }
125
126 public void setFilter(JIRAManualFilter manualFilter, final ServerData jiraServerCfg) {
127
128 this.jiraServer = jiraServerCfg;
129 this.jiraManualFilter = manualFilter;
130
131 Collection<ScrollableTwoColumnPanel.Entry> entries = MiscUtil.buildArrayList();
132 Map<JIRAManualFilter.QueryElement, ArrayList<String>> map = manualFilter.groupBy(true);
133 for (JIRAManualFilter.QueryElement element : map.keySet()) {
134 entries.add(new ScrollableTwoColumnPanel.Entry(element.getName(), StringUtils.join(map.get(element), ", ")));
135 }
136
137
138 if (entries.size() == 0) {
139
140 map = manualFilter.groupBy(false);
141 for (JIRAManualFilter.QueryElement element : map.keySet()) {
142 entries.add(new ScrollableTwoColumnPanel.Entry(element.getName(), StringUtils.join(map.get(element), ", ")));
143 }
144 }
145
146 panel.updateContent(entries);
147 }
148
149 private List<JiraFilterEntryBean> serializeFilter(List<JIRAQueryFragment> filter) {
150 List<JiraFilterEntryBean> query = new ArrayList<JiraFilterEntryBean>();
151 for (JIRAQueryFragment jiraQueryFragment : filter) {
152 query.add(new JiraFilterEntryBean(jiraQueryFragment.getMap()));
153 }
154 return query;
155 }
156 }
157