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 144722 | Differences between
and this patch

Collapse All | Expand All

(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/META-INF/MANIFEST.MF (-1 / +2 lines)
Lines 15-21 Link Here
15
 org.eclipse.mylar.tasks.core,
15
 org.eclipse.mylar.tasks.core,
16
 org.eclipse.search,
16
 org.eclipse.search,
17
 com.itsolut.mantis.core,
17
 com.itsolut.mantis.core,
18
 org.eclipse.jface.text
18
 org.eclipse.jface.text,
19
 org.eclipse.mylar
19
Eclipse-LazyStart: true
20
Eclipse-LazyStart: true
20
Export-Package: com.itsolut.mantis.ui,
21
Export-Package: com.itsolut.mantis.ui,
21
 com.itsolut.mantis.ui.editor,
22
 com.itsolut.mantis.ui.editor,
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/wizard/MantisQueryWizardPage.java (-1 / +1 lines)
Lines 17-23 Link Here
17
import java.util.Set;
17
import java.util.Set;
18
18
19
import org.eclipse.jface.wizard.WizardPage;
19
import org.eclipse.jface.wizard.WizardPage;
20
import org.eclipse.mylar.context.core.MylarStatusHandler;
20
import org.eclipse.mylar.core.MylarStatusHandler;
21
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
21
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
22
import org.eclipse.mylar.tasks.core.TaskRepository;
22
import org.eclipse.mylar.tasks.core.TaskRepository;
23
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
23
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/wizard/NewMantisTaskPage.java (-5 / +9 lines)
Lines 28-34 Link Here
28
import org.eclipse.core.runtime.IProgressMonitor;
28
import org.eclipse.core.runtime.IProgressMonitor;
29
import org.eclipse.jface.operation.IRunnableWithProgress;
29
import org.eclipse.jface.operation.IRunnableWithProgress;
30
import org.eclipse.jface.wizard.WizardPage;
30
import org.eclipse.jface.wizard.WizardPage;
31
import org.eclipse.mylar.tasks.core.AbstractAttributeFactory;
31
import org.eclipse.mylar.tasks.core.RepositoryTaskData;
32
import org.eclipse.mylar.tasks.core.RepositoryTaskData;
33
import org.eclipse.mylar.tasks.core.Task;
32
import org.eclipse.mylar.tasks.core.TaskRepository;
34
import org.eclipse.mylar.tasks.core.TaskRepository;
33
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
35
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
34
import org.eclipse.swt.SWT;
36
import org.eclipse.swt.SWT;
Lines 44-50 Link Here
44
import com.itsolut.mantis.core.exception.MantisException;
46
import com.itsolut.mantis.core.exception.MantisException;
45
import com.itsolut.mantis.core.model.MantisProject;
47
import com.itsolut.mantis.core.model.MantisProject;
46
import com.itsolut.mantis.core.model.MantisTicket.Key;
48
import com.itsolut.mantis.core.model.MantisTicket.Key;
47
import com.itsolut.mantis.core.util.MantisUtils;
48
import com.itsolut.mantis.ui.MantisUIPlugin;
49
import com.itsolut.mantis.ui.MantisUIPlugin;
49
50
50
/**
51
/**
Lines 159-175 Link Here
159
		}
160
		}
160
161
161
		MantisOfflineTaskHandler offlineHandler = (MantisOfflineTaskHandler) connector.getTaskDataHandler();
162
		MantisOfflineTaskHandler offlineHandler = (MantisOfflineTaskHandler) connector.getTaskDataHandler();
162
		
163
		AbstractAttributeFactory attributeFactory = offlineHandler.getAttributeFactory(taskRepository.getUrl(), taskRepository.getKind(), Task.DEFAULT_TASK_KIND);
163
		this.taskData = new RepositoryTaskData(offlineHandler.getAttributeFactory(), 
164
		this.taskData = new RepositoryTaskData(attributeFactory, 
164
				                               MantisCorePlugin.REPOSITORY_KIND,
165
				                               MantisCorePlugin.REPOSITORY_KIND,
165
				                               taskRepository.getUrl(),
166
				                               taskRepository.getUrl(),
166
				                               TasksUiPlugin.getDefault().getNextNewRepositoryTaskId());
167
				                               TasksUiPlugin.getDefault().getNextNewRepositoryTaskId(), 
168
				                               Task.DEFAULT_TASK_KIND);
167
		
169
		
170
		this.taskData.setNew(true);
171
		
168
		//default setting
172
		//default setting
169
		taskData.setAttributeValue(Key.PROJECT.getKey(), projectCombo.getText());
173
		taskData.setAttributeValue(Key.PROJECT.getKey(), projectCombo.getText());
170
		
174
		
171
		try {
175
		try {
172
			MantisOfflineTaskHandler.createDefaultAttributes(offlineHandler.getAttributeFactory(), taskData, client, false);
176
			MantisOfflineTaskHandler.createDefaultAttributes(taskData.getAttributeFactory(), taskData, client, false);
173
		} catch (CoreException e) {
177
		} catch (CoreException e) {
174
			MantisUIPlugin.handleMantisException(e.getCause());
178
			MantisUIPlugin.handleMantisException(e.getCause());
175
		}
179
		}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/wizard/MantisCustomQueryPage.java (-2 lines)
Lines 47-54 Link Here
47
import com.itsolut.mantis.core.model.MantisProjectFilter;
47
import com.itsolut.mantis.core.model.MantisProjectFilter;
48
import com.itsolut.mantis.core.model.MantisSearch;
48
import com.itsolut.mantis.core.model.MantisSearch;
49
import com.itsolut.mantis.core.model.MantisSearchFilter;
49
import com.itsolut.mantis.core.model.MantisSearchFilter;
50
import com.itsolut.mantis.core.model.MantisTicket.Key;
51
import com.itsolut.mantis.core.util.MantisUtils;
52
50
53
/**
51
/**
54
 * Mantis search page. Provides a form similar to the one the Bugzilla connector
52
 * Mantis search page. Provides a form similar to the one the Bugzilla connector
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/wizard/MantisRepositorySettingsPage.java (+8 lines)
Lines 30-35 Link Here
30
import org.eclipse.jface.dialogs.MessageDialog;
30
import org.eclipse.jface.dialogs.MessageDialog;
31
import org.eclipse.jface.operation.IRunnableWithProgress;
31
import org.eclipse.jface.operation.IRunnableWithProgress;
32
import org.eclipse.mylar.tasks.core.RepositoryTemplate;
32
import org.eclipse.mylar.tasks.core.RepositoryTemplate;
33
import org.eclipse.mylar.tasks.core.TaskRepository;
33
import org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi;
34
import org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi;
34
import org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage;
35
import org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage;
35
import org.eclipse.swt.SWT;
36
import org.eclipse.swt.SWT;
Lines 116-121 Link Here
116
		}
117
		}
117
		accessTypeCombo.addSelectionListener(new SelectionListener() {
118
		accessTypeCombo.addSelectionListener(new SelectionListener() {
118
			public void widgetSelected(SelectionEvent e) {
119
			public void widgetSelected(SelectionEvent e) {
120
				setMantisVersion(getMantisVersion());
119
				getWizard().getContainer().updateButtons();
121
				getWizard().getContainer().updateButtons();
120
			}
122
			}
121
123
Lines 240-243 Link Here
240
		
242
		
241
		super.getWizard().getContainer().updateButtons();
243
		super.getWizard().getContainer().updateButtons();
242
	}
244
	}
245
246
	@Override
247
	protected Validator getValidator(TaskRepository repository) {
248
		// TODO Auto-generated method stub
249
		return null;
250
	}
243
}
251
}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/wizard/NewMantisTaskWizard.java (-2 / +2 lines)
Lines 13-20 Link Here
13
13
14
import org.eclipse.jface.viewers.IStructuredSelection;
14
import org.eclipse.jface.viewers.IStructuredSelection;
15
import org.eclipse.jface.wizard.Wizard;
15
import org.eclipse.jface.wizard.Wizard;
16
import org.eclipse.mylar.internal.tasks.ui.TaskListImages;
17
import org.eclipse.mylar.internal.tasks.ui.TaskListPreferenceConstants;
16
import org.eclipse.mylar.internal.tasks.ui.TaskListPreferenceConstants;
17
import org.eclipse.mylar.internal.tasks.ui.TasksUiImages;
18
import org.eclipse.mylar.tasks.core.TaskRepository;
18
import org.eclipse.mylar.tasks.core.TaskRepository;
19
import org.eclipse.mylar.tasks.ui.TasksUiUtil;
19
import org.eclipse.mylar.tasks.ui.TasksUiUtil;
20
import org.eclipse.mylar.tasks.ui.editors.NewTaskEditorInput;
20
import org.eclipse.mylar.tasks.ui.editors.NewTaskEditorInput;
Lines 40-46 Link Here
40
		newTaskPage = new NewMantisTaskPage(taskRepository);
40
		newTaskPage = new NewMantisTaskPage(taskRepository);
41
		
41
		
42
		setWindowTitle("New Repository Task");
42
		setWindowTitle("New Repository Task");
43
		setDefaultPageImageDescriptor(TaskListImages.BANNER_REPOSITORY);
43
		setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
44
		
44
		
45
		setNeedsProgressMonitor(true);
45
		setNeedsProgressMonitor(true);
46
	}
46
	}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/wizard/NewMantisQueryWizard.java (-2 / +2 lines)
Lines 12-18 Link Here
12
package com.itsolut.mantis.ui.wizard;
12
package com.itsolut.mantis.ui.wizard;
13
13
14
import org.eclipse.jface.wizard.Wizard;
14
import org.eclipse.jface.wizard.Wizard;
15
import org.eclipse.mylar.internal.tasks.ui.TaskListImages;
15
import org.eclipse.mylar.internal.tasks.ui.TasksUiImages;
16
import org.eclipse.mylar.tasks.core.AbstractRepositoryConnector;
16
import org.eclipse.mylar.tasks.core.AbstractRepositoryConnector;
17
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
17
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
18
import org.eclipse.mylar.tasks.core.TaskRepository;
18
import org.eclipse.mylar.tasks.core.TaskRepository;
Lines 34-40 Link Here
34
34
35
		setNeedsProgressMonitor(true);
35
		setNeedsProgressMonitor(true);
36
		setWindowTitle(TITLE);
36
		setWindowTitle(TITLE);
37
		setDefaultPageImageDescriptor(TaskListImages.BANNER_REPOSITORY);
37
		setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
38
	}
38
	}
39
39
40
	@Override
40
	@Override
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/editor/NewMantisTaskEditor.java (-168 lines)
Lines 18-58 Link Here
18
18
19
package com.itsolut.mantis.ui.editor;
19
package com.itsolut.mantis.ui.editor;
20
20
21
import java.util.Collections;
22
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.IStatus;
25
import org.eclipse.core.runtime.Status;
26
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
27
import org.eclipse.core.runtime.jobs.Job;
28
import org.eclipse.jface.text.TextViewer;
21
import org.eclipse.jface.text.TextViewer;
29
import org.eclipse.mylar.tasks.core.AbstractRepositoryTask;
30
import org.eclipse.mylar.tasks.core.AbstractTaskContainer;
31
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
22
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
32
import org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor;
23
import org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor;
33
import org.eclipse.mylar.tasks.ui.search.SearchHitCollector;
24
import org.eclipse.mylar.tasks.ui.search.SearchHitCollector;
34
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.events.ModifyEvent;
36
import org.eclipse.swt.events.ModifyListener;
37
import org.eclipse.swt.layout.GridData;
38
import org.eclipse.swt.layout.GridLayout;
39
import org.eclipse.swt.widgets.Composite;
40
import org.eclipse.ui.forms.editor.FormEditor;
25
import org.eclipse.ui.forms.editor.FormEditor;
41
import org.eclipse.ui.forms.widgets.FormToolkit;
42
import org.eclipse.ui.forms.widgets.Section;
43
26
44
import com.itsolut.mantis.core.IMantisClient;
27
import com.itsolut.mantis.core.IMantisClient;
45
import com.itsolut.mantis.core.MantisCorePlugin;
46
import com.itsolut.mantis.core.MantisRepositoryConnector;
47
import com.itsolut.mantis.core.MantisRepositoryQuery;
28
import com.itsolut.mantis.core.MantisRepositoryQuery;
48
import com.itsolut.mantis.core.MantisTask;
49
import com.itsolut.mantis.core.MantisAttributeFactory.Attribute;
50
import com.itsolut.mantis.core.exception.InvalidTicketException;
51
import com.itsolut.mantis.core.model.MantisSearch;
29
import com.itsolut.mantis.core.model.MantisSearch;
52
import com.itsolut.mantis.core.model.MantisSearchFilter;
30
import com.itsolut.mantis.core.model.MantisSearchFilter;
53
import com.itsolut.mantis.core.model.MantisTicket;
54
import com.itsolut.mantis.core.model.MantisSearchFilter.CompareOperator;
31
import com.itsolut.mantis.core.model.MantisSearchFilter.CompareOperator;
55
import com.itsolut.mantis.ui.MantisUIPlugin;
56
32
57
/**
33
/**
58
 * @author Steffen Pingel
34
 * @author Steffen Pingel
Lines 60-67 Link Here
60
 */
36
 */
61
public class NewMantisTaskEditor extends AbstractNewRepositoryTaskEditor {
37
public class NewMantisTaskEditor extends AbstractNewRepositoryTaskEditor {
62
38
63
	private static final String SUBMIT_JOB_LABEL = "Submitting to Mantis repository";
64
65
	protected static final String LABEL_SECTION_STEPS = "Steps To Reproduce";
39
	protected static final String LABEL_SECTION_STEPS = "Steps To Reproduce";
66
	protected TextViewer stepsToReproduceViewer;
40
	protected TextViewer stepsToReproduceViewer;
67
41
Lines 73-131 Link Here
73
	}
47
	}
74
48
75
	@Override
49
	@Override
76
	public void submitToRepository() {
77
		if (!prepareSubmit()) {
78
			return;
79
		}
80
81
		final MantisRepositoryConnector connector = (MantisRepositoryConnector) TasksUiPlugin.getRepositoryManager()
82
				.getRepositoryConnector(repository.getKind());
83
84
		updateTask();
85
86
		final MantisTicket ticket;
87
		try {
88
			ticket = MantisRepositoryConnector.getMantisTicket(repository, getRepositoryTaskData());
89
		} catch (InvalidTicketException e) {
90
			MantisUIPlugin.handleMantisException(e);
91
			submitButton.setEnabled(true);
92
			showBusy(false);
93
			return;
94
		}
95
		
96
		//TODO: let user select
97
		final AbstractTaskContainer category = getCategory();
98
//		final AbstractTaskContainer category = TasksUiPlugin.getTaskListManager().getTaskList().getRootCategory();
99
		Job submitJob = new Job(SUBMIT_JOB_LABEL) {
100
			@Override
101
			protected IStatus run(IProgressMonitor monitor) {
102
				try {
103
					IMantisClient server = connector.getClientManager().getRepository(repository);
104
					int id = server.createTicket(ticket);
105
106
					MantisTask newTask = new MantisTask(AbstractRepositoryTask.getHandle(repository.getUrl(), id),
107
							MantisRepositoryConnector.getTicketDescription(ticket), true);
108
					
109
					if (category != null) {
110
						TasksUiPlugin.getTaskListManager().getTaskList().addTask(newTask, category);
111
					} else {
112
						TasksUiPlugin.getTaskListManager().getTaskList().addTask(newTask);
113
					}
114
115
					TasksUiPlugin.getSynchronizationScheduler().synchNow(0, Collections.singletonList(repository));
116
117
					return Status.OK_STATUS;
118
				} catch (Exception e) {
119
					return MantisCorePlugin.toStatus(e);
120
				}
121
			}
122
		};
123
124
		submitJob.addJobChangeListener(getSubmitJobListener());
125
		submitJob.schedule();
126
	}
127
128
	@Override
129
	public SearchHitCollector getDuplicateSearchCollector(String searchString) {
50
	public SearchHitCollector getDuplicateSearchCollector(String searchString) {
130
		MantisSearchFilter filter = new MantisSearchFilter("description");
51
		MantisSearchFilter filter = new MantisSearchFilter("description");
131
		filter.setOperator(CompareOperator.CONTAINS);
52
		filter.setOperator(CompareOperator.CONTAINS);
Lines 147-239 Link Here
147
				repository, query);
68
				repository, query);
148
		return collector;
69
		return collector;
149
	}
70
	}
150
151
	@Override
152
	protected void handleSubmitError(final IJobChangeEvent event) {
153
		MantisUIPlugin.handleMantisException(event.getJob().getResult());
154
		
155
		if (!isDisposed() && !submitButton.isDisposed()) {
156
			submitButton.setEnabled(true);
157
			showBusy(false);
158
		}
159
	}
160
161
	@Override
162
	protected String getPluginId() {
163
		return MantisUIPlugin.PLUGIN_ID;
164
	}
165
166
	@Override
167
	protected void createAttachmentLayout(Composite composite) {
168
		FormToolkit toolkit = this.getManagedForm().getToolkit();
169
		Section section = createSection(composite, LABEL_SECTION_STEPS);
170
		section.setExpanded(false);
171
172
		Composite stepsToReproduceComposite = toolkit.createComposite(section);
173
		GridLayout descriptionLayout = new GridLayout();
174
175
		stepsToReproduceComposite.setLayout(descriptionLayout);
176
		GridData stepsToReproduceData = new GridData(GridData.FILL_BOTH);
177
		stepsToReproduceData.grabExcessVerticalSpace = true;
178
		stepsToReproduceComposite.setLayoutData(stepsToReproduceData);
179
		section.setClient(stepsToReproduceComposite);
180
181
		stepsToReproduceViewer = addTextEditor(repository, stepsToReproduceComposite,
182
				getRepositoryTaskData().getAttributeValue(Attribute.STEPS_TO_REPRODUCE.getMantisKey()), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
183
		stepsToReproduceViewer.setEditable(true);
184
185
		GridData descriptionTextData = new GridData(GridData.FILL_BOTH);
186
		stepsToReproduceViewer.getControl().setLayoutData(descriptionTextData);
187
		stepsToReproduceViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
188
		stepsToReproduceViewer.getTextWidget().addModifyListener(new ModifyListener() {
189
			public void modifyText(ModifyEvent e) {
190
				String changed = stepsToReproduceViewer.getTextWidget().getText();
191
				String original = getRepositoryTaskData().getAttributeValue(Attribute.STEPS_TO_REPRODUCE.getMantisKey());
192
				if (original==null || !(original.equals(changed))) {
193
					getRepositoryTaskData().getAttribute(Attribute.STEPS_TO_REPRODUCE.getMantisKey()).setValue(changed);
194
					markDirty(true);
195
				}
196
				validateInput();
197
			}
198
		});
199
200
		toolkit.paintBordersFor(stepsToReproduceComposite);
201
		
202
		////////////////
203
		Section sectionAddtional = createSection(composite, LABEL_SECTION_ADDITIONAL);
204
		sectionAddtional.setExpanded(false);
205
206
		Composite additionalComposite = toolkit.createComposite(sectionAddtional);
207
		GridLayout additionalLayout = new GridLayout();
208
209
		additionalComposite.setLayout(additionalLayout);
210
		GridData additionalData = new GridData(GridData.FILL_BOTH);
211
		additionalData.grabExcessVerticalSpace = true;
212
		additionalComposite.setLayoutData(additionalData);
213
		sectionAddtional.setClient(additionalComposite);
214
215
		additionalViewer = addTextEditor(repository, additionalComposite,
216
				getRepositoryTaskData().getAttributeValue(Attribute.ADDITIONAL_INFO.getMantisKey()), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
217
		additionalViewer.setEditable(true);
218
219
		GridData additionalTextData = new GridData(GridData.FILL_BOTH);
220
		additionalViewer.getControl().setLayoutData(additionalTextData);
221
		additionalViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
222
		additionalViewer.getTextWidget().addModifyListener(new ModifyListener() {
223
			public void modifyText(ModifyEvent e) {
224
				String changed = additionalViewer.getTextWidget().getText();
225
				String original = getRepositoryTaskData().getAttributeValue(Attribute.ADDITIONAL_INFO.getMantisKey());
226
				if (original==null || !(original.equals(changed))) {
227
					getRepositoryTaskData().getAttribute(Attribute.ADDITIONAL_INFO.getMantisKey()).setValue(changed);
228
					markDirty(true);
229
				}
230
				validateInput();
231
			}
232
		});
233
234
		toolkit.paintBordersFor(additionalComposite);
235
		///////////////////
236
		
237
		super.createAttachmentLayout(composite);
238
	}
239
}
71
}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/editor/MantisTaskEditor.java (-153 / +18 lines)
Lines 18-63 Link Here
18
18
19
package com.itsolut.mantis.ui.editor;
19
package com.itsolut.mantis.ui.editor;
20
20
21
import java.lang.reflect.InvocationTargetException;
22
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.IStatus;
25
import org.eclipse.core.runtime.NullProgressMonitor;
26
import org.eclipse.core.runtime.Status;
27
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
28
import org.eclipse.core.runtime.jobs.Job;
29
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
30
import org.eclipse.jface.operation.IRunnableWithProgress;
31
import org.eclipse.jface.text.TextViewer;
21
import org.eclipse.jface.text.TextViewer;
32
import org.eclipse.mylar.context.core.MylarStatusHandler;
33
import org.eclipse.mylar.tasks.core.AbstractRepositoryTask;
34
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
35
import org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor;
22
import org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor;
36
import org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput;
37
import org.eclipse.mylar.tasks.ui.editors.RepositoryTaskEditorInput;
38
import org.eclipse.mylar.tasks.ui.editors.RepositoryTaskOutlineNode;
39
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.SWT;
40
import org.eclipse.swt.events.ModifyEvent;
24
import org.eclipse.swt.events.ModifyEvent;
41
import org.eclipse.swt.events.ModifyListener;
25
import org.eclipse.swt.events.ModifyListener;
42
import org.eclipse.swt.layout.GridData;
26
import org.eclipse.swt.layout.GridData;
43
import org.eclipse.swt.layout.GridLayout;
27
import org.eclipse.swt.layout.GridLayout;
44
import org.eclipse.swt.widgets.Composite;
28
import org.eclipse.swt.widgets.Composite;
45
import org.eclipse.ui.IEditorInput;
46
import org.eclipse.ui.IEditorSite;
47
import org.eclipse.ui.PlatformUI;
48
import org.eclipse.ui.forms.editor.FormEditor;
29
import org.eclipse.ui.forms.editor.FormEditor;
49
import org.eclipse.ui.forms.widgets.ExpandableComposite;
50
import org.eclipse.ui.forms.widgets.FormToolkit;
30
import org.eclipse.ui.forms.widgets.FormToolkit;
51
import org.eclipse.ui.forms.widgets.Section;
31
import org.eclipse.ui.forms.widgets.Section;
52
import org.eclipse.ui.progress.IProgressService;
53
32
54
import com.itsolut.mantis.core.IMantisClient;
55
import com.itsolut.mantis.core.MantisCorePlugin;
56
import com.itsolut.mantis.core.MantisRepositoryConnector;
57
import com.itsolut.mantis.core.MantisAttributeFactory.Attribute;
33
import com.itsolut.mantis.core.MantisAttributeFactory.Attribute;
58
import com.itsolut.mantis.core.exception.InvalidTicketException;
59
import com.itsolut.mantis.core.model.MantisTicket;
60
import com.itsolut.mantis.ui.MantisUIPlugin;
61
34
62
/**
35
/**
63
 * @author Steffen Pingel
36
 * @author Steffen Pingel
Lines 65-72 Link Here
65
 */
38
 */
66
public class MantisTaskEditor extends AbstractRepositoryTaskEditor {
39
public class MantisTaskEditor extends AbstractRepositoryTaskEditor {
67
40
68
	private static final String SUBMIT_JOB_LABEL = "Submitting to Mantis Repository";
69
70
	protected static final String LABEL_SECTION_STEPS = "Steps To Reproduce";
41
	protected static final String LABEL_SECTION_STEPS = "Steps To Reproduce";
71
	protected TextViewer stepsToReproduceViewer;
42
	protected TextViewer stepsToReproduceViewer;
72
43
Lines 78-205 Link Here
78
	}
49
	}
79
50
80
	@Override
51
	@Override
81
	public void init(IEditorSite site, IEditorInput input) {
82
		if (!(input instanceof RepositoryTaskEditorInput))
83
			return;
84
85
		editorInput = (AbstractTaskEditorInput) input;
86
		repository = editorInput.getRepository();
87
		connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
88
				repository.getKind());
89
90
		setSite(site);
91
		setInput(input);
92
93
		taskOutlineModel = RepositoryTaskOutlineNode.parseBugReport(editorInput.getTaskData());
94
95
		isDirty = false;
96
		updateEditorTitle();
97
	}
98
99
	@Override
100
	public void submitToRepository() {
101
		if (isDirty()) {
102
			this.doSave(new NullProgressMonitor());
103
		}
104
		updateTask();
105
		submitButton.setEnabled(false);
106
		showBusy(true);
107
108
		final MantisTicket ticket;
109
		try {
110
			ticket = MantisRepositoryConnector.getMantisTicket(repository, getRepositoryTaskData());
111
		} catch (InvalidTicketException e) {
112
			MantisUIPlugin.handleMantisException(e);
113
			return;
114
		}
115
		final String comment = getNewCommentText();
116
		final AbstractRepositoryTask task = (AbstractRepositoryTask) TasksUiPlugin.getTaskListManager().getTaskList()
117
				.getTask(AbstractRepositoryTask.getHandle(repository.getUrl(), getRepositoryTaskData().getId()));
118
		final boolean attachContext = getAttachContext();
119
120
		JobChangeAdapter listener = new JobChangeAdapter() {
121
			@Override
122
			public void done(final IJobChangeEvent event) {
123
				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
124
					public void run() {
125
						if (event.getJob().getResult().isOK()) {
126
							if (attachContext) {
127
								attachContext();
128
							}
129
							close();
130
						}
131
					}
132
				});
133
			}
134
		};
135
136
		Job submitJob = new Job(SUBMIT_JOB_LABEL) {
137
138
			@Override
139
			protected IStatus run(IProgressMonitor monitor) {
140
				try {
141
					IMantisClient server = ((MantisRepositoryConnector) connector).getClientManager().getRepository(repository);
142
					server.updateTicket(ticket, comment);
143
					if (task != null) {
144
						// XXX: HACK TO AVOID OVERWRITE WARNING
145
						task.setTaskData(null);
146
						TasksUiPlugin.getSynchronizationManager().synchronize(connector, task, true, null);
147
					}
148
					return Status.OK_STATUS;
149
				} catch (final Exception e) {
150
					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
151
						public void run() {
152
							if (!isDisposed() && !submitButton.isDisposed()) {
153
								MantisUIPlugin.handleMantisException(e);
154
								// MantisUiPlugin.handleMantisException(event.getResult());
155
								submitButton.setEnabled(true);
156
								MantisTaskEditor.this.showBusy(false);
157
							}
158
						}
159
					});
160
					return Status.CANCEL_STATUS;
161
				}
162
			}
163
164
		};
165
166
		submitJob.addJobChangeListener(listener);
167
		submitJob.schedule();
168
169
	}
170
171
	@Override
172
	protected void validateInput() {
52
	protected void validateInput() {
173
	}
53
	}
174
54
175
	private void attachContext() {
176
		String handle = AbstractRepositoryTask.getHandle(repository.getUrl(), getRepositoryTaskData().getId());
177
		final AbstractRepositoryTask modifiedTask = (AbstractRepositoryTask) TasksUiPlugin.getTaskListManager()
178
				.getTaskList().getTask(handle);
179
180
		IProgressService ps = PlatformUI.getWorkbench().getProgressService();
181
		try {
182
			ps.busyCursorWhile(new IRunnableWithProgress() {
183
				public void run(IProgressMonitor pm) {
184
					try {
185
						connector.attachContext(repository, modifiedTask, "");
186
					} catch (Exception e) {
187
						MylarStatusHandler.fail(e, "Failed to attach task context.\n\n" + e.getMessage(), true);
188
					}
189
				}
190
			});
191
		} catch (InvocationTargetException e) {
192
			MylarStatusHandler.fail(e.getCause(), "Failed to attach task context.\n\n" + e.getMessage(), true);
193
		} catch (InterruptedException ignore) {
194
		}
195
	}
196
197
	@Override
55
	@Override
198
	protected String getPluginId() {
199
		return MantisUIPlugin.PLUGIN_ID;
200
	}
201
202
	@Override
203
	protected void createAttachmentLayout(Composite composite) {
56
	protected void createAttachmentLayout(Composite composite) {
204
		FormToolkit toolkit = this.getManagedForm().getToolkit();
57
		FormToolkit toolkit = this.getManagedForm().getToolkit();
205
		Section section = createSection(composite, LABEL_SECTION_STEPS);
58
		Section section = createSection(composite, LABEL_SECTION_STEPS);
Lines 215-221 Link Here
215
		section.setClient(stepsToReproduceComposite);
68
		section.setClient(stepsToReproduceComposite);
216
69
217
		stepsToReproduceViewer = addTextEditor(repository, stepsToReproduceComposite,
70
		stepsToReproduceViewer = addTextEditor(repository, stepsToReproduceComposite,
218
				getRepositoryTaskData().getAttributeValue(Attribute.STEPS_TO_REPRODUCE.getMantisKey()), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
71
				taskData.getAttributeValue(Attribute.STEPS_TO_REPRODUCE.getMantisKey()), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
219
		stepsToReproduceViewer.setEditable(true);
72
		stepsToReproduceViewer.setEditable(true);
220
73
221
		GridData descriptionTextData = new GridData(GridData.FILL_BOTH);
74
		GridData descriptionTextData = new GridData(GridData.FILL_BOTH);
Lines 224-232 Link Here
224
		stepsToReproduceViewer.getTextWidget().addModifyListener(new ModifyListener() {
77
		stepsToReproduceViewer.getTextWidget().addModifyListener(new ModifyListener() {
225
			public void modifyText(ModifyEvent e) {
78
			public void modifyText(ModifyEvent e) {
226
				String changed = stepsToReproduceViewer.getTextWidget().getText();
79
				String changed = stepsToReproduceViewer.getTextWidget().getText();
227
				String original = getRepositoryTaskData().getAttributeValue(Attribute.STEPS_TO_REPRODUCE.getMantisKey());
80
				String original = taskData.getAttributeValue(Attribute.STEPS_TO_REPRODUCE.getMantisKey());
228
				if (original==null || !(original.equals(changed))) {
81
				if (original==null || !(original.equals(changed))) {
229
					getRepositoryTaskData().getAttribute(Attribute.STEPS_TO_REPRODUCE.getMantisKey()).setValue(changed);
82
					taskData.getAttribute(Attribute.STEPS_TO_REPRODUCE.getMantisKey()).setValue(changed);
230
					markDirty(true);
83
					markDirty(true);
231
				}
84
				}
232
				validateInput();
85
				validateInput();
Lines 249-255 Link Here
249
		sectionAddtional.setClient(additionalComposite);
102
		sectionAddtional.setClient(additionalComposite);
250
103
251
		additionalViewer = addTextEditor(repository, additionalComposite,
104
		additionalViewer = addTextEditor(repository, additionalComposite,
252
				getRepositoryTaskData().getAttributeValue(Attribute.ADDITIONAL_INFO.getMantisKey()), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
105
				taskData.getAttributeValue(Attribute.ADDITIONAL_INFO.getMantisKey()), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
253
		additionalViewer.setEditable(true);
106
		additionalViewer.setEditable(true);
254
107
255
		GridData additionalTextData = new GridData(GridData.FILL_BOTH);
108
		GridData additionalTextData = new GridData(GridData.FILL_BOTH);
Lines 258-266 Link Here
258
		additionalViewer.getTextWidget().addModifyListener(new ModifyListener() {
111
		additionalViewer.getTextWidget().addModifyListener(new ModifyListener() {
259
			public void modifyText(ModifyEvent e) {
112
			public void modifyText(ModifyEvent e) {
260
				String changed = additionalViewer.getTextWidget().getText();
113
				String changed = additionalViewer.getTextWidget().getText();
261
				String original = getRepositoryTaskData().getAttributeValue(Attribute.ADDITIONAL_INFO.getMantisKey());
114
				String original = taskData.getAttributeValue(Attribute.ADDITIONAL_INFO.getMantisKey());
262
				if (original==null || !(original.equals(changed))) {
115
				if (original==null || !(original.equals(changed))) {
263
					getRepositoryTaskData().getAttribute(Attribute.ADDITIONAL_INFO.getMantisKey()).setValue(changed);
116
					taskData.getAttribute(Attribute.ADDITIONAL_INFO.getMantisKey()).setValue(changed);
264
					markDirty(true);
117
					markDirty(true);
265
				}
118
				}
266
				validateInput();
119
				validateInput();
Lines 272-275 Link Here
272
		
125
		
273
		super.createAttachmentLayout(composite);
126
		super.createAttachmentLayout(composite);
274
	}
127
	}
128
	
129
	@Override
130
	protected void addCCList(Composite attributesComposite) {
131
		// TODO Auto-generated method stub
132
		//super.addCCList(attributesComposite);
133
	}
134
	
135
	@Override
136
	protected void addSelfToCC(Composite composite) {
137
		// TODO Auto-generated method stub
138
		//super.addSelfToCC(composite);
139
	}
275
}
140
}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/editor/MantisTaskEditorFactory.java (-6 / +11 lines)
Lines 7-13 Link Here
7
 *******************************************************************************/
7
 *******************************************************************************/
8
package com.itsolut.mantis.ui.editor;
8
package com.itsolut.mantis.ui.editor;
9
9
10
import org.eclipse.mylar.context.core.MylarStatusHandler;
10
import org.eclipse.mylar.core.MylarStatusHandler;
11
import org.eclipse.mylar.tasks.core.ITask;
11
import org.eclipse.mylar.tasks.core.ITask;
12
import org.eclipse.mylar.tasks.core.TaskRepository;
12
import org.eclipse.mylar.tasks.core.TaskRepository;
13
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
13
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
Lines 51-61 Link Here
51
	}
51
	}
52
52
53
	public IEditorPart createEditor(TaskEditor parentEditor, IEditorInput editorInput) {
53
	public IEditorPart createEditor(TaskEditor parentEditor, IEditorInput editorInput) {
54
		if (editorInput instanceof RepositoryTaskEditorInput  || editorInput instanceof TaskEditorInput) {
54
		if (editorInput instanceof RepositoryTaskEditorInput) {
55
			RepositoryTaskEditorInput taskInput = (RepositoryTaskEditorInput) editorInput;
56
			if (taskInput.getTaskData().isNew()) {
57
				return new NewMantisTaskEditor(parentEditor);
58
			} else {
59
				return new MantisTaskEditor(parentEditor);
60
			}
61
		} else if (editorInput instanceof TaskEditorInput) {
55
			return new MantisTaskEditor(parentEditor);
62
			return new MantisTaskEditor(parentEditor);
56
		} else if (editorInput instanceof NewTaskEditorInput) {
63
		}
57
			return new NewMantisTaskEditor(parentEditor);
58
		} 
59
		return null;
64
		return null;
60
	}
65
	}
61
66
Lines 64-70 Link Here
64
		TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(MantisCorePlugin.REPOSITORY_KIND,
69
		TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(MantisCorePlugin.REPOSITORY_KIND,
65
				tracTask.getRepositoryUrl());
70
				tracTask.getRepositoryUrl());
66
		try {
71
		try {
67
			return new RepositoryTaskEditorInput(repository, tracTask.getHandleIdentifier(), tracTask.getUrl());
72
			return new RepositoryTaskEditorInput(repository, tracTask.getHandleIdentifier(), tracTask.getTaskUrl(), tracTask.getTaskId());
68
		} catch (Exception e) {
73
		} catch (Exception e) {
69
			MylarStatusHandler.fail(e, "Could not create Mantis editor input", true);
74
			MylarStatusHandler.fail(e, "Could not create Mantis editor input", true);
70
		}
75
		}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/MantisUIPlugin.java (-1 / +1 lines)
Lines 13-19 Link Here
13
13
14
import org.eclipse.core.runtime.IStatus;
14
import org.eclipse.core.runtime.IStatus;
15
import org.eclipse.jface.dialogs.ErrorDialog;
15
import org.eclipse.jface.dialogs.ErrorDialog;
16
import org.eclipse.mylar.context.core.MylarStatusHandler;
16
import org.eclipse.mylar.core.MylarStatusHandler;
17
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
17
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
18
import org.eclipse.ui.plugin.AbstractUIPlugin;
18
import org.eclipse.ui.plugin.AbstractUIPlugin;
19
import org.osgi.framework.BundleContext;
19
import org.osgi.framework.BundleContext;
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/MantisRepositoryUi.java (-4 / +3 lines)
Lines 79-90 Link Here
79
	}
79
	}
80
80
81
	@Override
81
	@Override
82
	public boolean openRemoteTask(String repositoryUrl, String idString) {
82
	public boolean openRepositoryTask(String repositoryUrl, String id) {
83
		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
83
		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
84
		String ticketUrl = repositoryUrl + IMantisClient.TICKET_URL + idString;
84
		String ticketUrl = repositoryUrl + IMantisClient.TICKET_URL + id;
85
		OpenRepositoryTaskJob job = new OpenRepositoryTaskJob(MantisCorePlugin.REPOSITORY_KIND, repositoryUrl, idString, ticketUrl, page);
85
		OpenRepositoryTaskJob job = new OpenRepositoryTaskJob(MantisCorePlugin.REPOSITORY_KIND, repositoryUrl, id, ticketUrl, page);
86
		job.schedule();
86
		job.schedule();
87
		return true;
87
		return true;
88
	}
88
	}
89
	
90
}
89
}
(-)D:/dev/Eclipse/workspace/Mylar Mantis Connector/com.itsolut.mantis.ui/src/com/itsolut/mantis/ui/MantisTaskExternalizer.java (-52 / +18 lines)
Lines 11-17 Link Here
11
11
12
package com.itsolut.mantis.ui;
12
package com.itsolut.mantis.ui;
13
13
14
import org.eclipse.mylar.context.core.MylarStatusHandler;
14
import org.eclipse.mylar.core.MylarStatusHandler;
15
import org.eclipse.mylar.tasks.core.AbstractQueryHit;
15
import org.eclipse.mylar.tasks.core.AbstractQueryHit;
16
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
16
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
17
import org.eclipse.mylar.tasks.core.AbstractTaskContainer;
17
import org.eclipse.mylar.tasks.core.AbstractTaskContainer;
Lines 23-29 Link Here
23
import org.w3c.dom.Document;
23
import org.w3c.dom.Document;
24
import org.w3c.dom.Element;
24
import org.w3c.dom.Element;
25
import org.w3c.dom.Node;
25
import org.w3c.dom.Node;
26
import org.w3c.dom.NodeList;
27
26
28
import com.itsolut.mantis.core.MantisQueryHit;
27
import com.itsolut.mantis.core.MantisQueryHit;
29
import com.itsolut.mantis.core.MantisRepositoryQuery;
28
import com.itsolut.mantis.core.MantisRepositoryQuery;
Lines 68-97 Link Here
68
		return KEY_TRAC_TASK;
67
		return KEY_TRAC_TASK;
69
	}
68
	}
70
69
70
	//query related methods
71
	
71
	@Override
72
	@Override
72
	public ITask readTask(Node node, TaskList taskList, AbstractTaskContainer category, ITask parent)
73
	public ITask createTask(String repositoryUrl, String taskId, String summary,
73
			throws TaskExternalizationException {
74
			Element element, TaskList taskList, AbstractTaskContainer category,
74
75
			ITask parent) throws TaskExternalizationException {
75
		Element element = (Element) node;
76
		return new MantisTask(repositoryUrl, taskId, summary, false);
76
		String handle;
77
		String label;
78
		if (element.hasAttribute(KEY_HANDLE)) {
79
			handle = element.getAttribute(KEY_HANDLE);
80
		} else {
81
			throw new TaskExternalizationException("Handle not stored for task");
82
		}
83
		if (element.hasAttribute(KEY_LABEL)) {
84
			label = element.getAttribute(KEY_LABEL);
85
		} else {
86
			throw new TaskExternalizationException("Description not stored for task");
87
		}
88
89
		MantisTask task = new MantisTask(handle, label, false);
90
		readTaskInfo(task, taskList, element, parent, category);
91
		return task;
92
	}
77
	}
93
94
	// query related methods
95
	
78
	
96
	@Override
79
	@Override
97
	public boolean canCreateElementFor(AbstractQueryHit queryHit) {
80
	public boolean canCreateElementFor(AbstractQueryHit queryHit) {
Lines 176-216 Link Here
176
			throw new TaskExternalizationException("Description not stored for task");
159
			throw new TaskExternalizationException("Description not stored for task");
177
		}
160
		}
178
161
179
		MantisRepositoryQuery query = new MantisRepositoryQuery(repositoryUrl, queryUrl, label, taskList);
162
		return new MantisRepositoryQuery(repositoryUrl, queryUrl, label, taskList);
180
181
		NodeList list = node.getChildNodes();
182
		for (int i = 0; i < list.getLength(); i++) {
183
			Node child = list.item(i);
184
			try {
185
				readQueryHit(child, taskList, query);
186
			} catch (TaskExternalizationException e) {
187
				MylarStatusHandler.log(e, e.getMessage());
188
			}
189
		}
190
		return query;
191
	}
163
	}
192
164
	
193
	@Override
165
	@Override
194
	public void readQueryHit(Node node, TaskList taskList, AbstractRepositoryQuery query)
166
	public AbstractQueryHit createQueryHit(String repositoryUrl, String taskId,
195
			throws TaskExternalizationException {
167
			String summary, Element element, TaskList taskList,
196
		Element element = (Element) node;
168
			AbstractRepositoryQuery query) throws TaskExternalizationException {
197
169
		
198
		String handle;
170
		MantisQueryHit hit = new MantisQueryHit(taskList, repositoryUrl, summary, taskId);
199
		if (element.hasAttribute(KEY_HANDLE)) {
171
		
200
			handle = element.getAttribute(KEY_HANDLE);
172
		// TODO: move to DelegationTaskExternalizer
201
		} else {
202
			throw new TaskExternalizationException("Handle not stored for bug report");
203
		}
204
205
		MantisQueryHit hit = new MantisQueryHit(taskList, handle);
206
		// TODO move to DelegationTaskExternalizer
207
		if (element.hasAttribute(KEY_COMPLETE)
173
		if (element.hasAttribute(KEY_COMPLETE)
208
				&& element.getAttribute(KEY_COMPLETE).compareTo(VAL_TRUE) == 0) {
174
				&& element.getAttribute(KEY_COMPLETE).compareTo(VAL_TRUE) == 0) {
209
			hit.setCompleted(true);
175
			hit.setCompleted(true);
210
		} else {
176
		} else {
211
			hit.setCompleted(false);
177
			hit.setCompleted(false);
212
		}
178
		}
213
		readQueryHitInfo(hit, taskList, query, element);
179
		
180
		return hit;
214
	}
181
	}
215
216
}
182
}

Return to bug 144722