| /******************************************************************************* |
| * Copyright (c) 2009, 2010 Frank Becker and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Frank Becker - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.bugzilla.ui.action; |
| |
| import java.util.List; |
| |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants; |
| import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin; |
| import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage; |
| import org.eclipse.mylyn.internal.bugzilla.ui.editor.FlagAttributeEditor; |
| import org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaAttachmentWizard; |
| import org.eclipse.mylyn.internal.tasks.core.TaskTask; |
| import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; |
| import org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizardDialog; |
| import org.eclipse.mylyn.tasks.core.ITask; |
| import org.eclipse.mylyn.tasks.core.ITaskAttachment; |
| import org.eclipse.mylyn.tasks.core.TaskRepository; |
| import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttribute; |
| import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData; |
| import org.eclipse.mylyn.tasks.core.data.TaskData; |
| import org.eclipse.mylyn.tasks.core.data.TaskDataModel; |
| import org.eclipse.mylyn.tasks.core.data.TaskDataModelEvent; |
| import org.eclipse.mylyn.tasks.core.data.TaskDataModelListener; |
| import org.eclipse.mylyn.tasks.ui.TasksUi; |
| import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; |
| import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory; |
| import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IViewActionDelegate; |
| import org.eclipse.ui.IViewPart; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchPartSite; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.actions.BaseSelectionListenerAction; |
| import org.eclipse.ui.forms.editor.IFormPage; |
| |
| /** |
| * @author Frank Becker |
| */ |
| @SuppressWarnings("restriction") |
| // XXX 3.5 rename to BuzillaAttachmentDetailsAction |
| public class BugzillaAttachmentUpdateAction extends BaseSelectionListenerAction implements IViewActionDelegate { |
| |
| private ISelection currentSelection; |
| |
| public BugzillaAttachmentUpdateAction() { |
| super("BugzillaAttachmentDetailAction"); //$NON-NLS-1$ |
| } |
| |
| public void init(IViewPart view) { |
| // ignore |
| } |
| |
| public void run(IAction action) { |
| IStructuredSelection selection = null; |
| if (currentSelection instanceof IStructuredSelection) { |
| selection = (IStructuredSelection) currentSelection; |
| } |
| if (selection == null || selection.isEmpty() || selection.size() != 1) { |
| return; |
| } |
| ITaskAttachment attachment = (ITaskAttachment) selection.getFirstElement(); |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| IWorkbenchPage page = window.getActivePage(); |
| IEditorPart activeEditor = page.getActiveEditor(); |
| IWorkbenchPartSite site = activeEditor.getSite(); |
| Shell shell = site.getShell(); |
| if (activeEditor instanceof TaskEditor) { |
| final TaskEditor taskEditor = (TaskEditor) activeEditor; |
| IFormPage taskEditorPage = taskEditor.findPage("id"); //$NON-NLS-1$ |
| if (taskEditorPage instanceof BugzillaTaskEditorPage) { |
| BugzillaTaskEditorPage bugzillaTaskEditorPage = (BugzillaTaskEditorPage) taskEditorPage; |
| |
| ITask attachmentTask = attachment.getTask(); |
| ITask nTask = new TaskTask(attachmentTask.getConnectorKind(), attachmentTask.getRepositoryUrl(), |
| attachmentTask.getTaskId() + "attachment"); //$NON-NLS-1$ |
| |
| TaskData editTaskData = new TaskData(attachment.getTaskAttribute().getTaskData().getAttributeMapper(), |
| attachment.getTaskAttribute().getTaskData().getConnectorKind(), attachment.getTaskAttribute() |
| .getTaskData() |
| .getRepositoryUrl(), attachment.getTaskAttribute().getTaskData().getTaskId()); |
| editTaskData.setVersion(attachment.getTaskAttribute().getTaskData().getVersion()); |
| TaskAttribute target0 = editTaskData.getRoot(); |
| TaskAttribute temp = attachment.getTaskAttribute(); |
| target0.setValues(temp.getValues()); |
| for (TaskAttribute child : temp.getAttributes().values()) { |
| target0.deepAddCopy(child); |
| } |
| |
| TaskAttribute comment = target0.createAttribute("comment"); //$NON-NLS-1$ |
| TaskAttributeMetaData commentMeta = comment.getMetaData(); |
| commentMeta.setType(TaskAttribute.TYPE_LONG_RICH_TEXT); |
| commentMeta.setLabel(Messages.BugzillaAttachmentUpdateAction_Comment); |
| |
| ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(nTask, editTaskData); |
| TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository( |
| attachment.getTaskAttribute().getTaskData().getRepositoryUrl()); |
| final String repositoryLabel = repository.getRepositoryLabel(); |
| final TaskDataModel model = new TaskDataModel(repository, nTask, workingCopy); |
| AttributeEditorFactory factory = new AttributeEditorFactory(model, repository, |
| bugzillaTaskEditorPage.getEditorSite()) { |
| @Override |
| public AbstractAttributeEditor createEditor(String type, final TaskAttribute taskAttribute) { |
| AbstractAttributeEditor editor; |
| if (IBugzillaConstants.EDITOR_TYPE_FLAG.equals(type)) { |
| editor = new FlagAttributeEditor(model, taskAttribute); |
| } else { |
| editor = super.createEditor(type, taskAttribute); |
| if (TaskAttribute.TYPE_BOOLEAN.equals(type)) { |
| editor.setDecorationEnabled(false); |
| } |
| } |
| return editor; |
| } |
| }; |
| |
| TaskAttribute target = workingCopy.getLocalData().getRoot(); |
| target.setValue(target0.getValue()); |
| |
| final BugzillaAttachmentWizard attachmentWizard = new BugzillaAttachmentWizard(shell, factory, target, |
| taskEditor, attachment, repository.getRepositoryLabel()); |
| final NewAttachmentWizardDialog dialog = new NewAttachmentWizardDialog(shell, attachmentWizard, false) { |
| |
| @Override |
| protected IDialogSettings getDialogBoundsSettings() { |
| IDialogSettings settings = BugzillaUiPlugin.getDefault().getDialogSettings(); |
| IDialogSettings section = settings.getSection(BugzillaUiPlugin.ATTACHMENT_WIZARD_SETTINGS_SECTION |
| + repositoryLabel); |
| if (section == null) { |
| section = settings.addNewSection(BugzillaUiPlugin.ATTACHMENT_WIZARD_SETTINGS_SECTION |
| + repositoryLabel); |
| } |
| return section; |
| } |
| |
| }; |
| model.addModelListener(new TaskDataModelListener() { |
| |
| @Override |
| public void attributeChanged(TaskDataModelEvent event) { |
| attachmentWizard.setChanged(true); |
| dialog.updateButtons(); |
| } |
| }); |
| |
| dialog.setBlockOnOpen(false); |
| dialog.create(); |
| dialog.open(); |
| } |
| } |
| } |
| |
| @SuppressWarnings("unchecked") |
| public void selectionChanged(IAction action, ISelection selection) { |
| this.currentSelection = selection; |
| IStructuredSelection sructuredSelection = null; |
| if (selection instanceof IStructuredSelection) { |
| sructuredSelection = (IStructuredSelection) currentSelection; |
| } |
| if (sructuredSelection == null || sructuredSelection.isEmpty()) { |
| return; |
| } |
| List<ITaskAttachment> attachmentList = sructuredSelection.toList(); |
| if (attachmentList != null && attachmentList.size() == 1) { |
| action.setEnabled(true); |
| } else { |
| action.setEnabled(false); |
| } |
| } |
| } |