package org.nightlabs.jfire.issuetracking.ui.issuelink.create;
import java.util.Collection;
import javax.jdo.FetchPlan;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.nightlabs.base.ui.composite.ListComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.wizard.DynamicPathWizardPage;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.issue.IssueLinkType;
import org.nightlabs.jfire.issue.dao.IssueLinkTypeDAO;
import org.nightlabs.jfire.issuetracking.ui.issuelink.IssueLinkAdder;
import org.nightlabs.jfire.issuetracking.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
/**
* @author Chairat Kongarayawetchakun <!-- chairat [AT] nightlabs [DOT] de -->
*
*/
public class SelectIssueLinkTypeWizardPage
extends DynamicPathWizardPage
{
private ListComposite<IssueLinkType> issueLinkTypeList;
private IssueLinkType selectedIssueLinkType;
public SelectIssueLinkTypeWizardPage() {
super(SelectIssueLinkTypeWizardPage.class.getName(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.create.SelectIssueLinkTypeWizardPage.title")); //$NON-NLS-1$
setDescription(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.create.SelectIssueLinkTypeWizardPage.description")); //$NON-NLS-1$
}
public void setIssueLinkAdder(final IssueLinkAdder issueLinkAdder) {
if (issueLinkAdder != null) {
Job job = new Job(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.create.SelectIssueLinkTypeWizardPage.job.loadingIssueLinkTypes.text")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor) throws Exception {
final Collection<IssueLinkType> issueLinkTypes = IssueLinkTypeDAO.sharedInstance().getIssueLinkTypes(
issueLinkAdder.getIssueLinkHandlerFactory().getLinkedObjectClass(),
new String[] {IssueLinkType.FETCH_GROUP_NAME, FetchPlan.DEFAULT},
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
monitor);
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
selectedIssueLinkType = null;
issueLinkTypeList.removeAll();
issueLinkTypeList.addElements(issueLinkTypes);
// if (!issueLinkTypes.isEmpty()) {
if (issueLinkTypes.size() == 1) { // Only auto-select, if there's exactly one - otherwise the user must choose.
issueLinkTypeList.selectElementByIndex(0);
selectedIssueLinkType = issueLinkTypeList.getSelectedElement();
}
getContainer().updateButtons();
}
});
return Status.OK_STATUS;
}
};
job.setPriority(Job.SHORT);
job.schedule();
}
}
@Override
public Control createPageContents(Composite parent) {
XComposite mainComposite = new XComposite(parent, SWT.NONE);
mainComposite.getGridLayout().numColumns = 1;
Group manageRelationGroup = new Group(mainComposite, SWT.NONE);
manageRelationGroup.setLayout(new GridLayout(1, false));
manageRelationGroup.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.create.SelectIssueLinkTypeWizardPage.group.predefinedRelation.text")); //$NON-NLS-1$
manageRelationGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
XComposite manageComposite = new XComposite(manageRelationGroup, SWT.NONE);
manageComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
manageComposite.getGridLayout().numColumns = 1;
issueLinkTypeList = new ListComposite<IssueLinkType>(manageComposite, SWT.SINGLE);
issueLinkTypeList.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
return ((IssueLinkType)element).getName().getText();
}
});
GridData gridData = new GridData(GridData.FILL_BOTH);
issueLinkTypeList.setLayoutData(gridData);
issueLinkTypeList.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
selectedIssueLinkType = issueLinkTypeList.getSelectedElement();
getContainer().updateButtons();
}
});
return mainComposite;
}
@Override
public boolean isPageComplete() {
return selectedIssueLinkType != null;
}
public IssueLinkType getSelectedIssueLinkType() {
return selectedIssueLinkType;
}
}