package org.nightlabs.jfire.issuetracking.trade.ui.issuelink; import java.util.Collection; import javax.jdo.FetchPlan; import javax.jdo.JDOHelper; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.ui.IWorkbenchPart; import org.nightlabs.base.ui.action.WorkbenchPartAction; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.resource.SharedImages; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jdo.ObjectIDUtil; import org.nightlabs.jfire.issue.Issue; import org.nightlabs.jfire.issue.IssueLink; import org.nightlabs.jfire.issue.dao.IssueDAO; import org.nightlabs.jfire.issue.id.IssueID; import org.nightlabs.jfire.issuetracking.trade.ui.resource.Messages; import org.nightlabs.jfire.issuetracking.ui.issue.IssueTable; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.progress.SubProgressMonitor; /** * This provides the general unified Action to remove selected {@link Issue}(s) that are linked to * the arbitrary object, listed in the {@link IssueTable}. * * @author Khaireel Mohamed - khaireel at nightlabs dot de */ public class IssueLinkActionRemove extends WorkbenchPartAction { //Action { // This is intended to replace the private classes defined in the following classes: // (i) ShowLinkedIssueSection; <-- Action button; top right menu-bar. // (ii) ShowLinkedIssuePage; <-- Context-menu, right-click on the IssueTable. // // And a similar situation is also adopted in the Issue-to-Person link. // Important references. private IssueTable issueTable; private ShowLinkedIssuePageController controller; // <-- Currently, I leave it specifically to this ShowLinkedIssuePageController; it has // all the necessary FETCH_GROUPS and specific methods to handle the link relations // between Issues, the related IssueLinks, and the arbitrary object (in this case, // this refers to the ArticleContainer). /** * Creates a new instance of the IssueLinkActionRemove. */ public IssueLinkActionRemove(IssueTable issueTable, ShowLinkedIssuePageController controller, IWorkbenchPart activePart) { super(activePart); setId(IssueLinkActionRemove.class.getName()); setImageDescriptor(SharedImages.DELETE_16x16); setToolTipText(Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.IssueLinkActionRemove.tooltip")); //$NON-NLS-1$ setText(Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.IssueLinkActionRemove.text")); //$NON-NLS-1$ this.issueTable = issueTable; this.controller = controller; } @Override public void run() { // Pick out those Issues selected from the IssueTable. Collection<Issue> selectedIssues = issueTable.getSelectedElements(); if (selectedIssues == null || selectedIssues.isEmpty()) return; // Scroll through every single selected Issue, and ask for delete-confirmation. for (Issue selectedIssue : selectedIssues) { boolean result = MessageDialog.openConfirm( getActivePart().getSite().getShell(), Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssueSection.dialog.removeIssueLink.title"), //$NON-NLS-1$ Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssueSection.dialog.removeIssueLink.message") //$NON-NLS-1$ + "(ID:" + ObjectIDUtil.longObjectIDFieldToString(selectedIssue.getIssueID()) + ") " //$NON-NLS-1$ //$NON-NLS-2$ + "\"" + selectedIssue.getSubject().getText() + "\"?"); //$NON-NLS-1$ //$NON-NLS-2$ if (result) { // Setup the pre-delete sequence. // Look for that related IssueLink to be deleted. final Issue issue = selectedIssue; final IssueLink issueLink = controller.removeRelatedIssueLink(selectedIssue); Job job = new Job(Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssueSection.job.removeIssueLink")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) { try { Issue _issue = IssueDAO.sharedInstance().getIssue( (IssueID)JDOHelper.getObjectId(issue), new String[] {FetchPlan.DEFAULT, Issue.FETCH_GROUP_ISSUE_LINKS}, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new SubProgressMonitor(monitor, 50)); _issue.removeIssueLink(issueLink); IssueDAO.sharedInstance().storeIssue( _issue, false, new String[] {FetchPlan.DEFAULT, Issue.FETCH_GROUP_ISSUE_LINKS}, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new SubProgressMonitor(monitor, 50)); return Status.OK_STATUS; } finally { monitor.done(); } } }; job.setPriority(Job.SHORT); job.schedule(); } } } @Override public boolean calculateEnabled() { // TODO Auto-generated method stub return false; } @Override public boolean calculateVisible() { // TODO Auto-generated method stub return false; } }