Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 129086 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylar/internal/jira/JiraRepositoryConnector.java (-23 / +74 lines)
Lines 21-28 Link Here
21
import org.eclipse.core.runtime.IStatus;
21
import org.eclipse.core.runtime.IStatus;
22
import org.eclipse.core.runtime.MultiStatus;
22
import org.eclipse.core.runtime.MultiStatus;
23
import org.eclipse.core.runtime.Status;
23
import org.eclipse.core.runtime.Status;
24
import org.eclipse.jface.window.Window;
24
import org.eclipse.jface.wizard.IWizard;
25
import org.eclipse.jface.wizard.IWizard;
26
import org.eclipse.jface.wizard.WizardDialog;
27
import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
25
import org.eclipse.mylar.internal.jira.ui.wizards.AddExistingJiraTaskWizard;
28
import org.eclipse.mylar.internal.jira.ui.wizards.AddExistingJiraTaskWizard;
29
import org.eclipse.mylar.internal.jira.ui.wizards.EditJiraQueryWizard;
26
import org.eclipse.mylar.internal.jira.ui.wizards.JiraRepositorySettingsPage;
30
import org.eclipse.mylar.internal.jira.ui.wizards.JiraRepositorySettingsPage;
27
import org.eclipse.mylar.internal.jira.ui.wizards.NewJiraQueryWizard;
31
import org.eclipse.mylar.internal.jira.ui.wizards.NewJiraQueryWizard;
28
import org.eclipse.mylar.internal.tasklist.ui.TaskUiUtil;
32
import org.eclipse.mylar.internal.tasklist.ui.TaskUiUtil;
Lines 35-42 Link Here
35
import org.eclipse.mylar.provisional.tasklist.ITask;
39
import org.eclipse.mylar.provisional.tasklist.ITask;
36
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
40
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
37
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
41
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
42
import org.eclipse.swt.widgets.Shell;
43
import org.eclipse.ui.PlatformUI;
38
import org.tigris.jira.core.model.Issue;
44
import org.tigris.jira.core.model.Issue;
39
import org.tigris.jira.core.model.filter.IssueCollector;
45
import org.tigris.jira.core.model.filter.IssueCollector;
46
import org.tigris.jira.core.service.JiraServer;
40
47
41
/**
48
/**
42
 * @author Mik Kersten
49
 * @author Mik Kersten
Lines 56-68 Link Here
56
		
63
		
57
		private final IProgressMonitor monitor;
64
		private final IProgressMonitor monitor;
58
65
59
		private final JiraRepositoryQuery query;
66
		private final AbstractRepositoryQuery query;
60
67
61
		private final List<AbstractQueryHit> hits;
68
		private final List<AbstractQueryHit> hits;
62
		
69
		
63
		private boolean done = false;
70
		private boolean done = false;
64
71
65
		private JiraIssueCollector(IProgressMonitor monitor, JiraRepositoryQuery query, List<AbstractQueryHit> hits) {
72
		JiraIssueCollector(IProgressMonitor monitor, AbstractRepositoryQuery query, List<AbstractQueryHit> hits) {
66
			this.monitor = monitor;
73
			this.monitor = monitor;
67
			this.query = query;
74
			this.query = query;
68
			this.hits = hits;
75
			this.hits = hits;
Lines 135-165 Link Here
135
		return new AddExistingJiraTaskWizard(repository);
142
		return new AddExistingJiraTaskWizard(repository);
136
	}
143
	}
137
144
145
	
146
	
138
	@Override
147
	@Override
139
	public void openEditQueryDialog(AbstractRepositoryQuery query) {
148
	public void openEditQueryDialog(AbstractRepositoryQuery query) {
140
		JiraRepositoryQuery filter = (JiraRepositoryQuery) query;
149
//		JiraRepositoryQuery filter = (JiraRepositoryQuery) query;
141
		String title = "Filter: " + filter.getDescription();
150
//		String title = "Filter: " + filter.getDescription();
142
		TaskUiUtil.openUrl(title, title, filter.getQueryUrl());
151
//		TaskUiUtil.openUrl(title, title, filter.getQueryUrl());
152
		
153
//		if (query instanceof JiraRepositoryQuery) {
154
//			JiraRepositoryQuery filter = (JiraRepositoryQuery) query;
155
//			String title = "Filter: " + filter.getDescription();
156
//			TaskUiUtil.openUrl(title, title, filter.getQueryUrl());
157
//		} else if(query instanceof JiraCustomQuery) {
158
//			// new JiraQueryWizardPage();
159
//		}
160
		
161
		try {
162
			TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getRepository(
163
					query.getRepositoryKind(), query.getRepositoryUrl());
164
			if (repository == null)
165
				return;
166
167
			IWizard wizard = this.getEditQueryWizard(repository, query);
168
169
			Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
170
			if (wizard != null && shell != null && !shell.isDisposed()) {
171
				WizardDialog dialog = new WizardDialog(shell, wizard);
172
				dialog.create();
173
				dialog.setTitle("Edit Jira Query");
174
				dialog.setBlockOnOpen(true);
175
				if (dialog.open() == Window.CANCEL) {
176
					dialog.close();
177
					return;
178
				}
179
			}
180
		} catch (Exception e) {
181
			MylarStatusHandler.fail(e, e.getMessage(), true);
182
		}
183
		
184
	}
185
186
	private IWizard getEditQueryWizard(TaskRepository repository, AbstractRepositoryQuery query) {
187
		if (query instanceof JiraRepositoryQuery || query instanceof JiraCustomQuery) {
188
			return new EditJiraQueryWizard(repository, query);
189
		}
190
		return null;
143
	}
191
	}
144
192
145
	@Override
193
	@Override
146
	protected List<AbstractQueryHit> performQuery(AbstractRepositoryQuery repositoryQuery,
194
	protected List<AbstractQueryHit> performQuery(AbstractRepositoryQuery repositoryQuery,
147
			final IProgressMonitor monitor, MultiStatus queryStatus) {
195
			final IProgressMonitor monitor, MultiStatus queryStatus) {
148
		if (!(repositoryQuery instanceof JiraRepositoryQuery)) {
149
			return Collections.emptyList();
150
		}
151
		final JiraRepositoryQuery jiraRepositoryQuery = (JiraRepositoryQuery) repositoryQuery;
152
		final List<AbstractQueryHit> hits = new ArrayList<AbstractQueryHit>();
196
		final List<AbstractQueryHit> hits = new ArrayList<AbstractQueryHit>();
153
		JiraIssueCollector collector = new JiraIssueCollector(monitor, jiraRepositoryQuery, hits);
154
		try {
155
			TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getRepository(
156
					MylarJiraPlugin.REPOSITORY_KIND, repositoryQuery.getRepositoryUrl());
157
			JiraServerFacade.getDefault().getJiraServer(repository).search(jiraRepositoryQuery.getNamedFilter(), collector);
158
197
198
		TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getRepository(
199
				MylarJiraPlugin.REPOSITORY_KIND, repositoryQuery.getRepositoryUrl());
200
201
		JiraIssueCollector collector = new JiraIssueCollector(monitor, repositoryQuery, hits);
202
203
		try {
204
			JiraServer jiraServer = JiraServerFacade.getDefault().getJiraServer(repository);
205
			
206
			if (repositoryQuery instanceof JiraRepositoryQuery) {			
207
				jiraServer.search(((JiraRepositoryQuery) repositoryQuery).getNamedFilter(), collector);
208
209
			} else if (repositoryQuery instanceof JiraCustomQuery) {
210
				jiraServer.search(((JiraCustomQuery) repositoryQuery).getFilterDefinition(), collector);
211
			}	
159
		} catch (Exception e) {
212
		} catch (Exception e) {
160
			queryStatus.add(new Status(IStatus.OK, MylarTaskListPlugin.PLUGIN_ID, IStatus.OK,
213
			queryStatus.add(new Status(IStatus.OK, MylarTaskListPlugin.PLUGIN_ID, IStatus.OK, 
161
					"Could not log in to server: " + repositoryQuery.getRepositoryUrl()
214
					"Could not log in to server: " + repositoryQuery.getRepositoryUrl()
162
							+ "\n\nCheck network connection.", e));
215
					+ "\n\nCheck network connection.", e));
163
		}
216
		}
164
		queryStatus.add(Status.OK_STATUS);
217
		queryStatus.add(Status.OK_STATUS);
165
		return hits;
218
		return hits;
Lines 219-231 Link Here
219
	public String getRepositoryUrlFromTaskUrl(String url) {
272
	public String getRepositoryUrlFromTaskUrl(String url) {
220
		if (url == null) {
273
		if (url == null) {
221
			return null;
274
			return null;
222
		} else {
223
			int index = url.indexOf(DELIM_URL);
224
			if (index != -1) {
225
				return url.substring(0, index);
226
			} else {
227
				return null;
228
			}
229
		}
275
		}
276
		int index = url.indexOf(DELIM_URL);
277
		if (index != -1) {
278
			return url.substring(0, index);
279
		}
280
		return null;
230
	}
281
	}
231
}
282
}
(-)src/org/eclipse/mylar/internal/jira/JiraTaskExternalizer.java (-15 / +88 lines)
Lines 11-16 Link Here
11
11
12
package org.eclipse.mylar.internal.jira;
12
package org.eclipse.mylar.internal.jira;
13
13
14
import java.io.ByteArrayInputStream;
15
import java.io.ByteArrayOutputStream;
16
import java.io.IOException;
17
import java.io.ObjectInputStream;
18
import java.io.ObjectOutputStream;
19
import java.io.StringWriter;
20
14
import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
21
import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
15
import org.eclipse.mylar.internal.tasklist.TaskExternalizationException;
22
import org.eclipse.mylar.internal.tasklist.TaskExternalizationException;
16
import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
23
import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
Lines 24-29 Link Here
24
import org.eclipse.mylar.provisional.tasklist.TaskList;
31
import org.eclipse.mylar.provisional.tasklist.TaskList;
25
import org.tigris.jira.core.model.Issue;
32
import org.tigris.jira.core.model.Issue;
26
import org.tigris.jira.core.model.NamedFilter;
33
import org.tigris.jira.core.model.NamedFilter;
34
import org.tigris.jira.core.model.filter.FilterDefinition;
27
import org.w3c.dom.Document;
35
import org.w3c.dom.Document;
28
import org.w3c.dom.Element;
36
import org.w3c.dom.Element;
29
import org.w3c.dom.Node;
37
import org.w3c.dom.Node;
Lines 38-49 Link Here
38
	private static final String KEY_ISSUE_SUMMARY = "IssueSummary";
46
	private static final String KEY_ISSUE_SUMMARY = "IssueSummary";
39
47
40
	private static final String KEY_JIRA = "Jira";
48
	private static final String KEY_JIRA = "Jira";
49
	private static final String KEY_CUSTOM = "JiraCustom";
41
50
42
	private static final String KEY_JIRA_CATEGORY = "JiraQuery" + KEY_CATEGORY;
51
	private static final String KEY_JIRA_CATEGORY = "JiraQuery" + KEY_CATEGORY;
43
52
44
	private static final String KEY_JIRA_QUERY_HIT = KEY_JIRA + KEY_QUERY_HIT;
53
	private static final String KEY_JIRA_QUERY_HIT = KEY_JIRA + KEY_QUERY_HIT;
45
54
46
	private static final String KEY_JIRA_QUERY = KEY_JIRA + KEY_QUERY;
55
	private static final String KEY_JIRA_QUERY = KEY_JIRA + KEY_QUERY;
56
	private static final String KEY_JIRA_CUSTOM = KEY_JIRA + KEY_CUSTOM + KEY_QUERY;
47
57
48
	private static final String KEY_JIRA_ISSUE = "JiraIssue";
58
	private static final String KEY_JIRA_ISSUE = "JiraIssue";
49
59
Lines 53-64 Link Here
53
63
54
	private static final String KEY_FILTER_DESCRIPTION = "FilterDesc";
64
	private static final String KEY_FILTER_DESCRIPTION = "FilterDesc";
55
65
66
	private static final String KEY_FILTER_CUSTOM = "FilterCustom";
67
68
	
56
	public boolean canReadQuery(Node node) {
69
	public boolean canReadQuery(Node node) {
57
		return node.getNodeName().equals(KEY_JIRA_QUERY);
70
		return node.getNodeName().equals(KEY_JIRA_QUERY) 
71
			|| node.getNodeName().equals(KEY_JIRA_CUSTOM);
58
	}
72
	}
59
73
60
	public boolean canCreateElementFor(AbstractRepositoryQuery category) {
74
	public boolean canCreateElementFor(AbstractRepositoryQuery category) {
61
		return category instanceof JiraRepositoryQuery;
75
		return category instanceof JiraRepositoryQuery 
76
			|| category instanceof JiraCustomQuery;
62
	}
77
	}
63
78
64
	public boolean canCreateElementFor(ITask task) {
79
	public boolean canCreateElementFor(ITask task) {
Lines 69-80 Link Here
69
		boolean hasCaughtException = false;
84
		boolean hasCaughtException = false;
70
		Element element = (Element) node;
85
		Element element = (Element) node;
71
86
72
		NamedFilter namedFilter = new NamedFilter();
87
		AbstractRepositoryQuery query;
73
		namedFilter.setId(element.getAttribute(KEY_FILTER_ID));
88
		String custom = element.getAttribute(KEY_FILTER_CUSTOM);
74
		namedFilter.setName(element.getAttribute(KEY_FILTER_NAME));
89
		if(custom!=null) {
75
//		namedFilter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
90
			FilterDefinition filter = decodeFilter(custom);
76
91
			filter.setName(element.getAttribute(KEY_FILTER_ID));
77
		AbstractRepositoryQuery query = new JiraRepositoryQuery(element.getAttribute(KEY_REPOSITORY_URL), namedFilter, MylarTaskListPlugin.getTaskListManager().getTaskList());
92
			filter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
93
			
94
			query = new JiraCustomQuery(element.getAttribute(KEY_REPOSITORY_URL), filter, MylarTaskListPlugin.getTaskListManager().getTaskList());
95
		} else {
96
			NamedFilter namedFilter = new NamedFilter();
97
			namedFilter.setId(element.getAttribute(KEY_FILTER_ID));
98
			namedFilter.setName(element.getAttribute(KEY_FILTER_NAME));
99
			namedFilter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
100
			
101
			query = new JiraRepositoryQuery(element.getAttribute(KEY_REPOSITORY_URL), namedFilter, MylarTaskListPlugin.getTaskListManager().getTaskList());
102
		}
78
		
103
		
79
		NodeList list = node.getChildNodes();
104
		NodeList list = node.getChildNodes();
80
		for (int i = 0; i < list.getLength(); i++) {
105
		for (int i = 0; i < list.getLength(); i++) {
Lines 87-111 Link Here
87
		}
112
		}
88
		if (hasCaughtException) {
113
		if (hasCaughtException) {
89
			throw new TaskExternalizationException("Failed to load all hits");
114
			throw new TaskExternalizationException("Failed to load all hits");
90
		} else {
91
			return query;
92
		}
115
		}
116
		return query;
93
	}
117
	}
94
118
95
	public Element createQueryElement(AbstractRepositoryQuery query, Document doc, Element parent) {
119
	public Element createQueryElement(AbstractRepositoryQuery query, Document doc, Element parent) {
96
		String queryTagName = getQueryTagNameForElement(query);
120
		String queryTagName = getQueryTagNameForElement(query);
97
		Element node = doc.createElement(queryTagName);
121
		Element node = doc.createElement(queryTagName);
98
122
99
		NamedFilter filter = ((JiraRepositoryQuery) query).getNamedFilter();
100
		node.setAttribute(KEY_NAME, query.getDescription());
123
		node.setAttribute(KEY_NAME, query.getDescription());
101
		node.setAttribute(KEY_QUERY_MAX_HITS, query.getMaxHits() + "");
124
		node.setAttribute(KEY_QUERY_MAX_HITS, query.getMaxHits() + "");
102
		node.setAttribute(KEY_QUERY_STRING, query.getQueryUrl());
125
		node.setAttribute(KEY_QUERY_STRING, query.getQueryUrl());
103
		node.setAttribute(KEY_REPOSITORY_URL, query.getRepositoryUrl());
126
		node.setAttribute(KEY_REPOSITORY_URL, query.getRepositoryUrl());
104
127
105
		node.setAttribute(KEY_FILTER_ID, filter.getId());
128
		if (query instanceof JiraRepositoryQuery) {
106
		node.setAttribute(KEY_FILTER_NAME, filter.getName());
129
			NamedFilter filter = ((JiraRepositoryQuery) query).getNamedFilter();
107
		node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
130
			node.setAttribute(KEY_FILTER_ID, filter.getId());
108
131
			node.setAttribute(KEY_FILTER_NAME, filter.getName());
132
			node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
133
		} else {
134
			FilterDefinition filter = ((JiraCustomQuery) query).getFilterDefinition();
135
			node.setAttribute(KEY_FILTER_ID, filter.getName());			
136
			node.setAttribute(KEY_FILTER_NAME, filter.getName());
137
			node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
138
			
139
			// XXX implement actual export 
140
			node.setAttribute(KEY_FILTER_CUSTOM, encodeFilter(filter));
141
		}
142
		
109
		for (AbstractQueryHit hit : query.getHits()) {
143
		for (AbstractQueryHit hit : query.getHits()) {
110
			try {
144
			try {
111
				Element element = null;
145
				Element element = null;
Lines 123-128 Link Here
123
		return node;
157
		return node;
124
	}
158
	}
125
		
159
		
160
	private String encodeFilter(FilterDefinition filter) {
161
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
162
		ObjectOutputStream oos; 
163
		try {
164
			oos = new ObjectOutputStream(bos);
165
			oos.writeObject(filter);
166
			oos.flush();
167
		} catch (IOException ex) {
168
			return null;
169
		}
170
171
		StringWriter sw = new StringWriter();
172
		byte[] bytes = bos.toByteArray();
173
		for (int i = 0; i < bytes.length; i++) {
174
			byte b = bytes[i];
175
			sw.append((char) ('A' + (b >> 4))).append((char) ('A'+ (b & 0xf)));
176
		}
177
		return sw.toString();
178
	}
179
180
	private FilterDefinition decodeFilter(String filter) {
181
		byte[] buff = new byte[filter.length()/2];
182
		char[] chars = filter.toCharArray();
183
		for (int i = 0, k = 0; i < chars.length; i += 2, k++) {
184
			buff[k] = (byte) ((((chars[i] - 'A') << 4) | (chars[i+1] - 'A')) & 0xff);
185
		}
186
		
187
		ObjectInputStream ois;
188
		try {
189
			ois = new ObjectInputStream(new ByteArrayInputStream(buff));
190
			return (FilterDefinition) ois.readObject();
191
		} catch (Exception ex) {
192
			// TODO Auto-generated catch block
193
			return null;
194
		}
195
	}
196
	
126
	@Override
197
	@Override
127
	public String getTaskTagName() {
198
	public String getTaskTagName() {
128
		return KEY_JIRA_ISSUE;
199
		return KEY_JIRA_ISSUE;
Lines 226-231 Link Here
226
	public String getQueryTagNameForElement(AbstractRepositoryQuery query) {
297
	public String getQueryTagNameForElement(AbstractRepositoryQuery query) {
227
		if (query instanceof JiraRepositoryQuery) {
298
		if (query instanceof JiraRepositoryQuery) {
228
			return KEY_JIRA_QUERY;
299
			return KEY_JIRA_QUERY;
300
		} else if( query instanceof JiraCustomQuery) {
301
			return KEY_JIRA_CUSTOM;
229
		}
302
		}
230
		return "";
303
		return "";
231
	}
304
	}
(-)src/org/eclipse/mylar/internal/jira/ui/wizards/NewJiraQueryWizard.java (-8 / +16 lines)
Lines 12-22 Link Here
12
package org.eclipse.mylar.internal.jira.ui.wizards;
12
package org.eclipse.mylar.internal.jira.ui.wizards;
13
13
14
import org.eclipse.jface.wizard.Wizard;
14
import org.eclipse.jface.wizard.Wizard;
15
import org.eclipse.mylar.internal.jira.JiraRepositoryQuery;
16
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector;
15
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector;
16
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
17
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
17
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
18
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
18
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
19
import org.tigris.jira.core.model.NamedFilter;
20
19
21
/**
20
/**
22
 * Wizard that allows the user to select one of their named Jira filters on the
21
 * Wizard that allows the user to select one of their named Jira filters on the
Lines 24-29 Link Here
24
 * 
23
 * 
25
 * @author Mik Kersten
24
 * @author Mik Kersten
26
 * @author Wesley Coelho (initial integration patch)
25
 * @author Wesley Coelho (initial integration patch)
26
 * @author Eugene Kuleshov (integration with editor pages)
27
 */
27
 */
28
public class NewJiraQueryWizard extends Wizard {
28
public class NewJiraQueryWizard extends Wizard {
29
29
Lines 42-61 Link Here
42
	@Override
42
	@Override
43
	public void addPages() {
43
	public void addPages() {
44
		queryPage = new JiraQueryWizardPage(repository);
44
		queryPage = new JiraQueryWizardPage(repository);
45
		queryPage.setWizard(this);
45
		addPage(queryPage);
46
		addPage(queryPage);
46
	}
47
	}
47
48
48
	@Override
49
	@Override
49
	public boolean performFinish() {
50
	public boolean performFinish() {
50
51
51
		NamedFilter namedFilter = queryPage.getSelectedFilter();
52
		AbstractRepositoryQuery query = queryPage.getQuery();
52
53
		if (query != null) {
53
		if (namedFilter != null) {
54
			MylarTaskListPlugin.getTaskListManager().getTaskList().addQuery(query);
54
			JiraRepositoryQuery filter = new JiraRepositoryQuery(repository.getUrl(), namedFilter, MylarTaskListPlugin.getTaskListManager().getTaskList());
55
			MylarTaskListPlugin.getTaskListManager().getTaskList().addQuery(filter);
56
			AbstractRepositoryConnector connector = MylarTaskListPlugin.getRepositoryManager().getRepositoryConnector(repository.getKind());
55
			AbstractRepositoryConnector connector = MylarTaskListPlugin.getRepositoryManager().getRepositoryConnector(repository.getKind());
57
			if (connector != null) {
56
			if (connector != null) {
58
				connector.synchronize(filter, null);
57
				connector.synchronize(query, null);
59
			}
58
			}
60
//			filter.refreshHits();
59
//			filter.refreshHits();
61
		} 
60
		} 
Lines 63-66 Link Here
63
		return true;
62
		return true;
64
	}
63
	}
65
64
65
	
66
	
67
	public boolean canFinish() {
68
		if(queryPage.getNextPage() == null) {
69
			return queryPage.isPageComplete();
70
		}
71
		return queryPage.getNextPage().isPageComplete();
72
	}
73
	
66
}
74
}
(-)src/org/eclipse/mylar/internal/jira/ui/wizards/JiraQueryWizardPage.java (-25 / +109 lines)
Lines 16-23 Link Here
16
import org.eclipse.core.runtime.Status;
16
import org.eclipse.core.runtime.Status;
17
import org.eclipse.core.runtime.jobs.Job;
17
import org.eclipse.core.runtime.jobs.Job;
18
import org.eclipse.jface.dialogs.MessageDialog;
18
import org.eclipse.jface.dialogs.MessageDialog;
19
import org.eclipse.jface.wizard.IWizardPage;
19
import org.eclipse.jface.wizard.WizardPage;
20
import org.eclipse.jface.wizard.WizardPage;
21
import org.eclipse.mylar.internal.jira.JiraCustomQuery;
22
import org.eclipse.mylar.internal.jira.JiraRepositoryQuery;
20
import org.eclipse.mylar.internal.jira.JiraServerFacade;
23
import org.eclipse.mylar.internal.jira.JiraServerFacade;
24
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
25
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
21
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
26
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
22
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.events.SelectionAdapter;
28
import org.eclipse.swt.events.SelectionAdapter;
Lines 25-35 Link Here
25
import org.eclipse.swt.layout.GridData;
30
import org.eclipse.swt.layout.GridData;
26
import org.eclipse.swt.layout.GridLayout;
31
import org.eclipse.swt.layout.GridLayout;
27
import org.eclipse.swt.widgets.Button;
32
import org.eclipse.swt.widgets.Button;
28
import org.eclipse.swt.widgets.Combo;
29
import org.eclipse.swt.widgets.Composite;
33
import org.eclipse.swt.widgets.Composite;
30
import org.eclipse.swt.widgets.Display;
34
import org.eclipse.swt.widgets.Display;
31
import org.eclipse.swt.widgets.Label;
35
import org.eclipse.swt.widgets.List;
32
import org.tigris.jira.core.model.NamedFilter;
36
import org.tigris.jira.core.model.NamedFilter;
37
import org.tigris.jira.core.model.filter.FilterDefinition;
33
import org.tigris.jira.core.service.JiraServer;
38
import org.tigris.jira.core.service.JiraServer;
34
39
35
/**
40
/**
Lines 38-66 Link Here
38
 * 
43
 * 
39
 * @author Mik Kersten
44
 * @author Mik Kersten
40
 * @author Wesley Coelho (initial integration patch)
45
 * @author Wesley Coelho (initial integration patch)
46
 * @author Eugene Kuleshov (layout and other improvements)
41
 */
47
 */
42
public class JiraQueryWizardPage extends WizardPage {
48
public class JiraQueryWizardPage extends WizardPage {
43
49
44
	private static final int COMBO_WIDTH_HINT = 200;
50
	// private static final int COMBO_WIDTH_HINT = 200;
45
51
46
	private static final String TITLE = "New Jira Query";
52
	private static final String TITLE = "New Jira Query";
47
53
48
	private static final String DESCRIPTION = "Please select a filter defined on the server.";
54
	private static final String DESCRIPTION = "Please select a filter defined on the server.";
49
55
50
	private static final String COMBO_LABEL = "Filter:";
56
	// private static final String COMBO_LABEL = "Filter:";
51
57
52
	private static final String WAIT_MESSAGE = "Downloading...";
58
	private static final String WAIT_MESSAGE = "Downloading...";
53
59
54
	private static final String JOB_LABEL = "Downloading Filter Names";
60
	private static final String JOB_LABEL = "Downloading Filter Names";
55
61
56
	private NamedFilter[] filters = null;
62
	NamedFilter[] filters = null;
57
63
58
	private Combo filterCombo = null;
64
	List filterCombo;
59
	
65
60
	private TaskRepository repository;
66
	TaskRepository repository;
67
68
	Button updateButton = null;
69
70
	private Button buttonCustom;
71
72
	Button buttonSaved;
73
74
	private FilterSummaryPage filterSummaryPage;
75
76
	private AbstractRepositoryQuery query;
61
77
62
	private Button updateButton = null;
63
	
64
	public JiraQueryWizardPage(TaskRepository repository) {
78
	public JiraQueryWizardPage(TaskRepository repository) {
65
		super(TITLE);
79
		super(TITLE);
66
		this.repository = repository;
80
		this.repository = repository;
Lines 69-75 Link Here
69
		setPageComplete(false);
83
		setPageComplete(false);
70
	}
84
	}
71
85
86
	public JiraQueryWizardPage(TaskRepository repository, AbstractRepositoryQuery query) {
87
		super(TITLE);
88
		this.repository = repository;
89
		this.query = query;
90
		setTitle(TITLE);
91
		setDescription(DESCRIPTION);
92
		setPageComplete(false);
93
	}
94
72
	public void createControl(Composite parent) {
95
	public void createControl(Composite parent) {
96
		boolean isCustom = query==null || query instanceof JiraCustomQuery;
97
		boolean isRepository = query instanceof JiraRepositoryQuery;
73
98
74
		final Composite innerComposite = new Composite(parent, SWT.NONE);
99
		final Composite innerComposite = new Composite(parent, SWT.NONE);
75
		innerComposite.setLayoutData(new GridData());
100
		innerComposite.setLayoutData(new GridData());
Lines 77-99 Link Here
77
		gl.numColumns = 2;
102
		gl.numColumns = 2;
78
		innerComposite.setLayout(gl);
103
		innerComposite.setLayout(gl);
79
104
80
		Label label = new Label(innerComposite, SWT.NONE);
105
		buttonCustom = new Button(innerComposite, SWT.RADIO);
81
		label.setText(COMBO_LABEL);
106
		buttonCustom.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
82
		label.setLayoutData(new GridData());
107
		buttonCustom.setText("Custom Query");
108
		buttonCustom.setSelection(isCustom);
109
110
		buttonSaved = new Button(innerComposite, SWT.RADIO);
111
		buttonSaved.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
112
		buttonSaved.setText("Saved Query");
113
		buttonSaved.setSelection(isRepository);
114
		
115
		buttonSaved.addSelectionListener(new SelectionAdapter() {
116
			public void widgetSelected(SelectionEvent e) {
117
				boolean selection = buttonSaved.getSelection();
118
				filterCombo.setEnabled(selection);
119
				updateButton.setEnabled(selection);
120
				setPageComplete(selection);
121
			}
122
		});
83
123
84
		filterCombo = new Combo(innerComposite, SWT.READ_ONLY);
124
		filterCombo = new List(innerComposite, SWT.V_SCROLL | SWT.BORDER);
85
		filterCombo.add(WAIT_MESSAGE);
125
		filterCombo.add(WAIT_MESSAGE);
86
		filterCombo.select(0);
126
		filterCombo.select(0);  // XXX
87
127
		
88
		GridData data = new GridData();
128
		GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
89
		data.widthHint = COMBO_WIDTH_HINT;
129
		data.horizontalIndent = 15;
90
		filterCombo.setLayoutData(data);
130
		filterCombo.setLayoutData(data);
131
		filterCombo.setEnabled(isRepository);
91
132
92
		new Label(innerComposite, SWT.NULL); // spacer
93
		updateButton = new Button(innerComposite, SWT.LEFT | SWT.PUSH);
133
		updateButton = new Button(innerComposite, SWT.LEFT | SWT.PUSH);
94
		updateButton.setText("Update Filters from Repository");
134
		final GridData gridData = new GridData(SWT.FILL, SWT.TOP, false, true);
135
		updateButton.setLayoutData(gridData);
136
		updateButton.setText("Update from Repository");
137
		updateButton.setEnabled(isRepository);
95
		updateButton.addSelectionListener(new SelectionAdapter() {
138
		updateButton.addSelectionListener(new SelectionAdapter() {
96
		
139
97
			@Override
140
			@Override
98
			public void widgetSelected(SelectionEvent e) {
141
			public void widgetSelected(SelectionEvent e) {
99
				filterCombo.removeAll();
142
				filterCombo.removeAll();
Lines 102-114 Link Here
102
				JiraServerFacade.getDefault().refreshServerSettings(repository);
145
				JiraServerFacade.getDefault().refreshServerSettings(repository);
103
				downloadFilters();
146
				downloadFilters();
104
			}
147
			}
105
		
148
106
		});
149
		});
107
		
150
108
		setControl(innerComposite);
151
		setControl(innerComposite);
109
		downloadFilters();
152
		downloadFilters();
110
	}
153
	}
111
154
155
	public IWizardPage getNextPage() {
156
		if (!buttonCustom.getSelection()) {
157
			return null;
158
		}
159
		if (filterSummaryPage == null) {
160
			FilterDefinition workingCopy = new FilterDefinition();
161
			boolean isAdd = true;
162
163
			filterSummaryPage = new FilterSummaryPage(repository, "summaryPage", "Filter Summary", null, workingCopy,
164
					isAdd);
165
			filterSummaryPage.setWizard(getWizard());
166
		}
167
		return filterSummaryPage;
168
	}
169
170
	public boolean canFlipToNextPage() {
171
		return buttonCustom.getSelection();
172
	}
173
112
	protected void downloadFilters() {
174
	protected void downloadFilters() {
113
		Job job = new Job(JOB_LABEL) {
175
		Job job = new Job(JOB_LABEL) {
114
			@Override
176
			@Override
Lines 144-163 Link Here
144
206
145
		filterCombo.removeAll();
207
		filterCombo.removeAll();
146
208
209
		String id = null;
210
		if(query instanceof JiraRepositoryQuery) {
211
			id = ((JiraRepositoryQuery) query).getNamedFilter().getId();
212
		}
213
214
		int n = 0;
147
		for (int i = 0; i < filters.length; i++) {
215
		for (int i = 0; i < filters.length; i++) {
148
			filterCombo.add(filters[i].getName());
216
			filterCombo.add(filters[i].getName());
217
			if(filters[i].getId().equals(id)) {
218
				n = i;
219
			}
149
		}
220
		}
150
221
151
		filterCombo.select(0);
222
		filterCombo.select(n);
152
		setPageComplete(true);
223
		setPageComplete(true);
153
	}
224
	}
154
225
155
	/** Returns the filter selected by the user or null on failure */
226
	/** Returns the filter selected by the user or null on failure */
156
	public NamedFilter getSelectedFilter() {
227
	private NamedFilter getSelectedFilter() {
157
		if (filters != null && filters.length > 0) {
228
		if (filters != null && filters.length > 0) {
158
			return filters[filterCombo.getSelectionIndex()];
229
			return filters[filterCombo.getSelectionIndex()];
159
		}
230
		}
160
		return null;
231
		return null;
161
	}
232
	}
162
233
234
	public AbstractRepositoryQuery getQuery() {
235
		if (buttonSaved.getSelection()) {
236
			return new JiraRepositoryQuery(repository.getUrl(), getSelectedFilter(), MylarTaskListPlugin
237
					.getTaskListManager().getTaskList());
238
		}
239
240
		if (filterSummaryPage != null) {
241
			return filterSummaryPage.getQuery();
242
		}
243
244
		return null;
245
	}
246
163
}
247
}
(-)src/org/eclipse/mylar/internal/jira/ui/wizards/EditJiraQueryWizard.java (+80 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004 - 2006 University Of British Columbia and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     University Of British Columbia - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylar.internal.jira.ui.wizards;
13
14
import org.eclipse.jface.wizard.Wizard;
15
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector;
16
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
17
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
18
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
19
20
/**
21
 * @author Rob Elves
22
 */
23
public class EditJiraQueryWizard extends Wizard {
24
25
	private static final String TITLE = "Edit Bugzilla Query";
26
27
	private final TaskRepository repository;
28
29
	private AbstractRepositoryQuery query;
30
31
	private JiraQueryWizardPage queryPage;
32
33
	public EditJiraQueryWizard(TaskRepository repository, AbstractRepositoryQuery query) {
34
		this.repository = repository;
35
		this.query = query;
36
		setNeedsProgressMonitor(true);
37
		setWindowTitle(TITLE);
38
	}
39
40
	@Override
41
	public void addPages() {
42
		queryPage = new JiraQueryWizardPage(repository, query);
43
		queryPage.setWizard(this);
44
		addPage(queryPage);
45
	}
46
47
	@Override
48
	public boolean performFinish() {
49
50
		AbstractRepositoryQuery q = queryPage.getQuery();
51
		if (q != null) {
52
			
53
//			String name;
54
//			if (q instanceof JiraRepositoryQuery) {
55
//				name = ((JiraRepositoryQuery) q).getNamedFilter().getName();
56
//			} else {
57
//				name = ((JiraCustomQuery) query).getFilterDefinition().getName();
58
//			}
59
			
60
			MylarTaskListPlugin.getTaskListManager().getTaskList().deleteQuery(query);
61
			MylarTaskListPlugin.getTaskListManager().getTaskList().addQuery(q);
62
			
63
			AbstractRepositoryConnector connector = MylarTaskListPlugin.getRepositoryManager().getRepositoryConnector(repository.getKind());
64
			if (connector != null) {
65
				connector.synchronize(q, null);
66
			}
67
//			filter.refreshHits();
68
		} 
69
70
		return true;
71
	}
72
73
	@Override
74
	public boolean canFinish() {
75
		if(queryPage.getNextPage() == null) {
76
			return queryPage.isPageComplete();
77
		}
78
		return queryPage.getNextPage().isPageComplete();
79
	}
80
}
(-)src/org/eclipse/mylar/internal/jira/JiraCustomQuery.java (+130 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 - 2006 Mylar eclipse.org project and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Mylar project committers - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylar.internal.jira;
13
14
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
15
import org.eclipse.mylar.provisional.tasklist.TaskList;
16
import org.tigris.jira.core.model.filter.FilterDefinition;
17
18
/**
19
 * A JiraFilter represents a query for issues from a Jira repository.
20
 * 
21
 * @author Mik Kersten
22
 */
23
public class JiraCustomQuery extends AbstractRepositoryQuery {
24
25
	private static final int MAX_HITS = 75;
26
27
	protected FilterDefinition filter = null;
28
29
//	private boolean isRefreshing = false;
30
31
	public JiraCustomQuery(String repositoryUrl, FilterDefinition filter, TaskList taskList) {
32
		super(filter.getName(), taskList);
33
		setMaxHits(MAX_HITS);
34
		this.filter = filter;
35
		super.repositoryUrl = repositoryUrl;
36
		setQueryUrl(repositoryUrl + MylarJiraPlugin.FILTER_URL_PREFIX + filter.getName());
37
//		super.setDescription(filter.getName());
38
	}
39
40
	public String getRepositoryKind() {
41
		return MylarJiraPlugin.REPOSITORY_KIND;
42
	}
43
	
44
	public FilterDefinition getFilterDefinition() {
45
		return filter;
46
	}
47
}
48
49
//public void refreshHits() {
50
//isRefreshing = true;
51
//Job j = new Job(LABEL_REFRESH_JOB) {
52
//
53
//	@Override
54
//	protected IStatus run(final IProgressMonitor monitor) {
55
//		clearHits();
56
//		try {
57
//			TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getRepository(MylarJiraPlugin.JIRA_REPOSITORY_KIND, repositoryUrl);
58
//			JiraServerFacade.getDefault().getJiraServer(repository).executeNamedFilter(filter, new IssueCollector() {
59
//
60
//				public void done() {
61
//					isRefreshing = false;
62
//					Display.getDefault().asyncExec(new Runnable() {
63
//						public void run() {
64
//							if (TaskListView.getDefault() != null)
65
//								TaskListView.getDefault().refreshAndFocus();
66
//						}
67
//					});
68
//				}
69
//
70
//				public boolean isCancelled() {
71
//					return monitor.isCanceled();
72
//				}
73
//
74
//				public void collectIssue(Issue issue) {
75
//					int issueId = new Integer(issue.getId());
76
//					JiraFilterHit hit = new JiraFilterHit(issue, JiraFilter.this.getRepositoryUrl(), issueId);
77
//					addHit(hit);
78
//				}
79
//
80
//				public void start() {
81
//
82
//				}
83
//			});
84
//
85
//		} catch (Exception e) {
86
//			isRefreshing = false;
87
//			JiraServerFacade.handleConnectionException(e);
88
//			return Status.CANCEL_STATUS;
89
//		}
90
//
91
//		return Status.OK_STATUS;
92
//	}
93
//
94
//};
95
//
96
//j.schedule();
97
//
98
//}
99
100
//public String getQueryUrl() {
101
//return super.getQueryUrl();
102
//}
103
104
//public String getPriority() {
105
//return "";
106
//}
107
108
//public String getDescription() {
109
//if (filter.getName() != null) {
110
//	return filter.getName();
111
//} else {
112
//	return super.getDescription();
113
//}
114
//}
115
//
116
//public void setDescription(String description) {
117
//filter.setDescription(description);
118
//}
119
120
//public boolean isLocal() {
121
//return false;
122
//}
123
124
///** True if the filter is currently downloading hits */
125
//public boolean isRefreshing() {
126
//return isRefreshing;
127
//}
128
//public void setRefreshing(boolean refreshing) {
129
//this.isRefreshing = refreshing;
130
//}
(-)src/org/eclipse/mylar/internal/jira/ui/wizards/FilterSummaryPage.java (+863 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 - 2006 Mylar eclipse.org project and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Brock Janiczak - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylar.internal.jira.ui.wizards;
13
14
import java.util.ArrayList;
15
import java.util.Iterator;
16
import java.util.List;
17
18
import org.eclipse.jface.resource.ImageDescriptor;
19
import org.eclipse.jface.viewers.IColorProvider;
20
import org.eclipse.jface.viewers.ILabelProvider;
21
import org.eclipse.jface.viewers.ILabelProviderListener;
22
import org.eclipse.jface.viewers.ISelectionChangedListener;
23
import org.eclipse.jface.viewers.IStructuredContentProvider;
24
import org.eclipse.jface.viewers.IStructuredSelection;
25
import org.eclipse.jface.viewers.LabelProvider;
26
import org.eclipse.jface.viewers.ListViewer;
27
import org.eclipse.jface.viewers.SelectionChangedEvent;
28
import org.eclipse.jface.viewers.StructuredSelection;
29
import org.eclipse.jface.viewers.Viewer;
30
import org.eclipse.jface.wizard.IWizardPage;
31
import org.eclipse.jface.wizard.WizardPage;
32
import org.eclipse.mylar.internal.jira.JiraCustomQuery;
33
import org.eclipse.mylar.internal.jira.JiraServerFacade;
34
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
35
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
36
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
37
import org.eclipse.swt.SWT;
38
import org.eclipse.swt.events.FocusAdapter;
39
import org.eclipse.swt.events.FocusEvent;
40
import org.eclipse.swt.events.ModifyEvent;
41
import org.eclipse.swt.events.ModifyListener;
42
import org.eclipse.swt.events.SelectionAdapter;
43
import org.eclipse.swt.events.SelectionEvent;
44
import org.eclipse.swt.graphics.Color;
45
import org.eclipse.swt.graphics.Image;
46
import org.eclipse.swt.layout.GridData;
47
import org.eclipse.swt.layout.GridLayout;
48
import org.eclipse.swt.widgets.Button;
49
import org.eclipse.swt.widgets.Composite;
50
import org.eclipse.swt.widgets.Display;
51
import org.eclipse.swt.widgets.Label;
52
import org.eclipse.swt.widgets.Text;
53
import org.tigris.jira.core.model.Component;
54
import org.tigris.jira.core.model.Project;
55
import org.tigris.jira.core.model.Version;
56
import org.tigris.jira.core.model.filter.ComponentFilter;
57
import org.tigris.jira.core.model.filter.ContentFilter;
58
import org.tigris.jira.core.model.filter.FilterDefinition;
59
import org.tigris.jira.core.model.filter.ProjectFilter;
60
import org.tigris.jira.core.model.filter.VersionFilter;
61
import org.tigris.jira.core.service.JiraServer;
62
63
/**
64
 * @author Brock Janiczak
65
 * @author Eugene Kuleshov (layout and other improvements)
66
 */
67
public class FilterSummaryPage extends WizardPage {
68
	
69
	final Placeholder ANY_FIX_VERSION = new Placeholder("Any");
70
71
	final Placeholder NO_FIX_VERSION = new Placeholder("No Fix Version");
72
73
	final Placeholder ANY_REPORTED_VERSION = new Placeholder("Any");
74
75
	final Placeholder NO_REPORTED_VERSION = new Placeholder("No Version");
76
77
	final Placeholder UNRELEASED_VERSION = new Placeholder("Unreleased Versions");
78
79
	final Placeholder RELEASED_VERSION = new Placeholder("Released Versions");
80
81
	final Placeholder ANY_COMPONENT = new Placeholder("Any");
82
83
	final Placeholder NO_COMPONENT = new Placeholder("No Component");
84
85
	private final JiraServer server;
86
87
	private ListViewer project;
88
89
	private ListViewer reportedIn;
90
91
	private ListViewer components;
92
93
	private ListViewer fixFor;
94
95
	private final FilterDefinition workingCopy;
96
97
	private Text name;
98
99
	private Text description;
100
101
	private Text queryString;
102
103
	private Button searchSummary;
104
105
	private Button searchDescription;
106
107
	private Button searchComments;
108
109
	private Button searchEnvironment;
110
111
	private final boolean isNew;
112
113
	private IssueAttributesPage issueAttributesPage;
114
115
	private final TaskRepository repository;
116
117
	/**
118
	 * @param pageName
119
	 * @param title
120
	 * @param titleImage
121
	 */
122
	protected FilterSummaryPage(TaskRepository repository, String pageName, String title, ImageDescriptor titleImage,
123
			FilterDefinition workingCopy, boolean isNew) {
124
		super(pageName, title, titleImage);
125
		this.repository = repository;
126
127
		this.server = JiraServerFacade.getDefault().getJiraServer(repository);
128
		this.workingCopy = workingCopy;
129
		this.isNew = isNew;
130
131
		setPageComplete(false);
132
	}
133
134
	public void createControl(Composite parent) {
135
		GridData gd;
136
		Composite c = new Composite(parent, SWT.NONE);
137
		c.setLayout(new GridLayout(3, false));
138
139
		Label lblName = new Label(c, SWT.NONE);
140
		final GridData gridData = new GridData();
141
		lblName.setLayoutData(gridData);
142
		lblName.setText("Name:");
143
144
		name = new Text(c, SWT.BORDER);
145
		name.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
146
		name.addModifyListener(new ModifyListener() {
147
148
			public void modifyText(ModifyEvent e) {
149
				validatePage();
150
			}
151
152
		});
153
154
		if (!isNew) {
155
			name.setEnabled(false);
156
		}
157
158
		Label lblDescription = new Label(c, SWT.NONE);
159
		lblDescription.setText("Description:");
160
		lblDescription.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
161
162
		description = new Text(c, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
163
		gd = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
164
		gd.heightHint = 40;
165
		description.setLayoutData(gd);
166
		description.addFocusListener(new FocusAdapter() {
167
168
			public void focusLost(FocusEvent e) {
169
				validatePage();
170
			}
171
172
		});
173
174
		{
175
			Composite cc = new Composite(c, SWT.NONE);
176
			final GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, false, true, 3, 1);
177
			cc.setLayoutData(gridData_1);
178
			cc.setLayout(new GridLayout(4, false));
179
180
			Label lblProject = new Label(cc, SWT.NONE);
181
			lblProject.setText("Project:");
182
183
			Label lblFixFor = new Label(cc, SWT.NONE);
184
			lblFixFor.setText("Fix For:");
185
			lblFixFor.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
186
187
			Label lblComponent = new Label(cc, SWT.NONE);
188
			lblComponent.setText("In Components:");
189
			lblComponent.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
190
191
			Label lblReportedIn = new Label(cc, SWT.NONE);
192
			lblReportedIn.setText("Reported In:");
193
			lblReportedIn.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
194
195
			createProjectsViewer(cc);
196
			createFixForViewer(cc);
197
			createComponentsViewer(cc);
198
			createReportedInViewer(cc);
199
200
		}
201
202
		Label lblQuery = new Label(c, SWT.NONE);
203
		lblQuery.setLayoutData(new GridData());
204
		lblQuery.setText("Query:");
205
		queryString = new Text(c, SWT.BORDER);
206
		queryString.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
207
		// TODO put content assist here and a label describing what is available
208
209
		queryString.addFocusListener(new FocusAdapter() {
210
211
			public void focusLost(FocusEvent e) {
212
				validatePage();
213
			}
214
215
		});
216
217
		Label lblFields = new Label(c, SWT.NONE);
218
		lblFields.setText("Fields:");
219
		lblFields.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
220
221
		searchSummary = new Button(c, SWT.CHECK);
222
		searchSummary.setLayoutData(new GridData());
223
		searchSummary.setText("Summary");
224
		searchSummary.addSelectionListener(new SelectionAdapter() {
225
226
			public void widgetSelected(SelectionEvent e) {
227
				validatePage();
228
			}
229
230
		});
231
232
		searchDescription = new Button(c, SWT.CHECK);
233
		searchDescription.setLayoutData(new GridData());
234
		searchDescription.setText("Description");
235
		searchDescription.addSelectionListener(new SelectionAdapter() {
236
237
			public void widgetSelected(SelectionEvent e) {
238
				validatePage();
239
			}
240
241
		});
242
		new Label(c, SWT.NONE);
243
244
		// Need to turn off validation here
245
		if (isNew) {
246
			loadFromDefaults();
247
		} else {
248
			loadFromWorkingCopy();
249
		}
250
251
		setControl(c);
252
253
		searchComments = new Button(c, SWT.CHECK);
254
		searchComments.setLayoutData(new GridData());
255
		searchComments.setText("Comments");
256
		searchComments.addSelectionListener(new SelectionAdapter() {
257
258
			public void widgetSelected(SelectionEvent e) {
259
				validatePage();
260
			}
261
262
		});
263
264
		searchEnvironment = new Button(c, SWT.CHECK);
265
		searchEnvironment.setLayoutData(new GridData());
266
		searchEnvironment.setText("Environment");
267
		searchEnvironment.addSelectionListener(new SelectionAdapter() {
268
269
			public void widgetSelected(SelectionEvent e) {
270
				validatePage();
271
			}
272
273
		});
274
	}
275
276
	public IWizardPage getNextPage() {
277
		if (issueAttributesPage == null) {
278
			issueAttributesPage = new IssueAttributesPage(repository, "issueAttributes", "Issue Attributes", null,
279
					workingCopy, isNew);
280
			issueAttributesPage.setWizard(getWizard());
281
		}
282
283
		return issueAttributesPage;
284
	}
285
286
	private void createReportedInViewer(Composite c) {
287
		GridData gd;
288
		reportedIn = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
289
		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
290
		gd.heightHint = 40;
291
		reportedIn.getControl().setLayoutData(gd);
292
293
		reportedIn.setContentProvider(new IStructuredContentProvider() {
294
			private Project project;
295
296
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
297
				project = (Project) newInput;
298
			}
299
300
			public void dispose() {
301
			}
302
303
			public Object[] getElements(Object inputElement) {
304
				if (project != null) {
305
					Version[] versions = project.getVersions();
306
					Version[] releasedVersions = project.getReleasedVersions();
307
					Version[] unreleasedVersions = project.getUnreleasedVersions();
308
309
					Object[] elements = new Object[versions.length + 4];
310
					elements[0] = ANY_REPORTED_VERSION;
311
					elements[1] = NO_REPORTED_VERSION;
312
					elements[2] = RELEASED_VERSION;
313
					System.arraycopy(releasedVersions, 0, elements, 3, releasedVersions.length);
314
315
					elements[releasedVersions.length + 3] = UNRELEASED_VERSION;
316
317
					System.arraycopy(unreleasedVersions, 0, elements, releasedVersions.length + 4,
318
							unreleasedVersions.length);
319
					return elements;
320
				}
321
				return new Object[] { ANY_REPORTED_VERSION };
322
			}
323
324
		});
325
		reportedIn.setLabelProvider(new VersionLabelProvider());
326
		reportedIn.setInput(null);
327
	}
328
329
	private void createComponentsViewer(Composite c) {
330
		GridData gd;
331
		components = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
332
		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
333
		gd.heightHint = 40;
334
		components.getControl().setLayoutData(gd);
335
336
		components.setContentProvider(new IStructuredContentProvider() {
337
			private Project project;
338
339
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
340
				project = (Project) newInput;
341
			}
342
343
			public void dispose() {
344
			}
345
346
			public Object[] getElements(Object inputElement) {
347
				if (project != null) {
348
					Component[] components = project.getComponents();
349
350
					Object[] elements = new Object[components.length + 2];
351
					elements[0] = ANY_COMPONENT;
352
					elements[1] = NO_COMPONENT;
353
					System.arraycopy(components, 0, elements, 2, components.length);
354
					return elements;
355
				}
356
				return new Object[] { ANY_COMPONENT };
357
			}
358
359
		});
360
		components.setLabelProvider(new ComponentLabelProvider());
361
		components.setInput(null);
362
	}
363
364
	private void createFixForViewer(Composite c) {
365
		GridData gd;
366
		fixFor = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
367
		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
368
		gd.heightHint = 40;
369
		fixFor.getControl().setLayoutData(gd);
370
371
		fixFor.setContentProvider(new IStructuredContentProvider() {
372
			private Project project;
373
374
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
375
				project = (Project) newInput;
376
			}
377
378
			public void dispose() {
379
			}
380
381
			public Object[] getElements(Object inputElement) {
382
				if (project != null) {
383
					Version[] versions = project.getVersions();
384
					Version[] releasedVersions = project.getReleasedVersions();
385
					Version[] unreleasedVersions = project.getUnreleasedVersions();
386
387
					Object[] elements = new Object[versions.length + 4];
388
					elements[0] = ANY_FIX_VERSION;
389
					elements[1] = NO_FIX_VERSION;
390
					elements[2] = RELEASED_VERSION;
391
					System.arraycopy(releasedVersions, 0, elements, 3, releasedVersions.length);
392
393
					elements[releasedVersions.length + 3] = UNRELEASED_VERSION;
394
395
					System.arraycopy(unreleasedVersions, 0, elements, releasedVersions.length + 4,
396
							unreleasedVersions.length);
397
					return elements;
398
				}
399
				return new Object[] { ANY_REPORTED_VERSION };
400
			}
401
402
		});
403
		fixFor.setLabelProvider(new VersionLabelProvider());
404
		fixFor.setInput(null);
405
	}
406
407
	private void createProjectsViewer(Composite c) {
408
		project = new ListViewer(c, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER);
409
		project.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
410
		project.setContentProvider(new IStructuredContentProvider() {
411
412
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
413
			}
414
415
			public void dispose() {
416
			}
417
418
			public Object[] getElements(Object inputElement) {
419
				JiraServer server = (JiraServer) inputElement;
420
				Object[] elements = new Object[server.getProjects().length + 1];
421
				elements[0] = new Placeholder("All Projects");
422
				System.arraycopy(server.getProjects(), 0, elements, 1, server.getProjects().length);
423
424
				return elements;
425
			}
426
427
		});
428
429
		project.setLabelProvider(new LabelProvider() {
430
431
			public String getText(Object element) {
432
				if (element instanceof Placeholder) {
433
					return ((Placeholder) element).getText();
434
				}
435
436
				return ((Project) element).getName();
437
			}
438
439
		});
440
441
		project.setInput(server);
442
		project.addSelectionChangedListener(new ISelectionChangedListener() {
443
444
			public void selectionChanged(SelectionChangedEvent event) {
445
				IStructuredSelection selection = ((IStructuredSelection) event.getSelection());
446
				Project selectedProject = null;
447
				if (!selection.isEmpty() && !(selection.getFirstElement() instanceof Placeholder)) {
448
					selectedProject = (Project) selection.getFirstElement();
449
				}
450
451
				updateCurrentProject(selectedProject);
452
				validatePage();
453
			}
454
455
		});
456
	}
457
458
	void updateCurrentProject(Project project) {
459
		this.fixFor.setInput(project);
460
		this.components.setInput(project);
461
		this.reportedIn.setInput(project);
462
463
	}
464
465
	void validatePage() {
466
		if (name.getText().length() == 0) {
467
			setErrorMessage("Name is mandatory");
468
			setPageComplete(false);
469
			return;
470
		}
471
472
		setErrorMessage(null);
473
		setPageComplete(true);
474
	}
475
476
	private void loadFromDefaults() {
477
		project.setSelection(new StructuredSelection(new Placeholder("All Projects")));
478
		searchSummary.setSelection(true);
479
		searchDescription.setSelection(true);
480
	}
481
482
	private void loadFromWorkingCopy() {
483
		if (workingCopy.getName() != null) {
484
			name.setText(workingCopy.getName());
485
		}
486
487
		if (workingCopy.getDescription() != null) {
488
			description.setText(workingCopy.getDescription());
489
		}
490
491
		if (workingCopy.getProjectFilter() != null) {
492
			project.setSelection(new StructuredSelection(workingCopy.getProjectFilter().getProject()));
493
		} else {
494
			project.setSelection(new StructuredSelection(new Placeholder("All Projects")));
495
		}
496
497
		if (workingCopy.getFixForVersionFilter() != null) {
498
			if (workingCopy.getFixForVersionFilter().hasNoVersion()) {
499
				fixFor.setSelection(new StructuredSelection(new Object[] { NO_FIX_VERSION }));
500
			} else if (workingCopy.getFixForVersionFilter().isReleasedVersions()
501
					&& workingCopy.getFixForVersionFilter().isUnreleasedVersions()) {
502
				fixFor.setSelection(new StructuredSelection(new Object[] { RELEASED_VERSION, UNRELEASED_VERSION }));
503
			} else if (workingCopy.getFixForVersionFilter().isReleasedVersions()) {
504
				fixFor.setSelection(new StructuredSelection(RELEASED_VERSION));
505
			} else if (workingCopy.getFixForVersionFilter().isUnreleasedVersions()) {
506
				fixFor.setSelection(new StructuredSelection(UNRELEASED_VERSION));
507
			} else {
508
				fixFor.setSelection(new StructuredSelection(workingCopy.getFixForVersionFilter().getVersions()));
509
			}
510
		} else {
511
			fixFor.setSelection(new StructuredSelection(ANY_FIX_VERSION));
512
		}
513
514
		if (workingCopy.getReportedInVersionFilter() != null) {
515
			if (workingCopy.getReportedInVersionFilter().hasNoVersion()) {
516
				reportedIn.setSelection(new StructuredSelection(new Object[] { NO_REPORTED_VERSION }));
517
			} else if (workingCopy.getReportedInVersionFilter().isReleasedVersions()
518
					&& workingCopy.getReportedInVersionFilter().isUnreleasedVersions()) {
519
				reportedIn.setSelection(new StructuredSelection(new Object[] { RELEASED_VERSION, UNRELEASED_VERSION }));
520
			} else if (workingCopy.getReportedInVersionFilter().isReleasedVersions()) {
521
				reportedIn.setSelection(new StructuredSelection(RELEASED_VERSION));
522
			} else if (workingCopy.getReportedInVersionFilter().isUnreleasedVersions()) {
523
				reportedIn.setSelection(new StructuredSelection(UNRELEASED_VERSION));
524
			} else {
525
				reportedIn
526
						.setSelection(new StructuredSelection(workingCopy.getReportedInVersionFilter().getVersions()));
527
			}
528
		} else {
529
			reportedIn.setSelection(new StructuredSelection(ANY_REPORTED_VERSION));
530
		}
531
532
		if (workingCopy.getContentFilter() != null) {
533
			this.queryString.setText(workingCopy.getContentFilter().getQueryString());
534
			this.searchComments.setSelection(workingCopy.getContentFilter().isSearchingComments());
535
			this.searchDescription.setSelection(workingCopy.getContentFilter().isSearchingDescription());
536
			this.searchEnvironment.setSelection(workingCopy.getContentFilter().isSearchingEnvironment());
537
			this.searchSummary.setSelection(workingCopy.getContentFilter().isSearchingSummary());
538
		}
539
540
		if (workingCopy.getComponentFilter() != null) {
541
			if (workingCopy.getComponentFilter().hasNoComponent()) {
542
				components.setSelection(new StructuredSelection(NO_COMPONENT));
543
			} else {
544
				components.setSelection(new StructuredSelection(workingCopy.getComponentFilter().getComponents()));
545
			}
546
		} else {
547
			components.setSelection(new StructuredSelection(ANY_COMPONENT));
548
		}
549
	}
550
551
	/* default */void applyChanges() {
552
		workingCopy.setName(this.name.getText());
553
		workingCopy.setDescription(this.description.getText());
554
		if (this.queryString.getText().length() > 0 || this.searchSummary.getSelection()
555
				|| this.searchDescription.getSelection() || this.searchEnvironment.getSelection()
556
				|| this.searchComments.getSelection()) {
557
			workingCopy.setContentFilter(new ContentFilter(this.queryString.getText(), this.searchSummary
558
					.getSelection(), this.searchDescription.getSelection(), this.searchEnvironment.getSelection(),
559
					this.searchComments.getSelection()));
560
		} else {
561
			workingCopy.setContentFilter(null);
562
		}
563
564
		IStructuredSelection projectSelection = (IStructuredSelection) this.project.getSelection();
565
		if (!projectSelection.isEmpty() && projectSelection.getFirstElement() instanceof Project) {
566
			workingCopy.setProjectFilter(new ProjectFilter((Project) projectSelection.getFirstElement()));
567
		} else {
568
			workingCopy.setProjectFilter(null);
569
		}
570
571
		IStructuredSelection reportedInSelection = (IStructuredSelection) reportedIn.getSelection();
572
		if (reportedInSelection.isEmpty()) {
573
			workingCopy.setReportedInVersionFilter(null);
574
		} else {
575
			boolean selectionContainsReleased = false;
576
			boolean selectionContainsUnreleased = false;
577
			boolean selectionContainsAll = false;
578
			boolean selectionContainsNone = false;
579
580
			List<Version> selectedVersions = new ArrayList<Version>();
581
582
			for (Iterator i = reportedInSelection.iterator(); i.hasNext();) {
583
				Object selection = i.next();
584
				if (ANY_REPORTED_VERSION.equals(selection)) {
585
					selectionContainsAll = true;
586
				} else if (NO_REPORTED_VERSION.equals(selection)) {
587
					selectionContainsNone = true;
588
				} else if (RELEASED_VERSION.equals(selection)) {
589
					selectionContainsReleased = true;
590
				} else if (UNRELEASED_VERSION.equals(selection)) {
591
					selectionContainsUnreleased = true;
592
				} else if (selection instanceof Version) {
593
					selectedVersions.add((Version) selection);
594
				}
595
			}
596
597
			if (selectionContainsAll) {
598
				workingCopy.setReportedInVersionFilter(null);
599
			} else if (selectionContainsNone) {
600
				workingCopy.setReportedInVersionFilter(new VersionFilter(new Version[0]));
601
			} else if (selectionContainsReleased || selectionContainsUnreleased) {
602
				workingCopy.setReportedInVersionFilter(new VersionFilter(selectionContainsReleased,
603
						selectionContainsUnreleased));
604
			} else if (selectedVersions.size() > 0) {
605
				workingCopy.setReportedInVersionFilter(
606
						new VersionFilter(selectedVersions.toArray(new Version[selectedVersions.size()])));
607
			} else {
608
				workingCopy.setReportedInVersionFilter(null);
609
			}
610
		}
611
612
		IStructuredSelection fixForSelection = (IStructuredSelection) fixFor.getSelection();
613
		if (fixForSelection.isEmpty()) {
614
			workingCopy.setFixForVersionFilter(null);
615
		} else {
616
			boolean selectionContainsReleased = false;
617
			boolean selectionContainsUnreleased = false;
618
			boolean selectionContainsAll = false;
619
			boolean selectionContainsNone = false;
620
621
			List<Version> selectedVersions = new ArrayList<Version>();
622
623
			for (Iterator i = fixForSelection.iterator(); i.hasNext();) {
624
				Object selection = i.next();
625
				if (ANY_FIX_VERSION.equals(selection)) {
626
					selectionContainsAll = true;
627
				} else if (NO_FIX_VERSION.equals(selection)) {
628
					selectionContainsNone = true;
629
				} else if (RELEASED_VERSION.equals(selection)) {
630
					selectionContainsReleased = true;
631
				} else if (UNRELEASED_VERSION.equals(selection)) {
632
					selectionContainsUnreleased = true;
633
				} else if (selection instanceof Version) {
634
					selectedVersions.add((Version) selection);
635
				}
636
			}
637
638
			if (selectionContainsAll) {
639
				workingCopy.setFixForVersionFilter(null);
640
			} else if (selectionContainsNone) {
641
				workingCopy.setFixForVersionFilter(new VersionFilter(new Version[0]));
642
			} else if (selectionContainsReleased || selectionContainsUnreleased) {
643
				workingCopy.setFixForVersionFilter(new VersionFilter(selectionContainsReleased,
644
						selectionContainsUnreleased));
645
			} else if (selectedVersions.size() > 0) {
646
				workingCopy.setFixForVersionFilter(
647
						new VersionFilter(selectedVersions.toArray(new Version[selectedVersions.size()])));
648
			} else {
649
				workingCopy.setFixForVersionFilter(null);
650
			}
651
		}
652
653
		IStructuredSelection componentsSelection = (IStructuredSelection) components.getSelection();
654
		if (componentsSelection.isEmpty()) {
655
			workingCopy.setComponentFilter(null);
656
		} else {
657
658
			boolean selectionContainsAll = false;
659
			boolean selectionContainsNone = false;
660
			List<Component> selectedComponents = new ArrayList<Component>();
661
662
			for (Iterator i = componentsSelection.iterator(); i.hasNext();) {
663
				Object selection = i.next();
664
				if (ANY_COMPONENT.equals(selection)) {
665
					selectionContainsAll = true;
666
				} else if (NO_COMPONENT.equals(selection)) {
667
					selectionContainsNone = true;
668
				} else if (selection instanceof Component) {
669
					selectedComponents.add((Component) selection);
670
				}
671
			}
672
673
			if (selectionContainsAll) {
674
				workingCopy.setComponentFilter(null);
675
			} else if (selectedComponents.size() > 0) {
676
				workingCopy.setComponentFilter(
677
						new ComponentFilter(selectedComponents.toArray(new Component[selectedComponents.size()])));
678
			} else if (selectionContainsNone) {
679
				workingCopy.setComponentFilter(new ComponentFilter(new Component[0]));
680
			} else {
681
				workingCopy.setComponentFilter(null);
682
			}
683
		}
684
	}
685
686
	final class ComponentLabelProvider implements ILabelProvider {
687
688
		/*
689
		 * (non-Javadoc)
690
		 * 
691
		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
692
		 */
693
		public Image getImage(Object element) {
694
			return null;
695
		}
696
697
		/*
698
		 * (non-Javadoc)
699
		 * 
700
		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
701
		 */
702
		public String getText(Object element) {
703
			if (element instanceof Placeholder) {
704
				return ((Placeholder) element).getText();
705
			}
706
			return ((Component) element).getName();
707
		}
708
709
		/*
710
		 * (non-Javadoc)
711
		 * 
712
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
713
		 */
714
		public void addListener(ILabelProviderListener listener) {
715
		}
716
717
		/*
718
		 * (non-Javadoc)
719
		 * 
720
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
721
		 */
722
		public void dispose() {
723
		}
724
725
		/*
726
		 * (non-Javadoc)
727
		 * 
728
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
729
		 *      java.lang.String)
730
		 */
731
		public boolean isLabelProperty(Object element, String property) {
732
			return false;
733
		}
734
735
		/*
736
		 * (non-Javadoc)
737
		 * 
738
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
739
		 */
740
		public void removeListener(ILabelProviderListener listener) {
741
		}
742
743
	}
744
745
	final class VersionLabelProvider implements ILabelProvider, IColorProvider {
746
747
		/*
748
		 * (non-Javadoc)
749
		 * 
750
		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
751
		 */
752
		public Image getImage(Object element) {
753
			return null;
754
		}
755
756
		/*
757
		 * (non-Javadoc)
758
		 * 
759
		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
760
		 */
761
		public String getText(Object element) {
762
			if (element instanceof Placeholder) {
763
				return ((Placeholder) element).getText();
764
			}
765
			return ((Version) element).getName();
766
		}
767
768
		/*
769
		 * (non-Javadoc)
770
		 * 
771
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
772
		 */
773
		public void addListener(ILabelProviderListener listener) {
774
775
		}
776
777
		/*
778
		 * (non-Javadoc)
779
		 * 
780
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
781
		 */
782
		public void dispose() {
783
		}
784
785
		/*
786
		 * (non-Javadoc)
787
		 * 
788
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
789
		 *      java.lang.String)
790
		 */
791
		public boolean isLabelProperty(Object element, String property) {
792
			return false;
793
		}
794
795
		/*
796
		 * (non-Javadoc)
797
		 * 
798
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
799
		 */
800
		public void removeListener(ILabelProviderListener listener) {
801
		}
802
803
		/*
804
		 * (non-Javadoc)
805
		 * 
806
		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
807
		 */
808
		public Color getForeground(Object element) {
809
			return null;
810
		}
811
812
		/*
813
		 * (non-Javadoc)
814
		 * 
815
		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
816
		 */
817
		public Color getBackground(Object element) {
818
			if (element instanceof Placeholder) {
819
				return Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND);
820
			}
821
			return null;
822
		}
823
824
	}
825
826
	private final class Placeholder {
827
		private final String text;
828
829
		public Placeholder(String text) {
830
			this.text = text;
831
		}
832
833
		/*
834
		 * (non-Javadoc)
835
		 * 
836
		 * @see java.lang.Object#equals(java.lang.Object)
837
		 */
838
		public boolean equals(Object obj) {
839
			if (obj == null)
840
				return false;
841
			if (!(obj instanceof Placeholder))
842
				return false;
843
844
			Placeholder that = (Placeholder) obj;
845
			return this.text.equals(that.text);
846
		}
847
848
		public String getText() {
849
			return this.text;
850
		}
851
	}
852
853
	public AbstractRepositoryQuery getQuery() {
854
		this.applyChanges();
855
		issueAttributesPage.applyChanges();
856
		if (isNew) {
857
			server.addLocalFilter(workingCopy);
858
		}
859
860
		return new JiraCustomQuery(repository.getUrl(), workingCopy, MylarTaskListPlugin.getTaskListManager()
861
				.getTaskList());
862
	}
863
}
(-)src/org/eclipse/mylar/internal/jira/ui/wizards/IssueAttributesPage.java (+723 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 - 2006 Mylar eclipse.org project and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Brock Janiczak - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylar.internal.jira.ui.wizards;
13
14
import java.util.ArrayList;
15
import java.util.Iterator;
16
import java.util.List;
17
18
import org.eclipse.jface.resource.ImageDescriptor;
19
import org.eclipse.jface.viewers.ComboViewer;
20
import org.eclipse.jface.viewers.ISelectionChangedListener;
21
import org.eclipse.jface.viewers.IStructuredContentProvider;
22
import org.eclipse.jface.viewers.IStructuredSelection;
23
import org.eclipse.jface.viewers.LabelProvider;
24
import org.eclipse.jface.viewers.ListViewer;
25
import org.eclipse.jface.viewers.SelectionChangedEvent;
26
import org.eclipse.jface.viewers.StructuredSelection;
27
import org.eclipse.jface.viewers.Viewer;
28
import org.eclipse.jface.wizard.WizardPage;
29
import org.eclipse.mylar.internal.jira.JiraServerFacade;
30
import org.eclipse.mylar.provisional.tasklist.TaskRepository;
31
import org.eclipse.swt.SWT;
32
import org.eclipse.swt.events.ModifyEvent;
33
import org.eclipse.swt.events.ModifyListener;
34
import org.eclipse.swt.layout.GridData;
35
import org.eclipse.swt.layout.GridLayout;
36
import org.eclipse.swt.widgets.Composite;
37
import org.eclipse.swt.widgets.Label;
38
import org.eclipse.swt.widgets.Text;
39
import org.tigris.jira.core.model.IssueType;
40
import org.tigris.jira.core.model.Priority;
41
import org.tigris.jira.core.model.Resolution;
42
import org.tigris.jira.core.model.Status;
43
import org.tigris.jira.core.model.filter.CurrentUserFilter;
44
import org.tigris.jira.core.model.filter.FilterDefinition;
45
import org.tigris.jira.core.model.filter.IssueTypeFilter;
46
import org.tigris.jira.core.model.filter.NobodyFilter;
47
import org.tigris.jira.core.model.filter.PriorityFilter;
48
import org.tigris.jira.core.model.filter.ResolutionFilter;
49
import org.tigris.jira.core.model.filter.SpecificUserFilter;
50
import org.tigris.jira.core.model.filter.StatusFilter;
51
import org.tigris.jira.core.model.filter.UserFilter;
52
import org.tigris.jira.core.model.filter.UserInGroupFilter;
53
import org.tigris.jira.core.service.JiraServer;
54
55
/**
56
 * @author Brock Janiczak
57
 * @author Eugene Kuleshov (layout and other improvements)
58
 */
59
public class IssueAttributesPage extends WizardPage {
60
	final Placeholder ANY_ISSUE_TYPE = new Placeholder("Any");
61
62
	final Placeholder ANY_RESOLUTION = new Placeholder("Any");
63
64
	final Placeholder UNRESOLVED = new Placeholder("Unresolved");
65
66
	final Placeholder UNASSIGNED = new Placeholder("Unassigned");
67
68
	final Placeholder ANY_REPORTER = new Placeholder("Any");
69
70
	final Placeholder NO_REPORTER = new Placeholder("No Reporter");
71
72
	final Placeholder CURRENT_USER_REPORTER = new Placeholder("Current User");
73
74
	final Placeholder SPECIFIC_USER_REPORTER = new Placeholder("Specified User");
75
76
	final Placeholder SPECIFIC_GROUP_REPORTER = new Placeholder("Specified Group");
77
78
	final Placeholder ANY_ASSIGNEE = new Placeholder("Any");
79
80
	final Placeholder CURRENT_USER_ASSIGNEE = new Placeholder("Current User");
81
82
	final Placeholder SPECIFIC_USER_ASSIGNEE = new Placeholder("Specified User");
83
84
	final Placeholder SPECIFIC_GROUP_ASSIGNEE = new Placeholder("Specified Group");
85
86
	final Placeholder ANY_STATUS = new Placeholder("Any");
87
88
	final Placeholder ANY_PRIORITY = new Placeholder("Any");
89
90
//	private final TaskRepository repository;
91
92
	private final JiraServer jiraServer;
93
94
	private final FilterDefinition workingCopy;
95
96
	private final boolean isNew;
97
98
	private ListViewer issueType;
99
100
	private ComboViewer reporterType;
101
102
	private ComboViewer assigneeType;
103
104
	private ListViewer status;
105
106
	private ListViewer resolution;
107
108
	private ListViewer priority;
109
110
	Text assignee;
111
112
	Text reporter;
113
114
	/**
115
	 * @param repository
116
	 * @param pageName
117
	 * @param title
118
	 * @param titleImage
119
	 * @param server
120
	 */
121
	protected IssueAttributesPage(TaskRepository repository, String pageName, String title, ImageDescriptor titleImage,
122
			FilterDefinition workingCopy, boolean isNew) {
123
		super(pageName, title, titleImage);
124
//		this.repository = repository;
125
		this.jiraServer = JiraServerFacade.getDefault().getJiraServer(repository);
126
		this.workingCopy = workingCopy;
127
		this.isNew = isNew;
128
129
		setPageComplete(false);
130
	}
131
132
	/*
133
	 * (non-Javadoc)
134
	 * 
135
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
136
	 */
137
	public void createControl(Composite parent) {
138
		GridData gd;
139
140
		Composite cc = new Composite(parent, SWT.NONE);
141
		cc.setLayout(new GridLayout(1, false));
142
143
		{
144
			Composite c = new Composite(cc, SWT.NONE);
145
			final GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
146
			gridData.widthHint = 515;
147
			c.setLayoutData(gridData);
148
			c.setLayout(new GridLayout(3, false));
149
150
			Label lblReportedBy = new Label(c, SWT.NONE);
151
			lblReportedBy.setText("Reported By:");
152
			lblReportedBy.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
153
154
			reporterType = new ComboViewer(c, SWT.BORDER | SWT.READ_ONLY);
155
			final GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, false, false);
156
			gridData_1.widthHint = 133;
157
			reporterType.getControl().setLayoutData(gridData_1);
158
159
			reporterType.setContentProvider(new IStructuredContentProvider() {
160
161
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
162
				}
163
164
				public void dispose() {
165
				}
166
167
				public Object[] getElements(Object inputElement) {
168
					return new Object[] { ANY_REPORTER, NO_REPORTER, CURRENT_USER_REPORTER, SPECIFIC_USER_REPORTER,
169
							SPECIFIC_GROUP_REPORTER };
170
				}
171
172
			});
173
174
			reporterType.setLabelProvider(new LabelProvider() {
175
176
				public String getText(Object element) {
177
					return ((Placeholder) element).getText();
178
				}
179
180
			});
181
182
			reporterType.setInput(jiraServer);
183
184
			reporter = new Text(c, SWT.BORDER);
185
			reporter.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
186
			reporter.setEnabled(false);
187
188
			reporter.addModifyListener(new ModifyListener() {
189
190
				public void modifyText(ModifyEvent e) {
191
					validatePage();
192
				}
193
194
			});
195
196
			Label lblAssignedTo = new Label(c, SWT.NONE);
197
			lblAssignedTo.setText("Assigned To:");
198
			lblAssignedTo.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
199
200
			assigneeType = new ComboViewer(c, SWT.BORDER | SWT.READ_ONLY);
201
			final GridData gridData_2 = new GridData(SWT.FILL, SWT.FILL, false, false);
202
			gridData_2.widthHint = 118;
203
			assigneeType.getControl().setLayoutData(gridData_2);
204
205
			assigneeType.setContentProvider(new IStructuredContentProvider() {
206
207
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
208
				}
209
210
				public void dispose() {
211
				}
212
213
				public Object[] getElements(Object inputElement) {
214
					return new Object[] { ANY_ASSIGNEE, UNASSIGNED, CURRENT_USER_ASSIGNEE, SPECIFIC_USER_ASSIGNEE,
215
							SPECIFIC_GROUP_ASSIGNEE };
216
				}
217
218
			});
219
220
			assigneeType.setLabelProvider(new LabelProvider() {
221
222
				public String getText(Object element) {
223
					return ((Placeholder) element).getText();
224
				}
225
226
			});
227
228
			assigneeType.setInput(jiraServer);
229
			assigneeType.addSelectionChangedListener(new ISelectionChangedListener() {
230
231
				public void selectionChanged(SelectionChangedEvent event) {
232
					Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
233
					if (SPECIFIC_USER_ASSIGNEE.equals(selection) || SPECIFIC_GROUP_ASSIGNEE.equals(selection)) {
234
						assignee.setEnabled(true);
235
					} else {
236
						assignee.setEnabled(false);
237
						assignee.setText(""); //$NON-NLS-1$
238
					}
239
					validatePage();
240
				}
241
242
			});
243
244
			reporterType.addSelectionChangedListener(new ISelectionChangedListener() {
245
246
				public void selectionChanged(SelectionChangedEvent event) {
247
					Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
248
					if (SPECIFIC_USER_REPORTER.equals(selection) || SPECIFIC_GROUP_REPORTER.equals(selection)) {
249
						reporter.setEnabled(true);
250
					} else {
251
						reporter.setEnabled(false);
252
					}
253
				}
254
255
			});
256
257
			assignee = new Text(c, SWT.BORDER);
258
			assignee.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
259
			assignee.setEnabled(false);
260
261
			assignee.addModifyListener(new ModifyListener() {
262
263
				public void modifyText(ModifyEvent e) {
264
					validatePage();
265
				}
266
267
			});
268
269
		}
270
271
		{
272
			Composite c = new Composite(cc, SWT.NONE);
273
			final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
274
			gridData.heightHint = 149;
275
			c.setLayoutData(gridData);
276
			c.setLayout(new GridLayout(4, false));
277
278
			Label lblIssueType = new Label(c, SWT.NONE);
279
			lblIssueType.setText("Type:");
280
			lblIssueType.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
281
282
			Label lblStatus = new Label(c, SWT.NONE);
283
			lblStatus.setText("Status:");
284
			lblStatus.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
285
286
			Label lblResolution = new Label(c, SWT.NONE);
287
			lblResolution.setText("Resolution:");
288
			lblResolution.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
289
290
			Label lblPriority = new Label(c, SWT.NONE);
291
			lblPriority.setText("Priority:");
292
			lblPriority.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
293
			
294
			issueType = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
295
			gd = new GridData(SWT.FILL, SWT.FILL, true, true);
296
			gd.heightHint = 40;
297
			issueType.getControl().setLayoutData(gd);
298
299
			issueType.setContentProvider(new IStructuredContentProvider() {
300
301
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
302
				}
303
304
				public void dispose() {
305
				}
306
307
				public Object[] getElements(Object inputElement) {
308
					JiraServer server = (JiraServer) inputElement;
309
					Object[] elements = new Object[server.getIssueTypes().length + 1];
310
					elements[0] = ANY_ISSUE_TYPE;
311
					System.arraycopy(server.getIssueTypes(), 0, elements, 1, server.getIssueTypes().length);
312
313
					return elements;
314
				}
315
			});
316
317
			issueType.setLabelProvider(new LabelProvider() {
318
319
				public String getText(Object element) {
320
					if (element instanceof Placeholder) {
321
						return ((Placeholder) element).getText();
322
					}
323
324
					return ((IssueType) element).getName();
325
				}
326
327
			});
328
329
			issueType.addSelectionChangedListener(new ISelectionChangedListener() {
330
331
				public void selectionChanged(SelectionChangedEvent event) {
332
					validatePage();
333
				}
334
335
			});
336
			issueType.setInput(jiraServer);
337
338
			status = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
339
			gd = new GridData(SWT.FILL, SWT.FILL, true, true);
340
			gd.heightHint = 40;
341
			status.getControl().setLayoutData(gd);
342
343
			status.setContentProvider(new IStructuredContentProvider() {
344
345
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
346
				}
347
348
				public void dispose() {
349
				}
350
351
				public Object[] getElements(Object inputElement) {
352
					JiraServer server = (JiraServer) inputElement;
353
					Object[] elements = new Object[server.getStatuses().length + 1];
354
					elements[0] = ANY_STATUS;
355
					System.arraycopy(server.getStatuses(), 0, elements, 1, server.getStatuses().length);
356
357
					return elements;
358
				}
359
			});
360
361
			status.setLabelProvider(new LabelProvider() {
362
363
				public String getText(Object element) {
364
					if (element instanceof Placeholder) {
365
						return ((Placeholder) element).getText();
366
					}
367
368
					return ((Status) element).getName();
369
				}
370
371
			});
372
373
			status.addSelectionChangedListener(new ISelectionChangedListener() {
374
375
				public void selectionChanged(SelectionChangedEvent event) {
376
					validatePage();
377
				}
378
379
			});
380
			status.setInput(jiraServer);
381
382
			resolution = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
383
			gd = new GridData(SWT.FILL, SWT.FILL, true, true);
384
			gd.heightHint = 40;
385
			resolution.getControl().setLayoutData(gd);
386
			resolution.setContentProvider(new IStructuredContentProvider() {
387
388
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
389
				}
390
391
				public void dispose() {
392
				}
393
394
				public Object[] getElements(Object inputElement) {
395
					JiraServer server = (JiraServer) inputElement;
396
					Object[] elements = new Object[server.getResolutions().length + 2];
397
					elements[0] = ANY_RESOLUTION;
398
					elements[1] = UNRESOLVED;
399
					System.arraycopy(server.getResolutions(), 0, elements, 2, server.getResolutions().length);
400
401
					return elements;
402
				}
403
			});
404
405
			resolution.setLabelProvider(new LabelProvider() {
406
407
				public String getText(Object element) {
408
					if (element instanceof Placeholder) {
409
						return ((Placeholder) element).getText();
410
					}
411
412
					return ((Resolution) element).getName();
413
				}
414
415
			});
416
417
			resolution.addSelectionChangedListener(new ISelectionChangedListener() {
418
419
				public void selectionChanged(SelectionChangedEvent event) {
420
					validatePage();
421
				}
422
423
			});
424
			resolution.setInput(jiraServer);
425
426
			priority = new ListViewer(c, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
427
			gd = new GridData(SWT.FILL, SWT.FILL, true, true);
428
			gd.heightHint = 40;
429
			priority.getControl().setLayoutData(gd);
430
431
			priority.setContentProvider(new IStructuredContentProvider() {
432
433
				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
434
				}
435
436
				public void dispose() {
437
				}
438
439
				public Object[] getElements(Object inputElement) {
440
					JiraServer server = (JiraServer) inputElement;
441
					Object[] elements = new Object[server.getPriorities().length + 1];
442
					elements[0] = ANY_PRIORITY;
443
					System.arraycopy(server.getPriorities(), 0, elements, 1, server.getPriorities().length);
444
445
					return elements;
446
				}
447
			});
448
449
			priority.setLabelProvider(new LabelProvider() {
450
451
				public String getText(Object element) {
452
					if (element instanceof Placeholder) {
453
						return ((Placeholder) element).getText();
454
					}
455
456
					return ((Priority) element).getName();
457
				}
458
459
			});
460
			priority.addSelectionChangedListener(new ISelectionChangedListener() {
461
462
				public void selectionChanged(SelectionChangedEvent event) {
463
					validatePage();
464
				}
465
466
			});
467
			priority.setInput(jiraServer);
468
		}
469
470
		if (isNew) {
471
			loadFromDefaults();
472
		} else {
473
			loadFromWorkingCopy();
474
		}
475
476
		setControl(cc);
477
	}
478
479
	void validatePage() {
480
481
	}
482
483
	/* default */void applyChanges() {
484
		if(issueType==null) {
485
			return;
486
		}
487
		
488
		// TODO support standard and subtask issue types
489
		IStructuredSelection issueTypeSelection = (IStructuredSelection) issueType.getSelection();
490
		if (issueTypeSelection.isEmpty()) {
491
			workingCopy.setIssueTypeFilter(null);
492
		} else {
493
			boolean isAnyIssueTypeSelected = false;
494
495
			List<IssueType> selectedIssueTypes = new ArrayList<IssueType>();
496
497
			for (Iterator i = issueTypeSelection.iterator(); i.hasNext();) {
498
				Object selection = i.next();
499
				if (ANY_ISSUE_TYPE.equals(selection)) {
500
					isAnyIssueTypeSelected = true;
501
				} else if (selection instanceof IssueType) {
502
					selectedIssueTypes.add((IssueType) selection);
503
				}
504
			}
505
506
			if (isAnyIssueTypeSelected) {
507
				workingCopy.setIssueTypeFilter(null);
508
			} else {
509
				workingCopy.setIssueTypeFilter(
510
					new IssueTypeFilter(selectedIssueTypes.toArray(new IssueType[selectedIssueTypes.size()])));
511
			}
512
		}
513
514
		IStructuredSelection reporterSelection = (IStructuredSelection) reporterType.getSelection();
515
		if (reporterSelection.isEmpty()) {
516
			workingCopy.setReportedByFilter(null);
517
		} else {
518
			if (ANY_REPORTER.equals(reporterSelection.getFirstElement())) {
519
				workingCopy.setReportedByFilter(null);
520
			} else if (NO_REPORTER.equals(reporterSelection.getFirstElement())) {
521
				workingCopy.setReportedByFilter(new NobodyFilter());
522
			} else if (CURRENT_USER_REPORTER.equals(reporterSelection.getFirstElement())) {
523
				workingCopy.setReportedByFilter(new CurrentUserFilter());
524
			} else if (SPECIFIC_GROUP_REPORTER.equals(reporterSelection.getFirstElement())) {
525
				workingCopy.setReportedByFilter(new UserInGroupFilter(reporter.getText()));
526
			} else if (SPECIFIC_USER_REPORTER.equals(reporterSelection.getFirstElement())) {
527
				workingCopy.setReportedByFilter(new SpecificUserFilter(reporter.getText()));
528
			} else {
529
				workingCopy.setReportedByFilter(null);
530
			}
531
		}
532
533
		IStructuredSelection assigneeSelection = (IStructuredSelection) assigneeType.getSelection();
534
		if (assigneeSelection.isEmpty()) {
535
			workingCopy.setAssignedToFilter(null);
536
		} else {
537
			if (ANY_REPORTER.equals(assigneeSelection.getFirstElement())) {
538
				workingCopy.setAssignedToFilter(null);
539
			} else if (UNASSIGNED.equals(assigneeSelection.getFirstElement())) {
540
				workingCopy.setAssignedToFilter(new NobodyFilter());
541
			} else if (CURRENT_USER_REPORTER.equals(assigneeSelection.getFirstElement())) {
542
				workingCopy.setAssignedToFilter(new CurrentUserFilter());
543
			} else if (SPECIFIC_GROUP_REPORTER.equals(assigneeSelection.getFirstElement())) {
544
				workingCopy.setAssignedToFilter(new UserInGroupFilter(assignee.getText()));
545
			} else if (SPECIFIC_USER_REPORTER.equals(assigneeSelection.getFirstElement())) {
546
				workingCopy.setAssignedToFilter(new SpecificUserFilter(assignee.getText()));
547
			} else {
548
				workingCopy.setAssignedToFilter(null);
549
			}
550
		}
551
552
		IStructuredSelection statusSelection = (IStructuredSelection) status.getSelection();
553
		if (statusSelection.isEmpty()) {
554
			workingCopy.setStatusFilter(null);
555
		} else {
556
			boolean isAnyStatusSelected = false;
557
558
			List<Status> selectedStatuses = new ArrayList<Status>();
559
560
			for (Iterator i = statusSelection.iterator(); i.hasNext();) {
561
				Object selection = i.next();
562
				if (ANY_STATUS.equals(selection)) {
563
					isAnyStatusSelected = true;
564
				} else if (selection instanceof Status) {
565
					selectedStatuses.add((Status) selection);
566
				}
567
			}
568
569
			if (isAnyStatusSelected) {
570
				workingCopy.setStatusFilter(null);
571
			} else {
572
				workingCopy.setStatusFilter(
573
					new StatusFilter(selectedStatuses.toArray(new Status[selectedStatuses.size()])));
574
			}
575
		}
576
577
		IStructuredSelection resolutionSelection = (IStructuredSelection) resolution.getSelection();
578
		if (resolutionSelection.isEmpty()) {
579
			workingCopy.setResolutionFilter(null);
580
		} else {
581
			boolean isAnyResolutionSelected = false;
582
583
			List<Resolution> selectedResolutions = new ArrayList<Resolution>();
584
585
			for (Iterator i = resolutionSelection.iterator(); i.hasNext();) {
586
				Object selection = i.next();
587
				if (ANY_RESOLUTION.equals(selection)) {
588
					isAnyResolutionSelected = true;
589
				} else if (selection instanceof Resolution) {
590
					selectedResolutions.add((Resolution) selection);
591
				}
592
			}
593
594
			if (isAnyResolutionSelected) {
595
				workingCopy.setResolutionFilter(null);
596
			} else {
597
				workingCopy.setResolutionFilter(
598
					new ResolutionFilter(selectedResolutions.toArray(new Resolution[selectedResolutions.size()])));
599
			}
600
		}
601
602
		IStructuredSelection prioritySelection = (IStructuredSelection) priority.getSelection();
603
		if (prioritySelection.isEmpty()) {
604
			workingCopy.setPriorityFilter(null);
605
		} else {
606
			boolean isAnyPrioritiesSelected = false;
607
608
			List<Priority> selectedPriorities = new ArrayList<Priority>();
609
610
			for (Iterator i = prioritySelection.iterator(); i.hasNext();) {
611
				Object selection = i.next();
612
				if (ANY_PRIORITY.equals(selection)) {
613
					isAnyPrioritiesSelected = true;
614
				} else if (selection instanceof Priority) {
615
					selectedPriorities.add((Priority) selection);
616
				}
617
			}
618
619
			if (isAnyPrioritiesSelected) {
620
				workingCopy.setPriorityFilter(null);
621
			} else {
622
				workingCopy.setPriorityFilter(
623
					new PriorityFilter(selectedPriorities.toArray(new Priority[selectedPriorities.size()])));
624
			}
625
		}
626
	}
627
628
	private void loadFromDefaults() {
629
		issueType.setSelection(new StructuredSelection(ANY_ISSUE_TYPE));
630
		reporterType.setSelection(new StructuredSelection(ANY_REPORTER));
631
		assigneeType.setSelection(new StructuredSelection(ANY_ASSIGNEE));
632
		status.setSelection(new StructuredSelection(ANY_STATUS));
633
		resolution.setSelection(new StructuredSelection(ANY_RESOLUTION));
634
		priority.setSelection(new StructuredSelection(ANY_PRIORITY));
635
	}
636
637
	private void loadFromWorkingCopy() {
638
		if (workingCopy.getIssueTypeFilter() != null) {
639
			issueType.setSelection(new StructuredSelection(workingCopy.getIssueTypeFilter().getIsueTypes()));
640
		} else {
641
			issueType.setSelection(new StructuredSelection(ANY_ISSUE_TYPE));
642
		}
643
644
		if (workingCopy.getReportedByFilter() != null) {
645
			UserFilter reportedByFilter = workingCopy.getReportedByFilter();
646
			if (reportedByFilter instanceof NobodyFilter) {
647
				reporterType.setSelection(new StructuredSelection(NO_REPORTER));
648
			} else if (reportedByFilter instanceof CurrentUserFilter) {
649
				reporterType.setSelection(new StructuredSelection(CURRENT_USER_REPORTER));
650
			} else if (reportedByFilter instanceof SpecificUserFilter) {
651
				reporterType.setSelection(new StructuredSelection(SPECIFIC_USER_REPORTER));
652
				reporter.setText(((SpecificUserFilter) reportedByFilter).getUser());
653
			} else if (reportedByFilter instanceof UserInGroupFilter) {
654
				reporterType.setSelection(new StructuredSelection(SPECIFIC_GROUP_REPORTER));
655
				reporter.setText(((UserInGroupFilter) reportedByFilter).getGroup());
656
			}
657
		} else {
658
			reporterType.setSelection(new StructuredSelection(ANY_REPORTER));
659
		}
660
661
		if (workingCopy.getAssignedToFilter() != null) {
662
			UserFilter assignedToFilter = workingCopy.getAssignedToFilter();
663
			if (assignedToFilter instanceof NobodyFilter) {
664
				assigneeType.setSelection(new StructuredSelection(UNASSIGNED));
665
			} else if (assignedToFilter instanceof CurrentUserFilter) {
666
				assigneeType.setSelection(new StructuredSelection(CURRENT_USER_ASSIGNEE));
667
			} else if (assignedToFilter instanceof SpecificUserFilter) {
668
				assigneeType.setSelection(new StructuredSelection(SPECIFIC_USER_ASSIGNEE));
669
				assignee.setText(((SpecificUserFilter) assignedToFilter).getUser());
670
			} else if (assignedToFilter instanceof UserInGroupFilter) {
671
				assigneeType.setSelection(new StructuredSelection(SPECIFIC_GROUP_ASSIGNEE));
672
				assignee.setText(((UserInGroupFilter) assignedToFilter).getGroup());
673
			}
674
		} else {
675
			assigneeType.setSelection(new StructuredSelection(ANY_ASSIGNEE));
676
		}
677
678
		if (workingCopy.getStatusFilter() != null) {
679
			status.setSelection(new StructuredSelection(workingCopy.getStatusFilter().getStatuses()));
680
		} else {
681
			status.setSelection(new StructuredSelection(ANY_STATUS));
682
		}
683
684
		if (workingCopy.getResolutionFilter() != null) {
685
			resolution.setSelection(new StructuredSelection(workingCopy.getResolutionFilter().getResolutions()));
686
		} else {
687
			resolution.setSelection(new StructuredSelection(ANY_RESOLUTION));
688
		}
689
690
		if (workingCopy.getPriorityFilter() != null) {
691
			priority.setSelection(new StructuredSelection(workingCopy.getPriorityFilter().getPriorities()));
692
		} else {
693
			priority.setSelection(new StructuredSelection(ANY_PRIORITY));
694
		}
695
	}
696
697
	private final class Placeholder {
698
		private final String text;
699
700
		public Placeholder(String text) {
701
			this.text = text;
702
		}
703
704
		/*
705
		 * (non-Javadoc)
706
		 * 
707
		 * @see java.lang.Object#equals(java.lang.Object)
708
		 */
709
		public boolean equals(Object obj) {
710
			if (obj == null)
711
				return false;
712
			if (!(obj instanceof Placeholder))
713
				return false;
714
715
			Placeholder that = (Placeholder) obj;
716
			return this.text.equals(that.text);
717
		}
718
719
		public String getText() {
720
			return this.text;
721
		}
722
	}
723
}

Return to bug 129086