blob: 5c38b9bd6a81545c6fb6231146dc0b0e39cf7c57 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.mylyn.commons.workbench.editors.CommonTextSupport;
import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
import org.eclipse.mylyn.internal.tasks.core.LocalTask;
import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author Steffen Pingel
*/
public class SummaryPart extends AbstractLocalEditorPart {
private Composite headerComposite;
private CommonTextSupport textSupport;
private RichTextEditor summaryEditor;
private Button statusCompleteButton;
private Button statusIncompleteButton;
private Text creationDateText;
private Text completionDateText;
private PriorityEditor priorityEditor;
private boolean initialized;
public SummaryPart() {
super(Messages.SummaryPart_Section_Title);
}
private Label createLabel(Composite composite, FormToolkit toolkit, String label, int indent) {
Label labelControl = toolkit.createLabel(composite, label);
labelControl.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
GridDataFactory.defaultsFor(labelControl).indent(indent, 0).applyTo(labelControl);
return labelControl;
}
private void createSummaryControl(Composite composite, final FormToolkit toolkit) {
Composite borderComposite = EditorUtil.createBorder(composite, toolkit);
GridDataFactory.fillDefaults()
.align(SWT.FILL, SWT.CENTER)
.hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT)
.grab(true, false)
.applyTo(borderComposite);
summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE, null, null, getTask());
summaryEditor.setSpellCheckingEnabled(true);
summaryEditor.setReadOnly(!isSummaryEditable());
summaryEditor.createControl(borderComposite, toolkit);
if (textSupport != null) {
textSupport.install(summaryEditor.getViewer(), true);
}
summaryEditor.getViewer().addTextListener(new ITextListener() {
public void textChanged(TextEvent event) {
if (!getTask().getSummary().equals(summaryEditor.getText())) {
markDirty(summaryEditor.getControl());
}
}
});
summaryEditor.getViewer().getControl().setMenu(composite.getMenu());
EditorUtil.setHeaderFontSizeAndStyle(summaryEditor.getControl());
}
@Override
public Control createControl(Composite parent, FormToolkit toolkit) {
Composite composite = toolkit.createComposite(parent);
GridLayout layout = EditorUtil.createSectionClientLayout();
layout.numColumns = 2;
layout.marginTop = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 3;
composite.setLayout(layout);
priorityEditor = new PriorityEditor() {
@Override
protected void valueChanged(String value) {
priorityEditor.select(value, PriorityLevel.fromString(value));
priorityEditor.setToolTipText(value);
markDirty(priorityEditor.getControl());
};
};
Map<String, String> labelByValue = new LinkedHashMap<String, String>();
for (PriorityLevel level : PriorityLevel.values()) {
labelByValue.put(level.toString(), level.getDescription());
}
priorityEditor.setLabelByValue(labelByValue);
priorityEditor.createControl(composite, toolkit);
GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).span(1, 2).applyTo(priorityEditor.getControl());
createSummaryControl(composite, toolkit);
createHeaderControls(composite, toolkit);
GridDataFactory.fillDefaults().grab(true, false).applyTo(headerComposite);
toolkit.paintBordersFor(composite);
return composite;
}
protected Composite createHeaderControls(Composite composite, FormToolkit toolkit) {
headerComposite = toolkit.createComposite(composite);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
headerComposite.setLayout(layout);
createLabel(headerComposite, toolkit, Messages.TaskPlanningEditor_Status, 0);
statusIncompleteButton = toolkit.createButton(headerComposite, Messages.TaskPlanningEditor_Incomplete,
SWT.RADIO);
statusIncompleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (statusIncompleteButton.getSelection()) {
statusCompleteButton.setSelection(false);
markDirty(statusCompleteButton);
}
}
});
statusCompleteButton = toolkit.createButton(headerComposite, Messages.TaskPlanningEditor_Complete, SWT.RADIO);
statusCompleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (statusCompleteButton.getSelection()) {
statusIncompleteButton.setSelection(false);
markDirty(statusCompleteButton);
}
}
});
// right align controls
// Composite spacer = toolkit.createComposite(headerComposite, SWT.NONE);
// GridDataFactory.fillDefaults().hint(0, 10).grab(true, false).applyTo(spacer);
createLabel(headerComposite, toolkit, getCreatedDateLabel(), EditorUtil.HEADER_COLUMN_MARGIN);
// do not use toolkit.createText() to avoid border on Windows
creationDateText = new Text(headerComposite, SWT.FLAT | SWT.READ_ONLY);
toolkit.adapt(creationDateText, false, false);
creationDateText.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
createLabel(headerComposite, toolkit, Messages.TaskPlanningEditor_Completed, EditorUtil.HEADER_COLUMN_MARGIN);
// do not use toolkit.createText() to avoid border on Windows
completionDateText = new Text(headerComposite, SWT.FLAT | SWT.READ_ONLY);
toolkit.adapt(completionDateText, false, false);
completionDateText.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
// ensure layout does not wrap
layout.numColumns = headerComposite.getChildren().length;
toolkit.paintBordersFor(headerComposite);
return headerComposite;
}
@Override
public void setFocus() {
if (summaryEditor != null) {
summaryEditor.getControl().setFocus();
}
}
private String getDateString(Date date) {
if (date == null) {
return "-"; //$NON-NLS-1$
}
return EditorUtil.getDateFormat().format(date);
}
private String getDateTimeString(Date date) {
if (date == null) {
return "-"; //$NON-NLS-1$
}
return EditorUtil.getDateTimeFormat().format(date);
}
@Override
public void refresh(boolean discardChanges) {
if (shouldRefresh(priorityEditor.getControl(), discardChanges)) {
PriorityLevel level = PriorityLevel.fromString(getTask().getPriority());
priorityEditor.select(level.toString(), level);
}
if (shouldRefresh(statusCompleteButton, discardChanges)) {
statusIncompleteButton.setSelection(!getTask().isCompleted());
statusCompleteButton.setSelection(getTask().isCompleted());
}
if (shouldRefresh(summaryEditor.getControl(), discardChanges)) {
summaryEditor.setText(getTask().getSummary());
if (!initialized) {
initialized = true;
if (LocalRepositoryConnector.DEFAULT_SUMMARY.equals(getTask().getSummary())) {
summaryEditor.getViewer().setSelectedRange(0, summaryEditor.getText().length());
}
}
}
creationDateText.setText(getDateString(getTask().getCreationDate()));
updateToolTip(creationDateText, getTask().getCreationDate());
completionDateText.setText(getDateString(getTask().getCompletionDate()));
updateToolTip(completionDateText, getTask().getCompletionDate());
// re-layout date fields
headerComposite.layout(true);
}
private void updateToolTip(Text text, Date date) {
if (date != null) {
text.setToolTipText(getDateTimeString(date));
} else {
text.setToolTipText(null);
}
}
@Override
public void commit(boolean onSave) {
PriorityLevel level = PriorityLevel.fromString(priorityEditor.getValue());
if (level != null) {
getTask().setPriority(level.toString());
}
clearState(priorityEditor.getControl());
getTask().setSummary(summaryEditor.getText());
clearState(summaryEditor.getControl());
if (statusCompleteButton.getSelection()) {
if (!getTask().isCompleted()) {
getTask().setCompletionDate(new Date());
}
} else {
if (getTask().isCompleted()) {
getTask().setCompletionDate(null);
}
}
clearState(statusCompleteButton);
super.commit(onSave);
}
public void setTextSupport(CommonTextSupport textSupport) {
this.textSupport = textSupport;
}
public CommonTextSupport getTextSupport() {
return textSupport;
}
public void setSummary(String value) {
if (!summaryEditor.getControl().isDisposed()) {
summaryEditor.setText(value);
}
}
protected String getCreatedDateLabel() {
return Messages.TaskPlanningEditor_Created;
}
protected boolean isSummaryEditable() {
return getTask() instanceof LocalTask;
}
}