View Javadoc

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   * User: pmaruszak
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  				// refresh data in the view
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 //					listModel.selectManualFilter(jiraServer, manualFilter, true);
115 					// store filter in project workspace
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 			// get also 'any' values
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