diff options
| author | Kevin Sawicki | 2011-04-15 01:23:26 +0000 |
|---|---|---|
| committer | Chris Aniszczyk | 2011-04-15 15:14:36 +0000 |
| commit | ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc (patch) | |
| tree | e22ace8909b34a8f0fa9edabf753752eb41ec8cc | |
| parent | 1ada0edb2ba900156ff4172e460e4f921345bf4f (diff) | |
| download | egit-github-ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc.tar.gz egit-github-ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc.tar.xz egit-github-ddaf9f614f4cbc690d6ce17014dd7ac96ac485bc.zip | |
Add custom gist task editor attachment part
Change-Id: I1497392b9e56a7a7bd35135ddbcdd80ff80d9c85
Signed-off-by: Kevin Sawicki <kevin@github.com>
Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
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 11b78820..661324ce 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 53a03dc0..42aef5e3 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; } } |
