Java tutorial
/******************************************************************************* * Copyright (c) 2004, 2008 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.tasks.ui.deprecated; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer; import org.eclipse.mylyn.internal.tasks.core.DateRange; import org.eclipse.mylyn.internal.tasks.core.ITaskList; import org.eclipse.mylyn.internal.tasks.core.TaskCategory; import org.eclipse.mylyn.internal.tasks.ui.ScheduleDatePicker; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode; import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView; import org.eclipse.mylyn.tasks.core.IRepositoryElement; import org.eclipse.mylyn.tasks.ui.TasksUiImages; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.VerifyKeyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Spinner; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.forms.widgets.Section; /** * @deprecated Do not use. This class is pending for removal: see bug 237552. */ @Deprecated public abstract class AbstractNewRepositoryTaskEditor extends AbstractRepositoryTaskEditor { private static final int DESCRIPTION_WIDTH = 79 * 7; // 500; private static final int DESCRIPTION_HEIGHT = 10 * 14; private static final int DEFAULT_FIELD_WIDTH = 150; private static final int DEFAULT_ESTIMATED_TIME = 1; private static final String LABEL_SUMBIT = "Submit"; private static final String ERROR_CREATING_BUG_REPORT = "Error creating bug report"; protected ScheduleDatePicker scheduledForDate; protected Spinner estimatedTime; @Deprecated protected String newSummary = ""; protected Button addToCategory; protected CCombo categoryChooser; /** * @author Raphael Ackermann (bug 195514) */ protected class TabVerifyKeyListener implements VerifyKeyListener { public void verifyKey(VerifyEvent event) { // if there is a tab key, do not "execute" it and instead select the Attributes section if (event.keyCode == SWT.TAB) { event.doit = false; focusAttributes(); } } } public AbstractNewRepositoryTaskEditor(FormEditor editor) { super(editor); } @Override public void init(IEditorSite site, IEditorInput input) { if (!(input instanceof NewTaskEditorInput)) { return; } initTaskEditor(site, (RepositoryTaskEditorInput) input); setTaskOutlineModel(RepositoryTaskOutlineNode.parseBugReport(taskData, false)); newSummary = taskData.getSummary(); } @Override protected void createDescriptionLayout(Composite composite) { FormToolkit toolkit = this.getManagedForm().getToolkit(); Section section = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR); section.setText(getSectionLabel(SECTION_NAME.DESCRIPTION_SECTION)); section.setExpanded(true); section.setLayout(new GridLayout()); section.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite descriptionComposite = toolkit.createComposite(section); GridLayout descriptionLayout = new GridLayout(); descriptionComposite.setLayout(descriptionLayout); GridData descriptionData = new GridData(GridData.FILL_BOTH); descriptionData.grabExcessVerticalSpace = true; descriptionComposite.setLayoutData(descriptionData); section.setClient(descriptionComposite); descriptionTextViewer = addTextEditor(repository, descriptionComposite, taskData.getDescription(), true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); descriptionTextViewer.setEditable(true); GridData gd = new GridData(GridData.FILL_BOTH); gd.widthHint = DESCRIPTION_WIDTH; gd.minimumHeight = DESCRIPTION_HEIGHT; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; descriptionTextViewer.getControl().setLayoutData(gd); descriptionTextViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); addDuplicateDetection(descriptionComposite); toolkit.paintBordersFor(descriptionComposite); } /** * @author Raphael Ackermann (modifications) (bug 195514) * @param composite */ @Override protected void createSummaryLayout(Composite composite) { addSummaryText(composite); if (summaryTextViewer != null) { summaryTextViewer.prependVerifyKeyListener(new TabVerifyKeyListener()); // TODO: Eliminate this and newSummary field when api can be changed summaryTextViewer.getTextWidget().addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String sel = summaryText.getText(); if (!(newSummary.equals(sel))) { newSummary = sel; } } }); } } @Override protected void createAttachmentLayout(Composite comp) { // currently can't attach while creating new bug } @Override protected void createCommentLayout(Composite comp) { // ignore } @Override protected void createNewCommentLayout(Composite comp) { createPlanningLayout(comp); } protected void createPlanningLayout(Composite comp) { Section section = createSection(comp, "Personal Planning"); section.setLayout(new GridLayout()); section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); section.setExpanded(true); Composite sectionClient = getManagedForm().getToolkit().createComposite(section); section.setClient(sectionClient); GridLayout layout = new GridLayout(); layout.numColumns = 7; layout.makeColumnsEqualWidth = false; sectionClient.setLayout(layout); GridData clientDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); sectionClient.setLayoutData(clientDataLayout); // Scheduled date getManagedForm().getToolkit().createLabel(sectionClient, "Scheduled for:"); // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); scheduledForDate = new ScheduleDatePicker(sectionClient, null, SWT.FLAT); scheduledForDate.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); scheduledForDate.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); // Calendar newTaskSchedule = TaskActivityUtil.getCalendar(); // int scheduledEndHour = TasksUiPlugin.getDefault().getPreferenceStore().getInt( // TasksUiPreferenceConstants.PLANNING_ENDHOUR); // If past scheduledEndHour set for following day // if (newTaskSchedule.get(Calendar.HOUR_OF_DAY) >= scheduledEndHour) { // TaskActivityUtil.snapForwardNumDays(newTaskSchedule, 1); // } else { // TaskActivityUtil.snapEndOfWorkDay(newTaskSchedule); // } // scheduledForDate.setDate(newTaskSchedule); // Button removeReminder = getManagedForm().getToolkit().createButton(sectionClient, "Clear", // SWT.PUSH | SWT.CENTER); // removeReminder.addSelectionListener(new SelectionAdapter() { // @Override // public void widgetSelected(SelectionEvent e) { // scheduledForDate.setDate(null); // } // }); ImageHyperlink clearReminder = getManagedForm().getToolkit().createImageHyperlink(sectionClient, SWT.NONE); clearReminder.setImage(CommonImages.getImage(CommonImages.REMOVE)); clearReminder.setToolTipText("Clear"); clearReminder.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { scheduledForDate.setScheduledDate(null); } }); // 1 Blank column after Reminder clear button Label dummy = getManagedForm().getToolkit().createLabel(sectionClient, ""); GridData dummyLabelDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_CENTER); dummyLabelDataLayout.horizontalSpan = 1; dummyLabelDataLayout.widthHint = 30; dummy.setLayoutData(dummyLabelDataLayout); // Estimated time getManagedForm().getToolkit().createLabel(sectionClient, "Estimated hours:"); // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); // estimatedTime = new Spinner(sectionClient, SWT.FLAT); estimatedTime = new Spinner(sectionClient, SWT.FLAT); estimatedTime.setDigits(0); estimatedTime.setMaximum(100); estimatedTime.setMinimum(0); estimatedTime.setIncrement(1); estimatedTime.setSelection(DEFAULT_ESTIMATED_TIME); estimatedTime.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); GridData estimatedDataLayout = new GridData(); estimatedDataLayout.widthHint = 30; estimatedTime.setLayoutData(estimatedDataLayout); // getManagedForm().getToolkit().createLabel(sectionClient, "hours "); // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE)); ImageHyperlink clearEstimated = getManagedForm().getToolkit().createImageHyperlink(sectionClient, SWT.NONE); clearEstimated.setImage(CommonImages.getImage(CommonImages.REMOVE)); clearEstimated.setToolTipText("Clear"); clearEstimated.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { estimatedTime.setSelection(0); } }); getManagedForm().getToolkit().paintBordersFor(sectionClient); } @Override protected void addRadioButtons(Composite buttonComposite) { // Since NewBugModels have no special submitting actions, // no radio buttons are required. } @Override protected void createCustomAttributeLayout(Composite composite) { // ignore } @Override protected void saveTaskOffline(IProgressMonitor progressMonitor) { taskData.setSummary(newSummary); taskData.setDescription(descriptionTextViewer.getTextWidget().getText()); updateEditorTitle(); } /** * A listener for selection of the summary textbox. */ protected class DescriptionListener implements Listener { public void handleEvent(Event event) { fireSelectionChanged(new SelectionChangedEvent(selectionProvider, new StructuredSelection(new RepositoryTaskSelection(taskData.getTaskId(), taskData.getRepositoryUrl(), taskData.getConnectorKind(), "New Description", false, taskData.getSummary())))); } } @Override protected void validateInput() { // ignore } @Override public boolean isDirty() { return true; } /** * @author Raphael Ackermann (bug 198526) */ @Override public void setFocus() { if (summaryText != null) { summaryText.setFocus(); } } @Override public boolean isSaveAsAllowed() { return false; } /** * Creates the button layout. This displays options and buttons at the bottom of the editor to allow actions to be * performed on the bug. */ @Override protected void createActionsLayout(Composite formComposite) { Section section = getManagedForm().getToolkit().createSection(formComposite, ExpandableComposite.TITLE_BAR); section.setText(getSectionLabel(SECTION_NAME.ACTIONS_SECTION)); section.setExpanded(true); section.setLayout(new GridLayout()); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).applyTo(section); Composite buttonComposite = getManagedForm().getToolkit().createComposite(section); buttonComposite.setLayout(new GridLayout(4, false)); buttonComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); section.setClient(buttonComposite); addToCategory = getManagedForm().getToolkit().createButton(buttonComposite, "Add to Category", SWT.CHECK); categoryChooser = new CCombo(buttonComposite, SWT.FLAT | SWT.READ_ONLY); categoryChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); categoryChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create()); getManagedForm().getToolkit().adapt(categoryChooser, true, true); categoryChooser.setFont(TEXT_FONT); ITaskList taskList = TasksUiInternal.getTaskList(); List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories()); Collections.sort(categories, new Comparator<AbstractTaskContainer>() { public int compare(AbstractTaskContainer c1, AbstractTaskContainer c2) { if (c1.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) { return -1; } else if (c2.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) { return 1; } else { return c1.getSummary().compareToIgnoreCase(c2.getSummary()); } } }); for (IRepositoryElement category : categories) { categoryChooser.add(category.getSummary()); } categoryChooser.select(0); categoryChooser.setEnabled(false); categoryChooser.setData(categories); addToCategory.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { categoryChooser.setEnabled(addToCategory.getSelection()); } }); GridDataFactory.fillDefaults().hint(DEFAULT_FIELD_WIDTH, SWT.DEFAULT).span(3, SWT.DEFAULT) .applyTo(categoryChooser); addActionButtons(buttonComposite); getManagedForm().getToolkit().paintBordersFor(buttonComposite); } /** * Returns the {@link AbstractTaskContainer category} the new task belongs to * * @return {@link AbstractTaskContainer category} where the new task must be added to, or null if it must not be * added to the task list */ @Override @SuppressWarnings("unchecked") protected AbstractTaskCategory getCategory() { int index = categoryChooser.getSelectionIndex(); if (addToCategory.getSelection() && index != -1) { return ((List<AbstractTaskCategory>) categoryChooser.getData()).get(index); } return null; } @Override protected void addActionButtons(Composite buttonComposite) { FormToolkit toolkit = new FormToolkit(buttonComposite.getDisplay()); submitButton = toolkit.createButton(buttonComposite, LABEL_SUMBIT, SWT.NONE); GridData submitButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); submitButtonData.widthHint = 100; submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT)); submitButton.setLayoutData(submitButtonData); submitButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { submitToRepository(); } }); submitButton.setToolTipText("Submit to " + this.repository.getRepositoryUrl()); } protected boolean prepareSubmit() { submitButton.setEnabled(false); showBusy(true); if (summaryText != null && summaryText.getText().trim().equals("")) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { MessageDialog.openInformation(AbstractNewRepositoryTaskEditor.this.getSite().getShell(), ERROR_CREATING_BUG_REPORT, "A summary must be provided with new bug reports."); summaryText.setFocus(); submitButton.setEnabled(true); showBusy(false); } }); return false; } if (descriptionTextViewer != null && descriptionTextViewer.getTextWidget().getText().trim().equals("")) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { MessageDialog.openInformation(AbstractNewRepositoryTaskEditor.this.getSite().getShell(), ERROR_CREATING_BUG_REPORT, "A summary must be provided with new reports."); descriptionTextViewer.getTextWidget().setFocus(); submitButton.setEnabled(true); showBusy(false); } }); return false; } return true; } @Override protected void createPeopleLayout(Composite composite) { // ignore, new editor doesn't have people section } @Override public AbstractTask updateSubmittedTask(String id, IProgressMonitor monitor) throws CoreException { final AbstractTask newTask = super.updateSubmittedTask(id, monitor); if (newTask != null) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { DateRange selectedDate = null; if (scheduledForDate != null) { selectedDate = scheduledForDate.getScheduledDate(); } if (selectedDate != null) { TasksUiPlugin.getTaskActivityManager().setScheduledFor(newTask, selectedDate); } if (estimatedTime != null) { newTask.setEstimatedTimeHours(estimatedTime.getSelection()); } Object selectedObject = null; if (TaskListView.getFromActivePerspective() != null) { selectedObject = ((IStructuredSelection) TaskListView.getFromActivePerspective().getViewer() .getSelection()).getFirstElement(); } if (selectedObject instanceof TaskCategory) { TasksUiInternal.getTaskList().addTask(newTask, ((TaskCategory) selectedObject)); } } }); } return newTask; } @Override public void doSave(IProgressMonitor monitor) { new MessageDialog(null, "Operation not supported", null, "Save of un-submitted new tasks is not currently supported.\nPlease submit all new tasks.", MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0).open(); monitor.setCanceled(true); return; } @Override public boolean searchForDuplicates() { // called so that the description text is set on taskData before we // search for duplicates this.saveTaskOffline(new NullProgressMonitor()); return super.searchForDuplicates(); } @Override protected boolean supportsRefreshAttributes() { // see bug 212475 return false; } }