package org.nightlabs.jfire.issuetracking.ui.issuelink.attach; import javax.jdo.JDOHelper; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutDataMode; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.resource.SharedImages; import org.nightlabs.base.ui.wizard.WizardHop; import org.nightlabs.base.ui.wizard.WizardHopPage; import org.nightlabs.jdo.ObjectID; import org.nightlabs.jfire.idgenerator.IDGenerator; import org.nightlabs.jfire.issue.Issue; import org.nightlabs.jfire.issue.IssueLinkType; import org.nightlabs.jfire.issuetracking.ui.IssueTrackingPlugin; import org.nightlabs.jfire.issuetracking.ui.issue.IssueSearchComposite; import org.nightlabs.jfire.issuetracking.ui.issue.IssueTable; import org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage; import org.nightlabs.jfire.issuetracking.ui.resource.Messages; /** * @author Chairat Kongarayawetchakun <!-- chairat [AT] nightlabs [DOT] de --> */ public class SelectAttachedIssueWizardPage extends WizardHopPage { //Issue private Button createNewIssueRadio; private Button selectExistingIssueRadio; // private Composite issueEntryListViewerComposite; // private IssueEntryListViewer issueEntryListViewer; //Used Objects private Issue selectedIssue; private Object attachedObject; public static enum ActionForIssue { createNewIssue, selectExistingIssue } private ActionForIssue actionForIssue; public ActionForIssue getIssueAction() { return actionForIssue; } public void setIssueAction(ActionForIssue actionForIssue) { this.actionForIssue = actionForIssue; createNewIssueRadio.setSelection(false); selectExistingIssueRadio.setSelection(false); switch (actionForIssue) { case createNewIssue: createNewIssueRadio.setSelection(true); if (newIssue == null) { newIssue = new Issue(IDGenerator.getOrganisationID(), IDGenerator.nextID(Issue.class)); newIssue.createIssueLink(issueLinkType, (ObjectID)JDOHelper.getObjectId(attachedObject), attachedObject.getClass()); } if (createIssueGeneralWizardPage == null){ createIssueGeneralWizardPage = new CreateIssueDetailWizardPage(newIssue); new WizardHop(this); getWizardHop().addHopPage(createIssueGeneralWizardPage); } break; case selectExistingIssue: selectExistingIssueRadio.setSelection(true); if (createIssueGeneralWizardPage != null){ getWizardHop().removeHopPage(createIssueGeneralWizardPage); createIssueGeneralWizardPage = null; } break; default: throw new IllegalStateException("Unknown actionForIssue: " + actionForIssue); //$NON-NLS-1$ } getContainer().updateButtons(); } public SelectAttachedIssueWizardPage(Object attachedObject) { super(SelectAttachedIssueWizardPage.class.getName(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.attach.SelectIssueWizardPage.titleDefault"), SharedImages.getWizardPageImageDescriptor(IssueTrackingPlugin.getDefault(), SelectAttachedIssueWizardPage.class)); //$NON-NLS-1$ this.attachedObject = attachedObject; setTitle(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.attach.SelectIssueWizardPage.title")); //$NON-NLS-1$ String objectNameString = attachedObject.getClass().getSimpleName(); setDescription(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.attach.SelectIssueWizardPage.description") + objectNameString); //$NON-NLS-1$ } private IssueSearchComposite issueSearchComposite; @Override public Control createPageContents(Composite parent) { XComposite mainComposite = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER, LayoutDataMode.GRID_DATA); mainComposite.getGridLayout().numColumns = 1; //Issue createNewIssueRadio = new Button(mainComposite, SWT.RADIO); createNewIssueRadio.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.attach.SelectIssueWizardPage.radio.createNewIssue.text")); //$NON-NLS-1$ createNewIssueRadio.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createNewIssueRadio.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setIssueAction(ActionForIssue.createNewIssue); } }); selectExistingIssueRadio = new Button(mainComposite, SWT.RADIO); selectExistingIssueRadio.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.attach.SelectIssueWizardPage.radio.selectExistingIssue.text")); //$NON-NLS-1$ selectExistingIssueRadio.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); selectExistingIssueRadio.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setIssueAction(ActionForIssue.selectExistingIssue); } }); issueSearchComposite = new IssueSearchComposite(mainComposite, SWT.NONE); GridData gridData = new GridData(GridData.FILL_BOTH); issueSearchComposite.setLayoutData(gridData); final IssueTable resultTable = issueSearchComposite.getIssueEntryListViewer().getResultTable(); resultTable.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent evt) { // Do nothing!!! // --> Or maybe we can already react for 'Finish' on the double-click (which will standardise with the rest)? Kai. issueDoubleClick(); } }); resultTable.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent e) { selectedIssue = resultTable.getFirstSelectedElement(); setIssueAction(ActionForIssue.selectExistingIssue); getContainer().updateButtons(); } }); resultTable.setIsTableInWizard(true); return mainComposite; } @Override public boolean isPageComplete() { if (createNewIssueRadio == null) // check if UI is already created return false; if (actionForIssue != null) switch (actionForIssue) { case createNewIssue: return true; case selectExistingIssue: return selectedIssue != null; default: throw new IllegalStateException("Unknown actionForIssueLinkType: " + actionForIssue); //$NON-NLS-1$ } else return false; } /** * React on the double-click event on the selected Issue from the table, */ protected void issueDoubleClick() { if (getContainer() instanceof WizardDialog) { if (isPageComplete() && getWizard().performFinish()) { ((WizardDialog) getContainer()).close(); } } } // @Override // public void onFinish() { // selectedIssue.createIssueLink(issueLinkType, linkedObject) // } private Issue newIssue; private CreateIssueDetailWizardPage createIssueGeneralWizardPage; @Override public boolean canFlipToNextPage() { return actionForIssue == ActionForIssue.createNewIssue; } public Issue getIssue() { switch (actionForIssue) { case createNewIssue: return newIssue; case selectExistingIssue: return selectedIssue; } return null; } private IssueLinkType issueLinkType; public void setIssueLinkType(IssueLinkType issueLinkType) { this.issueLinkType = issueLinkType; } }