blob: 1f4614447391b17fe73303e8451bf24b7651832b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 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.editors;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
import org.eclipse.mylyn.internal.tasks.core.ITaskList;
import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
import org.eclipse.mylyn.internal.tasks.ui.util.AbstractRetrieveTitleFromUrlJob;
import org.eclipse.mylyn.internal.tasks.ui.util.TaskContainerComparator;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.IFormPart;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
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;
/**
* @author Steffen Pingel
*/
public class AttributePart extends AbstractLocalEditorPart {
private ImageHyperlink fetchUrlLink;
private RichTextEditor urlEditor;
private CCombo categoryChooser;
protected AbstractTaskCategory category;
private Label categoryLabel;
private List<AbstractTaskCategory> categories;
public AttributePart() {
super(Messages.TaskPlanningEditor_Attributes);
}
@Override
public void commit(boolean onSave) {
if (category != null) {
TasksUiPlugin.getTaskList().addTask(getTask(), category);
category = null;
clearState(categoryChooser);
}
getTask().setUrl(urlEditor.getText());
clearState(urlEditor.getControl());
super.commit(onSave);
}
@Override
public Control createControl(Composite parent, FormToolkit toolkit) {
int style = ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE;
// | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT;
if (getTask().getUrl() != null && getTask().getUrl().length() > 0) {
style |= ExpandableComposite.EXPANDED;
}
Section section = createSection(parent, toolkit, style);
GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
section.setText(Messages.TaskPlanningEditor_Attributes);
GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
createSectionClient(section, toolkit);
setSection(toolkit, section);
Composite composite = toolkit.createComposite(section);
GridLayout layout = EditorUtil.createSectionClientLayout();
layout.numColumns = 4;
composite.setLayout(layout);
Label label = toolkit.createLabel(composite, Messages.AttributePart_Category_);
label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
createCategoryChooser(composite, toolkit);
// url
label = toolkit.createLabel(composite, Messages.TaskPlanningEditor_URL);
label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
GridDataFactory.defaultsFor(label).indent(20, 0).applyTo(label);
Composite urlComposite = toolkit.createComposite(composite);
GridLayout urlLayout = new GridLayout(2, false);
urlLayout.verticalSpacing = 0;
urlLayout.marginWidth = 1;
urlComposite.setLayout(urlLayout);
GridDataFactory.fillDefaults()
.grab(true, false)
.hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT)
.applyTo(urlComposite);
urlEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.SINGLE, null, null, getTask()) {
@Override
protected void valueChanged(String value) {
updateButtons();
markDirty(urlEditor.getControl());
}
};
urlEditor.setMode(Mode.URL);
urlEditor.createControl(urlComposite, toolkit);
urlEditor.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
urlEditor.getViewer().getControl().setMenu(parent.getMenu());
GridDataFactory.fillDefaults().grab(true, false).applyTo(urlEditor.getControl());
fetchUrlLink = toolkit.createImageHyperlink(urlComposite, SWT.NONE);
fetchUrlLink.setImage(CommonImages.getImage(TasksUiImages.TASK_RETRIEVE));
fetchUrlLink.setToolTipText(Messages.TaskPlanningEditor_Retrieve_task_description_from_URL);
fetchUrlLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
featchUrl(urlEditor.getText());
}
});
toolkit.paintBordersFor(urlComposite);
toolkit.paintBordersFor(composite);
section.setClient(composite);
return section;
}
private void createSectionClient(final Section section, FormToolkit toolkit) {
if (section.getTextClient() == null) {
final Composite textClient = toolkit.createComposite(section);
textClient.setBackground(null);
RowLayout rowLayout = new RowLayout();
rowLayout.center = true;
rowLayout.marginLeft = 20;
rowLayout.marginTop = 1;
rowLayout.marginBottom = 1;
textClient.setLayout(rowLayout);
Label label = toolkit.createLabel(textClient, Messages.AttributePart_Category_);
label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
label.setBackground(null);
categoryLabel = toolkit.createLabel(textClient, ""); //$NON-NLS-1$
categoryLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
categoryLabel.setBackground(null);
toolkit.paintBordersFor(textClient);
section.setTextClient(textClient);
section.addExpansionListener(new ExpansionAdapter() {
@Override
public void expansionStateChanging(ExpansionEvent e) {
textClient.setVisible(!e.getState());
}
});
textClient.setVisible(!section.isExpanded());
}
}
/**
* Set the task summary to the page title from the specified url.
*/
private void featchUrl(final String url) {
AbstractRetrieveTitleFromUrlJob job = new AbstractRetrieveTitleFromUrlJob(urlEditor.getText()) {
@Override
protected void titleRetrieved(String pageTitle) {
IFormPart[] parts = getManagedForm().getParts();
for (IFormPart part : parts) {
if (part instanceof SummaryPart) {
((SummaryPart) part).setSummary(pageTitle);
}
}
}
};
job.schedule();
}
private void updateButtons() {
String value = urlEditor.getText();
fetchUrlLink.setEnabled(value.startsWith("http://") || value.startsWith("https://")); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public void refresh(boolean discardChanges) {
if (shouldRefresh(categoryChooser, discardChanges)) {
ITaskList taskList = TasksUiInternal.getTaskList();
categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories());
Collections.sort(categories, new TaskContainerComparator());
AbstractTaskCategory selectedCategory = category;
if (selectedCategory == null) {
selectedCategory = TaskCategory.getParentTaskCategory(getTask());
}
categoryChooser.removeAll();
int selectedIndex = 0;
for (int i = 0; i < categories.size(); i++) {
AbstractTaskCategory category = categories.get(i);
categoryChooser.add(category.getSummary());
if (category.equals(selectedCategory)) {
selectedIndex = i;
}
}
categoryChooser.select(selectedIndex);
updateCategoryLabel();
}
if (shouldRefresh(urlEditor.getControl(), discardChanges)) {
String url = getTask().getUrl();
urlEditor.setText(url != null ? url : ""); //$NON-NLS-1$
}
updateButtons();
}
private void updateCategoryLabel() {
if (category == null) {
AbstractTaskCategory parentTaskCategory = TaskCategory.getParentTaskCategory(getTask());
categoryLabel.setText((parentTaskCategory != null) ? parentTaskCategory.getSummary() : ""); //$NON-NLS-1$
} else {
categoryLabel.setText(category.getSummary());
}
if (!getSection().isExpanded()) {
getSection().layout(true, true);
}
}
private void createCategoryChooser(Composite buttonComposite, FormToolkit toolkit) {
categoryChooser = new CCombo(buttonComposite, SWT.FLAT | SWT.READ_ONLY);
categoryChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
toolkit.adapt(categoryChooser, false, false);
categoryChooser.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if (categoryChooser.getSelectionIndex() != -1) {
category = categories.get(categoryChooser.getSelectionIndex());
updateCategoryLabel();
markDirty(categoryChooser);
}
}
});
}
}