summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Sawicki2011-04-14 21:23:26 (EDT)
committerChris Aniszczyk2011-04-15 11:14:36 (EDT)
commitddaf9f614f4cbc690d6ce17014dd7ac96ac485bc (patch)
treee22ace8909b34a8f0fa9edabf753752eb41ec8cc
parent1ada0edb2ba900156ff4172e460e4f921345bf4f (diff)
downloadegit-github-ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc.zip
egit-github-ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc.tar.gz
egit-github-ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc.tar.bz2
Add custom gist task editor attachment partrefs/changes/36/3136/2
Change-Id: I1497392b9e56a7a7bd35135ddbcdd80ff80d9c85 Signed-off-by: Kevin Sawicki <kevin@github.com> Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
-rw-r--r--org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistAttachmentPart.java238
-rw-r--r--org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistTaskEditorPage.java14
2 files changed, 246 insertions, 6 deletions
diff --git a/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistAttachmentPart.java b/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistAttachmentPart.java
index 11b7882..661324c 100644
--- a/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistAttachmentPart.java
+++ b/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistAttachmentPart.java
@@ -11,28 +11,60 @@
package org.eclipse.mylyn.internal.github.ui.gist;
import java.io.File;
+import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.TableViewerSupport;
+import org.eclipse.mylyn.internal.tasks.core.TaskAttachment;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.commands.OpenTaskAttachmentHandler;
+import org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider;
import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiMenus;
import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.Mode;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
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.Label;
+import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
/**
* Gist editor attachment part. Modeled after {@link TaskEditorAttachmentPart}
@@ -70,8 +102,47 @@ public class GistAttachmentPart extends AbstractTaskEditorPart {
* @see org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart#createControl(org.eclipse.swt.widgets.Composite,
* org.eclipse.ui.forms.widgets.FormToolkit)
*/
- public void createControl(Composite parent, FormToolkit toolkit) {
+ public void createControl(Composite parent, final FormToolkit toolkit) {
+ initialize();
+ final Section section = createSection(parent, toolkit, hasIncoming);
+ section.setText(getPartName() + " (" + attachments.size() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (hasIncoming)
+ expandSection(toolkit, section);
+ else
+ section.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent event) {
+ if (attachmentsComposite == null) {
+ expandSection(toolkit, section);
+ getTaskEditorPage().reflow();
+ }
+ }
+ });
+ setSection(toolkit, section);
+ }
+
+ private void expandSection(FormToolkit toolkit, Section section) {
+ attachmentsComposite = toolkit.createComposite(section);
+ attachmentsComposite.setLayout(EditorUtil.createSectionClientLayout());
+ attachmentsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ getTaskEditorPage().registerDefaultDropListener(section);
+
+ if (attachments.size() > 0)
+ createAttachmentTable(toolkit, attachmentsComposite);
+ else {
+ Label label = toolkit
+ .createLabel(
+ attachmentsComposite,
+ org.eclipse.mylyn.internal.tasks.ui.editors.Messages.TaskEditorAttachmentPart_No_attachments);
+ getTaskEditorPage().registerDefaultDropListener(label);
+ }
+
+ createButtons(attachmentsComposite, toolkit);
+
+ toolkit.paintBordersFor(attachmentsComposite);
+ section.setClient(attachmentsComposite);
}
/**
@@ -83,6 +154,89 @@ public class GistAttachmentPart extends AbstractTaskEditorPart {
super.dispose();
}
+ private void createAttachmentTable(FormToolkit toolkit,
+ final Composite attachmentsComposite) {
+ attachmentsTable = toolkit.createTable(attachmentsComposite, SWT.MULTI
+ | SWT.FULL_SELECTION);
+ attachmentsTable.setLinesVisible(true);
+ attachmentsTable.setHeaderVisible(true);
+ attachmentsTable.setLayout(new GridLayout());
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL)
+ .grab(true, false).hint(500, SWT.DEFAULT)
+ .applyTo(attachmentsTable);
+ attachmentsTable.setData(FormToolkit.KEY_DRAW_BORDER,
+ FormToolkit.TREE_BORDER);
+
+ for (int i = 0; i < attachmentsColumns.length; i++) {
+ TableColumn column = new TableColumn(attachmentsTable, SWT.LEFT, i);
+ column.setText(attachmentsColumns[i]);
+ column.setWidth(attachmentsColumnWidths[i]);
+ column.setMoveable(true);
+ if (i == 0) {
+ attachmentsTable.setSortColumn(column);
+ attachmentsTable.setSortDirection(SWT.DOWN);
+ }
+ }
+ // size column
+ attachmentsTable.getColumn(1).setAlignment(SWT.RIGHT);
+
+ TableViewer attachmentsViewer = new TableViewer(attachmentsTable);
+ attachmentsViewer.setUseHashlookup(true);
+ attachmentsViewer.setColumnProperties(attachmentsColumns);
+ ColumnViewerToolTipSupport.enableFor(attachmentsViewer,
+ ToolTip.NO_RECREATE);
+
+ attachmentsViewer.setSorter(new GistAttachmentSorter());
+
+ List<ITaskAttachment> attachmentList = new ArrayList<ITaskAttachment>(
+ attachments.size());
+ for (TaskAttribute attribute : attachments) {
+ ITaskAttachment taskAttachment = new TaskAttachment(getModel()
+ .getTaskRepository(), getModel().getTask(), attribute);
+ getTaskData().getAttributeMapper().updateTaskAttachment(
+ taskAttachment, attribute);
+ attachmentList.add(taskAttachment);
+ }
+ attachmentsViewer.setContentProvider(new ArrayContentProvider());
+ attachmentsViewer.setLabelProvider(new AttachmentTableLabelProvider(
+ getModel(), getTaskEditorPage().getAttributeEditorToolkit()) {
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (columnIndex > 0)
+ columnIndex++;
+ return super.getColumnText(element, columnIndex);
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex > 0)
+ columnIndex++;
+ return super.getColumnImage(element, columnIndex);
+ }
+
+ });
+ attachmentsViewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ openAttachments(event);
+ }
+ });
+ attachmentsViewer.addSelectionChangedListener(getTaskEditorPage());
+ attachmentsViewer.setInput(attachmentList.toArray());
+
+ menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ TasksUiMenus.fillTaskAttachmentMenu(manager);
+ }
+ });
+ getTaskEditorPage().getEditorSite().registerContextMenu(ID_POPUP_MENU,
+ menuManager, attachmentsViewer, true);
+ Menu menu = menuManager.createContextMenu(attachmentsTable);
+ attachmentsTable.setMenu(menu);
+
+ new TableViewerSupport(attachmentsViewer, getStateFile());
+ }
+
private File getStateFile() {
IPath stateLocation = Platform.getStateLocation(TasksUiPlugin
.getDefault().getBundle());
@@ -114,18 +268,94 @@ public class GistAttachmentPart extends AbstractTaskEditorPart {
getTaskEditorPage().registerDefaultDropListener(attachFileButton);
}
+ private void initialize() {
+ attachments = getTaskData().getAttributeMapper().getAttributesByType(
+ getTaskData(), TaskAttribute.TYPE_ATTACHMENT);
+ for (TaskAttribute attachmentAttribute : attachments)
+ if (getModel().hasIncomingChanges(attachmentAttribute)) {
+ hasIncoming = true;
+ break;
+ }
+ }
+
/**
* @see org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart#fillToolBar(org.eclipse.jface.action.ToolBarManager)
*/
protected void fillToolBar(ToolBarManager toolBarManager) {
+ Action attachFileAction = new Action() {
+ @Override
+ public void run() {
+ EditorUtil.openNewAttachmentWizard(getTaskEditorPage(),
+ Mode.DEFAULT, null);
+ }
+ };
+ attachFileAction
+ .setToolTipText(org.eclipse.mylyn.internal.tasks.ui.editors.Messages.TaskEditorAttachmentPart_Attach_);
+ attachFileAction.setImageDescriptor(CommonImages.FILE_PLAIN_SMALL);
+ toolBarManager.add(attachFileAction);
+ }
+ protected void openAttachments(OpenEvent event) {
+ List<ITaskAttachment> attachments = new ArrayList<ITaskAttachment>();
+
+ StructuredSelection selection = (StructuredSelection) event
+ .getSelection();
+
+ List<?> items = selection.toList();
+ for (Object item : items)
+ if (item instanceof ITaskAttachment)
+ attachments.add((ITaskAttachment) item);
+
+ if (attachments.isEmpty())
+ return;
+
+ IWorkbenchPage page = getTaskEditorPage().getSite()
+ .getWorkbenchWindow().getActivePage();
+ try {
+ OpenTaskAttachmentHandler.openAttachments(page, attachments);
+ } catch (OperationCanceledException e) {
+ // canceled
+ }
}
- /**
- * @see org.eclipse.ui.forms.AbstractFormPart#setFormInput(java.lang.Object)
- */
+ @Override
public boolean setFormInput(Object input) {
+ if (input instanceof String) {
+ if (attachments != null)
+ for (TaskAttribute attachmentAttribute : attachments) {
+ if (input.equals(attachmentAttribute.getId())) {
+ CommonFormUtil.setExpanded(
+ (ExpandableComposite) getControl(), true);
+ return selectReveal(attachmentAttribute);
+ }
+ }
+ }
return super.setFormInput(input);
}
+ public boolean selectReveal(TaskAttribute attachmentAttribute) {
+ if (attachmentAttribute == null || attachmentsTable == null)
+ return false;
+
+ TableItem[] attachments = attachmentsTable.getItems();
+ int index = 0;
+ for (TableItem attachment : attachments) {
+ Object data = attachment.getData();
+ if (data instanceof ITaskAttachment) {
+ ITaskAttachment attachmentData = ((ITaskAttachment) data);
+ if (attachmentData.getTaskAttribute().getValue()
+ .equals(attachmentAttribute.getValue())) {
+ attachmentsTable.deselectAll();
+ attachmentsTable.select(index);
+ IManagedForm mform = getManagedForm();
+ ScrolledForm form = mform.getForm();
+ EditorUtil.focusOn(form, attachmentsTable);
+ return true;
+ }
+ }
+ index++;
+ }
+ return false;
+ }
+
}
diff --git a/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistTaskEditorPage.java b/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistTaskEditorPage.java
index 53a03dc..42aef5e 100644
--- a/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistTaskEditorPage.java
+++ b/org.eclipse.mylyn.github.ui/src/org/eclipse/mylyn/internal/github/ui/gist/GistTaskEditorPage.java
@@ -46,10 +46,11 @@ public class GistTaskEditorPage extends AbstractTaskEditorPage {
while (descriptorIt.hasNext()) {
TaskEditorPartDescriptor partDescriptor = descriptorIt.next();
String id = partDescriptor.getId();
- if (id.equals(ID_PART_ATTRIBUTES) || id.equals(ID_PART_SUMMARY))
+ if (id.equals(ID_PART_ATTRIBUTES) || id.equals(ID_PART_SUMMARY)
+ || id.equals(ID_PART_ATTACHMENTS))
descriptorIt.remove();
}
- if (!getModel().getTaskData().isNew())
+ if (!getModel().getTaskData().isNew()) {
partDescriptors.add(new TaskEditorPartDescriptor(ID_PART_SUMMARY) {
public AbstractTaskEditorPart createPart() {
@@ -57,6 +58,15 @@ public class GistTaskEditorPage extends AbstractTaskEditorPage {
.getId(), null);
}
}.setPath(PATH_HEADER));
+ partDescriptors.add(new TaskEditorPartDescriptor(
+ ID_PART_ATTACHMENTS) {
+
+ public AbstractTaskEditorPart createPart() {
+ return new GistAttachmentPart();
+ }
+ }.setPath(PATH_ATTACHMENTS));
+ }
+
return partDescriptors;
}
}