diff options
author | Jaxsun McCarthy Huggan | 2017-01-22 20:40:46 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2017-01-30 18:42:22 +0000 |
commit | d2a46aff5af616b1d97e24f1702e856234ca76e7 (patch) | |
tree | 2cadf0524ccd35d34b97e4f53f7a67349676d508 /org.eclipse.mylyn.tasks.ui/src/org/eclipse | |
parent | 5e40d60906c36732e800490c378a25f3d84b9db5 (diff) | |
download | org.eclipse.mylyn.tasks-d2a46aff5af616b1d97e24f1702e856234ca76e7.tar.gz org.eclipse.mylyn.tasks-d2a46aff5af616b1d97e24f1702e856234ca76e7.tar.xz org.eclipse.mylyn.tasks-d2a46aff5af616b1d97e24f1702e856234ca76e7.zip |
378863: support replying to selected part of a comment only
If the comment viewer is a styled text widget the reply to action will
attempt to reply to only the selected comment text. This means that some
connectors which use other controls for their comments will not support
this functionality, and the editor will default to replying ot the
entire comment text.
Change-Id: Ie100b62e4405da0720c3655e01fd18e6f1a181f0
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=378863
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse')
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java | 164 |
1 files changed, 66 insertions, 98 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java index b767b7bd5..9cb5c0436 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java @@ -43,6 +43,7 @@ import org.eclipse.mylyn.tasks.ui.TasksUiImages; import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.PaintEvent; @@ -66,6 +67,8 @@ import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.forms.widgets.Section; +import com.google.common.base.Strings; + /** * @author Robert Elves * @author Steffen Pingel @@ -105,13 +108,13 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { return composite; } - private Control createControl(final Composite parent, final FormToolkit toolkit) { + private Control createControl(Composite parent, FormToolkit toolkit) { if (renderedInSubSection) { return createSection(parent, toolkit); } else { if (TaskEditorCommentPart.this.commentAttributes.size() >= CommentGroupStrategy.MAX_CURRENT) { // show a separator before current comments - final Canvas separator = new Canvas(parent, SWT.NONE) { + Canvas separator = new Canvas(parent, SWT.NONE) { @Override public Point computeSize(int wHint, int hHint, boolean changed) { return new Point((wHint == SWT.DEFAULT) ? 1 : wHint, 1); @@ -130,12 +133,9 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { } } - private Section createSection(final Composite parent, final FormToolkit toolkit) { + private Section createSection(Composite parent, FormToolkit toolkit) { int style = ExpandableComposite.TWISTIE | ExpandableComposite.SHORT_TITLE_BAR | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT; -// if (/*commentGroup.hasIncoming() || */expandAllInProgress) { -// style |= ExpandableComposite.EXPANDED; -// } groupSection = toolkit.createSection(parent, style); groupSection.clientVerticalSpacing = 0; @@ -157,10 +157,10 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { if (e.getState()) { groupSection.setBackground(null); } else { - // only decorate background with incoming color when collapsed, otherwise + // only decorate background with incoming color when collapsed, otherwise // there is too much decoration in the editor - groupSection.setBackground(getTaskEditorPage().getAttributeEditorToolkit() - .getColorIncoming()); + groupSection.setBackground( + getTaskEditorPage().getAttributeEditorToolkit().getColorIncoming()); } } if (groupSection.getClient() == null) { @@ -186,7 +186,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { } commentViewers = new ArrayList<CommentViewer>(commentGroup.getCommentAttributes().size()); - for (final TaskAttribute commentAttribute : commentGroup.getCommentAttributes()) { + for (TaskAttribute commentAttribute : commentGroup.getCommentAttributes()) { CommentViewer commentViewer = new CommentViewer(commentAttribute); commentViewers.add(commentViewer); } @@ -273,46 +273,6 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { } } - // private void createToolBar(final FormToolkit toolkit) { -// if (section == null) { -// return; -// } -// -// ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); -// -// Action collapseAllAction = new Action("") { -// @Override -// public void run() { -// toggleSection(section, false); -// } -// }; -// collapseAllAction.setImageDescriptor(CommonImages.COLLAPSE_ALL_SMALL); -// collapseAllAction.setToolTipText("Collapse All Current Comments"); -// toolBarManager.add(collapseAllAction); -// -// Action expandAllAction = new Action("") { -// @Override -// public void run() { -// toggleSection(section, true); -// } -// }; -// expandAllAction.setImageDescriptor(CommonImages.EXPAND_ALL_SMALL); -// expandAllAction.setToolTipText("Expand All Current Comments"); -// toolBarManager.add(expandAllAction); -// -// Composite toolbarComposite = toolkit.createComposite(section); -// toolbarComposite.setBackground(null); -// RowLayout rowLayout = new RowLayout(); -// rowLayout.marginTop = 0; -// rowLayout.marginBottom = 0; -// rowLayout.marginLeft = 0; -// rowLayout.marginRight = 0; -// toolbarComposite.setLayout(rowLayout); -// -// toolBarManager.createControl(toolbarComposite); -// section.setTextClient(toolbarComposite); -// } - } public class CommentViewer { @@ -334,7 +294,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { this.taskComment = new TaskComment(getModel().getTaskRepository(), getModel().getTask(), commentAttribute); } - public Control createControl(Composite composite, final FormToolkit toolkit) { + public Control createControl(Composite composite, FormToolkit toolkit) { boolean hasIncomingChanges = getModel().hasIncomingChanges(commentAttribute); getTaskData().getAttributeMapper().updateTaskComment(taskComment, commentAttribute); int style = ExpandableComposite.TREE_NODE | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT @@ -350,10 +310,10 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { buttonComposite = createTitle(commentComposite, toolkit); - final Composite commentTextComposite = toolkit.createComposite(commentComposite); + Composite commentTextComposite = toolkit.createComposite(commentComposite); commentComposite.setClient(commentTextComposite); - commentTextComposite.setLayout(new FillWidthLayout(EditorUtil.getLayoutAdvisor(getTaskEditorPage()), 15, 0, - 0, 3)); + commentTextComposite + .setLayout(new FillWidthLayout(EditorUtil.getLayoutAdvisor(getTaskEditorPage()), 15, 0, 0, 3)); commentComposite.addExpansionListener(new ExpansionAdapter() { @Override public void expansionStateChanged(ExpansionEvent event) { @@ -372,7 +332,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { return commentComposite; } - private Composite createTitle(final ExpandableComposite commentComposite, final FormToolkit toolkit) { + private Composite createTitle(ExpandableComposite commentComposite, FormToolkit toolkit) { // always visible Composite titleComposite = toolkit.createComposite(commentComposite); commentComposite.setTextClient(titleComposite); @@ -398,7 +358,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { toolBarManagerTitle.createControl(titleComposite); // only visible when section is expanded - final Composite buttonComposite = toolkit.createComposite(titleComposite); + Composite buttonComposite = toolkit.createComposite(titleComposite); RowLayout buttonCompLayout = new RowLayout(); buttonCompLayout.marginBottom = 0; buttonCompLayout.marginTop = 0; @@ -413,8 +373,8 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { return buttonComposite; } - private ImageHyperlink createTitleHyperLink(final FormToolkit toolkit, final Composite toolbarComp, - final ITaskComment taskComment) { + private ImageHyperlink createTitleHyperLink(FormToolkit toolkit, Composite toolbarComp, + ITaskComment taskComment) { ImageHyperlink formHyperlink = toolkit.createImageHyperlink(toolbarComp, SWT.NONE); formHyperlink.setBackground(null); formHyperlink.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); @@ -454,8 +414,8 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { buttonComposite.setVisible(expanded); if (expanded && composite.getData(KEY_EDITOR) == null) { // create viewer - TaskAttribute textAttribute = getTaskData().getAttributeMapper().getAssoctiatedAttribute( - taskComment.getTaskAttribute()); + TaskAttribute textAttribute = getTaskData().getAttributeMapper() + .getAssoctiatedAttribute(taskComment.getTaskAttribute()); editor = createAttributeEditor(textAttribute); if (editor != null) { editor.setDecorationEnabled(false); @@ -496,7 +456,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { /** * Returns the comment viewer. - * + * * @return null, if the viewer has not been constructed */ public AbstractAttributeEditor getEditor() { @@ -519,37 +479,60 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { this.suppressSelectionChanged = value; } - } + public String getReplyToText() { + String replyText = taskComment.getText(); + if (editor != null && editor.getControl() != null && !editor.getControl().isDisposed()) { + Control textControl = getEditor().getControl(); + if (textControl instanceof StyledText) { + String selectedText = ((StyledText) textControl).getSelectionText(); + if (!Strings.isNullOrEmpty(selectedText)) { + replyText = selectedText; + } + } + } + return replyText; + } - private class ReplyToCommentAction extends AbstractReplyToCommentAction implements IMenuCreator { + } - private final ITaskComment taskComment; + private class ReplyToCommentAction extends AbstractReplyToCommentAction { private final CommentViewer commentViewer; - public ReplyToCommentAction(CommentViewer commentViewer, ITaskComment taskComment) { - super(TaskEditorCommentPart.this.getTaskEditorPage(), taskComment); + public ReplyToCommentAction(CommentViewer commentViewer) { + super(TaskEditorCommentPart.this.getTaskEditorPage(), commentViewer.getTaskComment()); this.commentViewer = commentViewer; - this.taskComment = taskComment; - setMenuCreator(this); } @Override protected String getReplyText() { - return taskComment.getText(); + return commentViewer.getReplyToText(); } - public Menu getMenu(Control parent) { - currentViewer = commentViewer; - selectionProvider.setSelection(new StructuredSelection(taskComment)); - return commentMenu; + protected CommentViewer getCommentViewer() { + return commentViewer; } public void dispose() { } + } + + private class ReplyToCommentActionWithMenu extends ReplyToCommentAction implements IMenuCreator { + + public ReplyToCommentActionWithMenu(CommentViewer commentViewer) { + super(commentViewer); + setMenuCreator(this); + } + + public Menu getMenu(Control parent) { + currentViewer = getCommentViewer(); + selectionProvider.setSelection(new StructuredSelection(currentViewer.getTaskComment())); + return commentMenu; + } + public Menu getMenu(Menu parent) { - selectionProvider.setSelection(new StructuredSelection(taskComment)); + selectionProvider.setSelection(new StructuredSelection(getCommentViewer().getTaskComment())); return commentMenu; } @@ -599,14 +582,14 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { setPartName(Messages.TaskEditorCommentPart_Comments); } - protected void addActionsToToolbarButton(ToolBarManager toolBarManager, final TaskComment taskComment, + protected void addActionsToToolbarButton(ToolBarManager toolBarManager, TaskComment taskComment, CommentViewer commentViewer) { - ReplyToCommentAction replyAction = new ReplyToCommentAction(commentViewer, taskComment); + ReplyToCommentAction replyAction = new ReplyToCommentActionWithMenu(commentViewer); replyAction.setImageDescriptor(TasksUiImages.COMMENT_REPLY_SMALL); toolBarManager.add(replyAction); } - protected void addActionsToToolbarTitle(ToolBarManager toolBarManager, final TaskComment taskComment, + protected void addActionsToToolbarTitle(ToolBarManager toolBarManager, TaskComment taskComment, CommentViewer commentViewer) { } @@ -626,10 +609,6 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { } } - // keep section expanded -// if (!collapsed && section != null) { -// CommonFormUtil.setExpanded(section, false); -// } } finally { getTaskEditorPage().setReflow(true); } @@ -644,7 +623,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { } @Override - public void createControl(Composite parent, final FormToolkit toolkit) { + public void createControl(Composite parent, FormToolkit toolkit) { initialize(); selectionProvider = new SelectionProviderAdapter(); @@ -657,18 +636,8 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { // get comment and add reply action as first item in the menu ISelection selection = selectionProvider.getSelection(); if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - Object element = ((IStructuredSelection) selection).getFirstElement(); - if (element instanceof ITaskComment) { - final ITaskComment comment = (ITaskComment) element; - AbstractReplyToCommentAction replyAction = new AbstractReplyToCommentAction( - getTaskEditorPage(), comment) { - @Override - protected String getReplyText() { - return comment.getText(); - } - }; - manager.add(replyAction); - } + ReplyToCommentAction replyAction = new ReplyToCommentAction(currentViewer); + manager.add(replyAction); } actionGroup.setContext(new ActionContext(selectionProvider.getSelection())); actionGroup.fillContextMenu(manager); @@ -731,9 +700,8 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { getTaskEditorPage().setReflow(false); if (section != null) { - // the expandAllInProgress flag will ensure that comments in top-level groups have been + // the expandAllInProgress flag will ensure that comments in top-level groups have been // expanded, no need to expand groups explicitly - //boolean expandGroups = section.getClient() != null; CommonFormUtil.setExpanded(section, true); @@ -754,7 +722,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { reflow(); } - private void expandSection(final FormToolkit toolkit, final Section section) { + private void expandSection(FormToolkit toolkit, Section section) { Composite composite = toolkit.createComposite(section); section.setClient(composite); composite.setLayout(EditorUtil.createSectionClientLayout()); @@ -872,7 +840,7 @@ public class TaskEditorCommentPart extends AbstractTaskEditorPart { // expand section groupViewer.setExpanded(true); - // EditorUtil is consistent with behavior of outline + // EditorUtil is consistent with behavior of outline EditorUtil.reveal(getTaskEditorPage().getManagedForm().getForm(), commentAttribute.getId()); return viewer; } |