package org.nightlabs.jfire.issuetracking.ui.issue.create; import java.util.List; 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.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.nightlabs.base.ui.composite.XComboComposite; 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.job.Job; import org.nightlabs.base.ui.language.I18nTextEditor; import org.nightlabs.base.ui.language.I18nTextEditorMultiLine; import org.nightlabs.base.ui.language.I18nTextEditor.EditMode; 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.NLJDOHelper; import org.nightlabs.jfire.issue.Issue; import org.nightlabs.jfire.issue.IssuePriority; import org.nightlabs.jfire.issue.IssueResolution; import org.nightlabs.jfire.issue.IssueSeverityType; import org.nightlabs.jfire.issue.IssueType; import org.nightlabs.jfire.issue.dao.IssueTypeDAO; import org.nightlabs.jfire.issue.project.Project; import org.nightlabs.jfire.issuetracking.ui.IssueTrackingPlugin; import org.nightlabs.jfire.issuetracking.ui.issue.IssueLabelProvider; import org.nightlabs.jfire.issuetracking.ui.issuemarker.IssueMarkerToggleButtonBar; import org.nightlabs.jfire.issuetracking.ui.project.ProjectComboComposite; import org.nightlabs.jfire.issuetracking.ui.resource.Messages; import org.nightlabs.progress.ProgressMonitor; /** * Displays the user-interface page to assist in creating a new {@link Issue}. * Default options for important fields should always be made available on this page. * * @author Chairat Kongarayawetchakun - chairat[at]nightlabs[dot]de * @author Khaireel Mohamed - khaireel at nightlabs dot de * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de */ public class CreateIssueDetailWizardPage extends WizardHopPage { private static final boolean VERTICAL_MARKERS = true; //GUI private IssueMarkerToggleButtonBar issueMarkerToggleButtonBar; private Label subjectLabel; private I18nTextEditor subjectText; private Label descriptionLabel; private I18nTextEditorMultiLine descriptionText; private Label issueTypeLbl; private XComboComposite<IssueType> issueTypeCombo; private Label issueSeverityLbl; private XComboComposite<IssueSeverityType> issueSeverityCombo; private Label issuePriorityLbl; private XComboComposite<IssuePriority> issuePriorityCombo; private ProjectComboComposite projectComboComposite; private IssueLabelProvider issueLabelProvider = new IssueLabelProvider(); //Used objects private List<IssueType> issueTypes; private IssueType selectedIssueType; private IssueSeverityType selectedIssueSeverityType; private IssuePriority selectedIssuePriority; private Project selectedProject; private Issue issue; private static final String[] ISSUE_TYPE_FETCH_GROUPS = { FetchPlan.DEFAULT, IssueType.FETCH_GROUP_NAME, IssueType.FETCH_GROUP_ISSUE_SEVERITY_TYPES, IssueType.FETCH_GROUP_ISSUE_PRIORITIES, IssueType.FETCH_GROUP_ISSUE_RESOLUTIONS, IssueSeverityType.FETCH_GROUP_NAME, IssuePriority.FETCH_GROUP_NAME }; public CreateIssueDetailWizardPage(Issue issue) { super(CreateIssueDetailWizardPage.class.getName(), Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.title"), SharedImages.getWizardPageImageDescriptor(IssueTrackingPlugin.getDefault(), CreateIssueWizard.class)); //$NON-NLS-1$ setDescription(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.description")); //$NON-NLS-1$ this.issue = issue; } @Override public Control createPageContents(Composite parent) { XComposite mainComposite = new XComposite(parent, SWT.NONE, LayoutMode.TOP_BOTTOM_WRAPPER, LayoutDataMode.GRID_DATA); mainComposite.getGridLayout().numColumns = 6; if (VERTICAL_MARKERS) mainComposite.getGridLayout().numColumns += 1; issueMarkerToggleButtonBar = new IssueMarkerToggleButtonBar(mainComposite, VERTICAL_MARKERS ? SWT.V_SCROLL : SWT.H_SCROLL); issueMarkerToggleButtonBar.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { issueMarkerToggleButtonBar.commitToIssue(issue); } }); if (VERTICAL_MARKERS) ((GridData)issueMarkerToggleButtonBar.getLayoutData()).verticalSpan = 5; else ((GridData)issueMarkerToggleButtonBar.getLayoutData()).horizontalSpan = mainComposite.getGridLayout().numColumns; new Label(mainComposite, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.label.project.text")); //$NON-NLS-1$ projectComboComposite = new ProjectComboComposite(mainComposite, SWT.NONE); GridData gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 5; projectComboComposite.setLayoutData(gridData); projectComboComposite.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent e) { selectedProject = projectComboComposite.getSelectedProject(); issue.setProject(selectedProject); getContainer().updateButtons(); } }); // Subject & Description subjectLabel = new Label(mainComposite, SWT.NONE); subjectLabel.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.label.subject.text")); //$NON-NLS-1$ subjectText = new I18nTextEditor(mainComposite); subjectText.setI18nText(issue.getSubject(), EditMode.DIRECT); subjectText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { getContainer().updateButtons(); if (subjectText.getEditText().equals("")) { //$NON-NLS-1$ setErrorMessage(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.errorMessage.subjectNotEmpty.text")); //$NON-NLS-1$ } } }); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 5; subjectText.setLayoutData(gridData); descriptionLabel = new Label(mainComposite, SWT.NONE); descriptionLabel.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.label.description.text")); //$NON-NLS-1$ descriptionText = new I18nTextEditorMultiLine(mainComposite, subjectText.getLanguageChooser()); descriptionText.setI18nText(issue.getDescription(), EditMode.DIRECT); descriptionText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { getContainer().updateButtons(); if (descriptionText.getEditText().equals("")) { //$NON-NLS-1$ setErrorMessage(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.errorMessage.descriptionNotEmpty.text")); //$NON-NLS-1$ } } }); gridData = new GridData(GridData.FILL_BOTH); gridData.minimumHeight = 100; gridData.horizontalSpan = 6; descriptionText.setLayoutData(gridData); // Properties issueTypeLbl = new Label(mainComposite, SWT.NONE); issueTypeLbl.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.label.issueType.text")); //$NON-NLS-1$ issueTypeCombo = new XComboComposite<IssueType>(mainComposite, SWT.NONE | SWT.READ_ONLY, issueLabelProvider); issueTypeCombo.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent e) { selectedIssueType = issueTypeCombo.getSelectedElement(); issue.setIssueType(selectedIssueType); issueSeverityCombo.removeAll(); for (IssueSeverityType is : selectedIssueType.getIssueSeverityTypes()) { issueSeverityCombo.addElement(is); } issueSeverityCombo.selectElementByIndex(0); selectedIssueSeverityType = issueSeverityCombo.getSelectedElement(); issuePriorityCombo.removeAll(); for (IssuePriority ip : selectedIssueType.getIssuePriorities()) { issuePriorityCombo.addElement(ip); } issuePriorityCombo.selectElementByIndex(0); selectedIssuePriority = issuePriorityCombo.getSelectedElement(); } }); issueSeverityLbl = new Label(mainComposite, SWT.NONE); issueSeverityLbl.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.label.severity.text")); //$NON-NLS-1$ issueSeverityCombo = new XComboComposite<IssueSeverityType>(mainComposite, SWT.NONE | SWT.READ_ONLY, issueLabelProvider); issueSeverityCombo.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent e) { selectedIssueSeverityType = issueSeverityCombo.getSelectedElement(); issue.setIssueSeverityType(selectedIssueSeverityType); } }); issuePriorityLbl = new Label(mainComposite, SWT.NONE); issuePriorityLbl.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.label.priority.text")); //$NON-NLS-1$ issuePriorityCombo = new XComboComposite<IssuePriority>(mainComposite, SWT.NONE | SWT.READ_ONLY, issueLabelProvider); issuePriorityCombo.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent e) { selectedIssuePriority = issuePriorityCombo.getSelectedElement(); issue.setIssuePriority(selectedIssuePriority); } }); XComposite dateTimeComposite = new XComposite(mainComposite, SWT.NONE); dateTimeComposite.getGridLayout().numColumns = 3; gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 6; dateTimeComposite.setLayoutData(gridData); // ---> Loading Data Job loadJob = new Job(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.create.CreateIssueDetailWizardPage.job.loadingIssueProp.text")) { //$NON-NLS-1$ @Override protected IStatus run(final ProgressMonitor monitor) throws Exception { issueTypes = IssueTypeDAO.sharedInstance().getAllIssueTypes(ISSUE_TYPE_FETCH_GROUPS, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); Display.getDefault().asyncExec(new Runnable() { public void run() { // IssueType issueTypeCombo.removeAll(); IssueType defaultIssueType = null; for (IssueType issueType : issueTypes) { if (issueType.getIssueTypeID().equals(IssueType.DEFAULT_ISSUE_TYPE_ID)) defaultIssueType = issueType; issueTypeCombo.addElement(issueType); } if (defaultIssueType != null) issueTypeCombo.selectElement(defaultIssueType); else issueTypeCombo.selectElementByIndex(0); selectedIssueType = issueTypeCombo.getSelectedElement(); issue.setIssueType(selectedIssueType); // IssueSeverity issueSeverityCombo.removeAll(); IssueSeverityType defaultIssueSeverityType = null; if (selectedIssueType != null) { for (IssueSeverityType is : selectedIssueType.getIssueSeverityTypes()) { if (is.getIssueSeverityTypeID().equals(Issue.DEFAULT_ISSUE_SEVERITY_TYPE_ID)) defaultIssueSeverityType = is; issueSeverityCombo.addElement(is); } if (defaultIssueSeverityType != null) issueSeverityCombo.selectElement(defaultIssueSeverityType); else issueSeverityCombo.selectElementByIndex(0); } selectedIssueSeverityType = issueSeverityCombo.getSelectedElement(); issue.setIssueSeverityType(selectedIssueSeverityType); // IssuePriority issuePriorityCombo.removeAll(); IssuePriority defaultIssuePriority = null; if (selectedIssueType != null) { for (IssuePriority ip : selectedIssueType.getIssuePriorities()) { if (ip.getIssuePriorityID().equals(Issue.DEFAULT_ISSUE_PRIORITY_ID)) defaultIssuePriority = ip; issuePriorityCombo.addElement(ip); } if (defaultIssueSeverityType != null) issuePriorityCombo.selectElement(defaultIssuePriority); else issuePriorityCombo.selectElementByIndex(0); } selectedIssuePriority = issuePriorityCombo.getSelectedElement(); issue.setIssuePriority(selectedIssuePriority); //IssueResolution if (selectedIssueType != null) { for (IssueResolution ir : selectedIssueType.getIssueResolutions()) { if (ir.getIssueResolutionID().equals(Issue.DEFAULT_ISSUE_RESOLUTION_ID)) issue.setIssueResolution(ir); } } } }); return Status.OK_STATUS; } }; loadJob.setPriority(org.eclipse.core.runtime.jobs.Job.SHORT); loadJob.schedule(); return mainComposite; } @Override public void onShow() { subjectText.forceFocus(); } @Override public boolean canFlipToNextPage() { return isPageComplete(); } private WizardHopPage optionalPage; @Override public boolean isPageComplete() { if (subjectText == null) return false; // If we didn't even create our UI yet, we're definitely not complete. boolean result = true; setErrorMessage(null); if (subjectText.getEditText().equals("") || subjectText.getI18nText().getText() == null) { //$NON-NLS-1$ result = false; } if (descriptionText.getEditText().equals("") || descriptionText.getI18nText().getText() == null) { //$NON-NLS-1$ result = false; } if (result == true && optionalPage == null) { new WizardHop(this); optionalPage = new CreateIssueOptionalWizardPage(issue); getWizardHop().addHopPage(optionalPage); } return result; } // public I18nTextEditorMultiLine getDescriptionText() { // return descriptionText; // } // // public I18nTextEditor getSubjectText() { // return subjectText; // } }