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 189514
Collapse All | Expand All

(-)src/org/eclipse/mylyn/tasks/ui/TaskListManager.java (-28 / +39 lines)
Lines 1206-1214 Link Here
1206
	public List<AbstractRepositoryQuery> insertQueries(List<AbstractRepositoryQuery> queries) {
1206
	public List<AbstractRepositoryQuery> insertQueries(List<AbstractRepositoryQuery> queries) {
1207
		List<AbstractRepositoryQuery> badQueries = new ArrayList<AbstractRepositoryQuery>();
1207
		List<AbstractRepositoryQuery> badQueries = new ArrayList<AbstractRepositoryQuery>();
1208
		
1208
		
1209
		String patternStr = "\\[(\\d+)\\]$"; // all string that end with [x], where x is a number
1210
	    Pattern pattern = Pattern.compile(patternStr);
1211
		
1212
		for (AbstractRepositoryQuery query : queries) {
1209
		for (AbstractRepositoryQuery query : queries) {
1213
1210
1214
			TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
1211
			TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
Lines 1218-1248 Link Here
1218
				continue;
1215
				continue;
1219
			}
1216
			}
1220
1217
1221
			// resolve name conflict
1218
			String handle = resolveIdentifiersConflict(query);
1222
			{
1219
			query.setHandleIdentifier(handle);
1223
				Set<AbstractRepositoryQuery> existingQueries = getTaskList().getQueries();
1224
				Map<String, AbstractRepositoryQuery> queryMap = new HashMap<String, AbstractRepositoryQuery>();
1225
				for (AbstractRepositoryQuery existingQuery : existingQueries) {
1226
					queryMap.put(existingQuery.getHandleIdentifier(), existingQuery);
1227
				}
1228
1229
				// suggest a new handle if needed
1230
				String handle = query.getHandleIdentifier();
1231
				
1232
				while (queryMap.get(handle) != null) {
1233
					Matcher matcher = pattern.matcher(handle);
1234
					boolean matchFound = matcher.find();
1235
					if (matchFound) {
1236
						// increment index
1237
						int index = Integer.parseInt(matcher.group(1));
1238
						index++;
1239
						handle = matcher.replaceAll("[" + index + "]");
1240
					} else {
1241
						handle += "[1]";
1242
					}
1243
				}
1244
				query.setHandleIdentifier(handle);
1245
			}
1246
1220
1247
			// add query
1221
			// add query
1248
			TasksUiPlugin.getTaskListManager().getTaskList().addQuery(query);
1222
			TasksUiPlugin.getTaskListManager().getTaskList().addQuery(query);
Lines 1258-1261 Link Here
1258
		return badQueries;
1232
		return badQueries;
1259
	}
1233
	}
1260
1234
1235
	/**
1236
	 * Utility method that checks, if there is already a query with the same identifier.
1237
	 * @param query
1238
	 * @return a handle, that is not in conflict with any existed one in the system. If there were no 
1239
	 * conflict in the beginning, then the query's own identifier is returned. If there were, then
1240
	 * the suffix [x] is applied the query's identifier, where x is a number.
1241
	 */
1242
	public String resolveIdentifiersConflict(AbstractRepositoryQuery query) {
1243
		String patternStr = "\\[(\\d+)\\]$"; // all string that end with [x], where x is a number
1244
	    Pattern pattern = Pattern.compile(patternStr);
1245
	    
1246
		// resolve name conflict
1247
		Set<AbstractRepositoryQuery> existingQueries = getTaskList().getQueries();
1248
		Map<String, AbstractRepositoryQuery> queryMap = new HashMap<String, AbstractRepositoryQuery>();
1249
		for (AbstractRepositoryQuery existingQuery : existingQueries) {
1250
			queryMap.put(existingQuery.getHandleIdentifier(), existingQuery);
1251
		}
1252
1253
		// suggest a new handle if needed
1254
		String handle = query.getHandleIdentifier();
1255
1256
		while (queryMap.get(handle) != null) {
1257
			Matcher matcher = pattern.matcher(handle);
1258
			boolean matchFound = matcher.find();
1259
			if (matchFound) {
1260
				// increment index
1261
				int index = Integer.parseInt(matcher.group(1));
1262
				index++;
1263
				handle = matcher.replaceAll("[" + index + "]");
1264
			} else {
1265
				handle += "[1]";
1266
			}
1267
		}
1268
		
1269
		return handle;
1270
	}
1271
1261
}
1272
}
(-)plugin.xml (-2 / +2 lines)
Lines 343-349 Link Here
343
            </enablement>
343
            </enablement>
344
         </action>
344
         </action>
345
         
345
         
346
        <!-- <action
346
         <action
347
               class="org.eclipse.mylyn.internal.tasks.ui.actions.QueryCloneAction"
347
               class="org.eclipse.mylyn.internal.tasks.ui.actions.QueryCloneAction"
348
               definitionId="org.eclipse.ui.query.clone"
348
               definitionId="org.eclipse.ui.query.clone"
349
               enablesFor="org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery"
349
               enablesFor="org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery"
Lines 351-357 Link Here
351
               label="Clone Query..."
351
               label="Clone Query..."
352
               menubarPath="repository"
352
               menubarPath="repository"
353
               tooltip="Clone Repository Query">
353
               tooltip="Clone Repository Query">
354
         </action>-->
354
         </action>
355
         
355
         
356
         <action
356
         <action
357
               class="org.eclipse.mylyn.internal.tasks.ui.actions.QueryExportAction"
357
               class="org.eclipse.mylyn.internal.tasks.ui.actions.QueryExportAction"
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java (+99 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers 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
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
10
11
import java.util.ArrayList;
12
import java.util.List;
13
14
import org.eclipse.jface.action.Action;
15
import org.eclipse.jface.action.IAction;
16
import org.eclipse.jface.dialogs.MessageDialog;
17
import org.eclipse.jface.viewers.ISelection;
18
import org.eclipse.jface.viewers.StructuredSelection;
19
import org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants;
20
import org.eclipse.mylyn.monitor.core.StatusHandler;
21
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
22
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
23
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
24
import org.eclipse.ui.IViewActionDelegate;
25
import org.eclipse.ui.IViewPart;
26
import org.eclipse.ui.PlatformUI;
27
import org.w3c.dom.Document;
28
29
/**
30
 * Allow to clone a selected query.
31
 * 
32
 * @author Jevgeni Holodkov
33
 */
34
public class QueryCloneAction extends Action implements IViewActionDelegate {
35
36
	protected ISelection selection;
37
38
	public void init(IViewPart view) {
39
		// ignore
40
	}
41
42
	public void run(IAction action) {
43
		run(getSelectedQuery(selection));
44
	}
45
46
	public void selectionChanged(IAction action, ISelection selection) {
47
		this.selection = selection;
48
		AbstractRepositoryQuery selectedQuery = getSelectedQuery(selection);
49
		action.setEnabled(true);
50
		if (selectedQuery != null) {
51
			action.setEnabled(true);
52
		} else {
53
			action.setEnabled(false);
54
		}
55
	}
56
57
	protected AbstractRepositoryQuery getSelectedQuery(ISelection newSelection) {
58
		if (selection instanceof StructuredSelection) {
59
			// allow to select only one element
60
			if (((StructuredSelection) selection).size() == 1) {
61
				Object selectedObject = ((StructuredSelection) selection).getFirstElement();
62
				if (selectedObject instanceof AbstractRepositoryQuery) {
63
					return (AbstractRepositoryQuery) selectedObject;
64
				}
65
			}
66
		}
67
		return null;
68
	}
69
70
	public void run(AbstractRepositoryQuery selectedQuery) {
71
		if (selectedQuery == null) {
72
			MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
73
					ITasksUiConstants.TITLE_DIALOG, "No query selected.");
74
			return;
75
		}
76
		
77
		List<AbstractRepositoryQuery> queries = new ArrayList<AbstractRepositoryQuery>();
78
		queries.add(selectedQuery);
79
		
80
		Document queryDoc = TasksUiPlugin.getTaskListManager().getTaskListWriter().createQueryDocument(queries);
81
		List<AbstractRepositoryQuery> clonedQueries = TasksUiPlugin.getTaskListManager()
82
				.getTaskListWriter()
83
				.readQueryDocument(queryDoc);
84
85
		if (clonedQueries.size() > 0) {
86
			for (AbstractRepositoryQuery query : clonedQueries) {
87
				String handle = TasksUiPlugin.getTaskListManager().resolveIdentifiersConflict(query);
88
				query.setHandleIdentifier(handle);
89
				AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(query.getRepositoryKind());
90
				connectorUi.openEditQueryDialog(query);
91
			}
92
		} else {
93
			// cannot happen
94
			StatusHandler.fail(new IllegalStateException(selectedQuery.toString()), "Query cloning did not succeeded.", true);
95
			return;
96
		}
97
	}
98
99
}

Return to bug 189514