/*******************************************************************************
* Copyright (c) 2011 GitHub Inc.
* 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:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.github.ui.issue;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.commons.workbench.forms.CommonFormUtil;
import org.eclipse.mylyn.internal.github.core.issue.IssueAttribute;
import org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorSection;
import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
import org.eclipse.mylyn.internal.tasks.ui.editors.Messages;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
import org.eclipse.mylyn.tasks.core.sync.TaskJob;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* GitHub issue task editor attribute part that display labels and milestone
* attribute editors.
*/
public class IssueAttributePart extends AbstractTaskEditorSection {
private List<AbstractAttributeEditor> attributeEditors;
private boolean hasIncoming;
private Composite attributesComposite;
public IssueAttributePart() {
setPartName(Messages.TaskEditorAttributePart_Attributes);
}
@Override
protected AbstractAttributeEditor createAttributeEditor(
TaskAttribute attribute) {
if (IssueAttribute.LABELS.getMetadata().getId()
.equals(attribute.getId()))
return new IssueLabelAttributeEditor(getModel(), attribute);
if (IssueAttribute.MILESTONE.getMetadata().getId()
.equals(attribute.getId()))
return super.createAttributeEditor(attribute);
return null;
}
private void createAttributeControls(Composite attributesComposite,
FormToolkit toolkit, int columnCount) {
for (AbstractAttributeEditor attributeEditor : attributeEditors) {
if (attributeEditor.hasLabel())
attributeEditor
.createLabelControl(attributesComposite, toolkit);
attributeEditor.createControl(attributesComposite, toolkit);
Object data = attributeEditor.getControl().getLayoutData();
if (data == null) {
data = GridDataFactory.swtDefaults().create();
attributeEditor.getControl().setLayoutData(data);
}
if (data instanceof GridData)
((GridData) data).widthHint = 140;
getTaskEditorPage().getAttributeEditorToolkit().adapt(
attributeEditor);
}
}
@Override
public void createControl(Composite parent, final FormToolkit toolkit) {
initialize();
super.createControl(parent, toolkit);
}
@Override
protected String getInfoOverlayText() {
return null;
}
@Override
protected boolean shouldExpandOnCreate() {
return getTaskData().isNew() || hasIncoming;
}
@Override
protected Control createContent(FormToolkit toolkit, Composite parent) {
attributesComposite = toolkit.createComposite(parent);
attributesComposite.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Control focus = event.display.getFocusControl();
if (focus instanceof Text
&& ((Text) focus).getEditable() == false)
getManagedForm().getForm().setFocus();
}
});
GridLayout attributesLayout = EditorUtil.createSectionClientLayout();
attributesLayout.numColumns = 2;
attributesLayout.horizontalSpacing = 7;
attributesLayout.verticalSpacing = 6;
attributesComposite.setLayout(attributesLayout);
GridData attributesData = new GridData(GridData.FILL_BOTH);
attributesData.horizontalSpan = 1;
attributesData.grabExcessVerticalSpace = false;
attributesComposite.setLayoutData(attributesData);
createAttributeControls(attributesComposite, toolkit,
attributesLayout.numColumns);
toolkit.paintBordersFor(attributesComposite);
return attributesComposite;
}
@Override
protected void fillToolBar(ToolBarManager toolBar) {
UpdateRepositoryConfigurationAction repositoryConfigRefresh = new UpdateRepositoryConfigurationAction() {
@Override
public void run() {
getTaskEditorPage().showEditorBusy(true);
final TaskJob job = TasksUiInternal.getJobFactory()
.createUpdateRepositoryConfigurationJob(
getTaskEditorPage().getConnector(),
getTaskEditorPage().getTaskRepository(),
getTaskEditorPage().getTask());
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
PlatformUI.getWorkbench().getDisplay()
.asyncExec(new Runnable() {
public void run() {
getTaskEditorPage().showEditorBusy(
false);
if (job.getStatus() != null) {
getTaskEditorPage()
.getTaskEditor()
.setStatus(
Messages.TaskEditorAttributePart_Updating_of_repository_configuration_failed,
Messages.TaskEditorAttributePart_Update_Failed,
job.getStatus());
} else {
getTaskEditorPage().refresh();
}
}
});
}
});
job.setUser(true);
job.setProperty(WorkbenchUtil.SHOW_IN_TASKBAR_ICON_PROPERTY,
Boolean.TRUE);
job.setPriority(Job.INTERACTIVE);
job.schedule();
};
};
repositoryConfigRefresh
.setImageDescriptor(TasksUiImages.REPOSITORY_SYNCHRONIZE_SMALL);
repositoryConfigRefresh.selectionChanged(new StructuredSelection(
getTaskEditorPage().getTaskRepository()));
repositoryConfigRefresh
.setToolTipText(Messages.TaskEditorAttributePart_Refresh_Attributes);
toolBar.add(repositoryConfigRefresh);
}
private void initialize() {
attributeEditors = new ArrayList<AbstractAttributeEditor>();
hasIncoming = false;
TaskAttribute root = getTaskData().getRoot();
List<TaskAttribute> attributes = new LinkedList<TaskAttribute>();
TaskAttribute milestones = root.getAttribute(IssueAttribute.MILESTONE
.getMetadata().getId());
if (milestones != null)
attributes.add(milestones);
TaskAttribute labels = root.getAttribute(IssueAttribute.LABELS
.getMetadata().getId());
if (labels != null)
attributes.add(labels);
for (TaskAttribute attribute : attributes) {
AbstractAttributeEditor attributeEditor = createAttributeEditor(attribute);
if (attributeEditor != null) {
attributeEditors.add(attributeEditor);
if (getModel().hasIncomingChanges(attribute))
hasIncoming = true;
}
}
}
@Override
public boolean setFormInput(Object input) {
if (input instanceof String) {
String text = (String) input;
Map<String, TaskAttribute> attributes = getTaskData().getRoot()
.getAttributes();
for (TaskAttribute attribute : attributes.values())
if (text.equals(attribute.getId())) {
TaskAttributeMetaData properties = attribute.getMetaData();
if (TaskAttribute.KIND_DEFAULT.equals(properties.getKind()))
selectReveal(attribute);
}
}
return super.setFormInput(input);
}
public void selectReveal(TaskAttribute attribute) {
if (attribute == null)
return;
if (!getSection().isExpanded())
CommonFormUtil.setExpanded(getSection(), true);
EditorUtil.reveal(getTaskEditorPage().getManagedForm().getForm(),
attribute.getId());
}
}