package org.nightlabs.jfire.issuetracking.ui.issuelink.create;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.nightlabs.base.ui.wizard.DynamicPathWizard;
import org.nightlabs.jdo.ObjectID;
import org.nightlabs.jfire.issue.Issue;
import org.nightlabs.jfire.issue.IssueLinkType;
import org.nightlabs.jfire.issuetracking.ui.issue.IssueLinkTable;
import org.nightlabs.jfire.issuetracking.ui.issue.IssueLinkTableItem;
import org.nightlabs.jfire.issuetracking.ui.issuelink.IssueLinkAdder;
import org.nightlabs.jfire.issuetracking.ui.issuelink.IssueLinkHandlerFactory;
import org.nightlabs.jfire.issuetracking.ui.resource.Messages;
/**
* @author Chairat Kongarayawetchakun <!-- chairat [AT] nightlabs [DOT] de -->
*
*/
public class CreateIssueLinkWizard
extends DynamicPathWizard
{
private Issue issue;
private IssueLinkTable issueLinkTable;
private IssueLinkAdder issueLinkAdder;
private SelectIssueLinkHandlerFactoryWizardPage selectIssueLinkHandlerFactoryPage;
private SelectLinkedObjectWizardPage selectLinkedObjectPage;
private SelectIssueLinkTypeWizardPage selectIssueLinkTypePage;
private IssueLinkHandlerFactory<ObjectID, Object> lastSelectedIssueLinkHandlerFactory;
public CreateIssueLinkWizard(IssueLinkTable issueLinkTable, Issue issue) {
this.issueLinkTable = issueLinkTable;
this.issue = issue;
setWindowTitle(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.create.CreateIssueLinkWizard.title")); //$NON-NLS-1$
}
@Override
public void addPages() {
selectIssueLinkHandlerFactoryPage = new SelectIssueLinkHandlerFactoryWizardPage();
addPage(selectIssueLinkHandlerFactoryPage);
selectLinkedObjectPage = new SelectLinkedObjectWizardPage();
addPage(selectLinkedObjectPage);
selectIssueLinkTypePage = new SelectIssueLinkTypeWizardPage();
addPage(selectIssueLinkTypePage);
selectIssueLinkHandlerFactoryPage.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IssueLinkHandlerFactory<ObjectID, Object> issueLinkHandlerFactory = selectIssueLinkHandlerFactoryPage.getLinkHandlerFactoryTreeComposite().getIssueLinkHandlerFactory();
if (issueLinkHandlerFactory == lastSelectedIssueLinkHandlerFactory) {
return;
}
if (issueLinkHandlerFactory == null)
issueLinkAdder = null;
else
issueLinkAdder = issueLinkHandlerFactory.createIssueLinkAdder(issue);
lastSelectedIssueLinkHandlerFactory = issueLinkHandlerFactory;
selectLinkedObjectPage.setIssueLinkAdder(issueLinkAdder);
selectIssueLinkTypePage.setIssueLinkAdder(issueLinkAdder);
}
});
}
/**
* This method is used for adding issueLink to IssueLinkAdderComposite.
*/
@Override
public boolean performFinish() {
IssueLinkType issueLinkType = selectIssueLinkTypePage.getSelectedIssueLinkType();
Set<ObjectID> linkedObjectIDs = selectLinkedObjectPage.getLinkedObjectIDs();
Set<IssueLinkTableItem> issueLinkTableItems = new HashSet<IssueLinkTableItem>();
Set<IssueLinkTableItem> duplicatedItems = new HashSet<IssueLinkTableItem>();
for (ObjectID linkedObjectID : linkedObjectIDs) {
IssueLinkTableItem linkedTableItem = new IssueLinkTableItem(linkedObjectID, issueLinkType);
issueLinkTableItems.add(linkedTableItem);
boolean isExist = issueLinkTable.getIssueLinkTableItems().contains(linkedTableItem);
if (isExist) {
duplicatedItems.add(linkedTableItem);
}
}
if (duplicatedItems.size() != 0) {
StringBuffer errorMsg = new StringBuffer();
for (IssueLinkTableItem dItem : duplicatedItems) {
errorMsg.append(dItem.getLinkedObjectID().toString() + " with IssueLinkType=" + dItem.getIssueLinkType().getName().getText() + "\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
MessageDialog.openError(getShell(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.create.CreateIssueLinkWizard.dialog.error.linkExisted.text"), errorMsg.toString()); //$NON-NLS-1$
return false;
}
issueLinkTable.addIssueLinkTableItems(issueLinkTableItems);
return true;
}
public Issue getIssue() {
return issue;
}
public IssueLinkTable getIssueLinkTable() {
return issueLinkTable;
}
}