### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java,v retrieving revision 1.43 diff -u -r1.43 RichTextAttributeEditor.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java 14 Aug 2009 04:49:41 -0000 1.43 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java 20 Aug 2009 00:35:32 -0000 @@ -77,6 +77,10 @@ setControl(editor.getControl()); } + public RichTextEditor getEditor() { + return editor; + } + public SourceViewer getEditorViewer() { return editor.getEditorViewer(); } @@ -167,8 +171,8 @@ @Override protected void decorateIncoming(Color color) { super.decorateIncoming(color); - if (getEditorViewer() != null && getEditorViewer().getTextWidget() != null) { - getEditorViewer().getTextWidget().setBackground(color); + if (editor != null) { + editor.setBackground(color); } } Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java,v retrieving revision 1.7 diff -u -r1.7 RichTextEditor.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java 19 Aug 2009 07:39:29 -0000 1.7 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java 20 Aug 2009 00:35:32 -0000 @@ -17,6 +17,7 @@ import java.util.Iterator; import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.JFaceResources; @@ -44,6 +45,7 @@ import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; @@ -71,6 +73,22 @@ */ public class RichTextEditor { + public enum State { + DEFAULT, BROWSER, EDITOR, PREVIEW; + }; + + public static class StateChangedEvent { + + public State state; + + } + + public interface StateChangedListener { + + public void stateChanged(StateChangedEvent event); + + } + public class ViewSourceAction extends Action { public ViewSourceAction() { @@ -141,6 +159,8 @@ private boolean stickyPreview = false; + private final ListenerList stateChangedListeners = new ListenerList(ListenerList.IDENTITY); + public RichTextEditor(TaskRepository repository, int style) { this(repository, style, null, null); } @@ -338,6 +358,9 @@ return mode; } + /** + * @return The preview source viewer or null if there is no extension available or the attribute is read only + */ private SourceViewer getPreviewViewer() { if (extension == null) { return null; @@ -356,6 +379,8 @@ previewViewer.getControl().setData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION, editorViewer.getControl().getData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION)); installMenu(previewViewer.getControl(), editorViewer.getControl().getMenu()); + //set the background color in case there is an incoming to show + previewViewer.getTextWidget().setBackground(editorComposite.getBackground()); } return previewViewer; } @@ -527,6 +552,27 @@ } editorComposite.layout(); control.setFocus(); + fireStateChangedEvent(); + } + + protected void fireStateChangedEvent() { + if (stateChangedListeners.isEmpty()) { + return; + } + StateChangedEvent event = new StateChangedEvent(); + if (defaultViewer != null && defaultViewer.getControl() == editorLayout.topControl) { + event.state = State.DEFAULT; + } else if (defaultViewer != null && editorViewer.getControl() == editorLayout.topControl) { + event.state = State.EDITOR; + } else if (previewViewer != null && previewViewer.getControl() == editorLayout.topControl) { + event.state = State.PREVIEW; + } else if (browserViewer != null && browserViewer.getControl() == editorLayout.topControl) { + event.state = State.BROWSER; + } + Object[] listeners = stateChangedListeners.getListeners(); + for (Object listener : listeners) { + ((StateChangedListener) listener).stateChanged(event); + } } /** @@ -561,7 +607,7 @@ } private void showPreview(boolean sticky) { - if (!isReadOnly()) { + if (!isReadOnly() && getPreviewViewer() != null) { show(getPreviewViewer()); stickyPreview = sticky; } @@ -585,12 +631,12 @@ } public void enableAutoTogglePreview() { - if (getPreviewViewer() != null) { + if (!isReadOnly() && getPreviewViewer() != null) { show(getPreviewViewer()); previewViewer.getTextWidget().addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { - if (!stickyPreview) { + if (e.count == 2 && !stickyPreview) { int offset = previewViewer.getTextWidget().getCaretOffset(); showEditor(); editorViewer.getTextWidget().setCaretOffset(offset); @@ -609,4 +655,26 @@ } } + /** + * Sets the background color for all instantiated viewers + * + * @param color + */ + public void setBackground(Color color) { + if (editorComposite != null && !editorComposite.isDisposed()) { + editorComposite.setBackground(color); + for (Control child : editorComposite.getChildren()) { + child.setBackground(color); + } + } + } + + public void addStateChangedListener(StateChangedListener listener) { + stateChangedListeners.add(listener); + } + + public void removeStateChangedListener(StateChangedListener listener) { + stateChangedListeners.remove(listener); + } + } Index: src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java,v retrieving revision 1.35 diff -u -r1.35 TaskEditorRichTextPart.java --- src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java 14 Aug 2009 04:49:41 -0000 1.35 +++ src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java 20 Aug 2009 00:35:32 -0000 @@ -19,6 +19,9 @@ import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor.State; +import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor.StateChangedEvent; +import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor.StateChangedListener; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart; @@ -50,6 +53,8 @@ private Action toggleBrowserAction; + private boolean ignoreToggleEvents; + public TaskEditorRichTextPart() { setSectionStyle(ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED); } @@ -242,12 +247,25 @@ togglePreviewAction.setImageDescriptor(CommonImages.PREVIEW_WEB); togglePreviewAction.setToolTipText(Messages.TaskEditorRichTextPart_Preview); togglePreviewAction.setChecked(false); + getEditor().getEditor().addStateChangedListener(new StateChangedListener() { + public void stateChanged(StateChangedEvent event) { + try { + ignoreToggleEvents = true; + togglePreviewAction.setChecked(event.state == State.PREVIEW); + } finally { + ignoreToggleEvents = false; + } + } + }); manager.add(togglePreviewAction); } if (togglePreviewAction == null && getEditor().hasBrowser()) { toggleBrowserAction = new Action("", SWT.TOGGLE) { //$NON-NLS-1$ @Override public void run() { + if (ignoreToggleEvents) { + return; + } if (isChecked()) { editor.showBrowser(); } else { @@ -262,6 +280,16 @@ toggleBrowserAction.setImageDescriptor(CommonImages.PREVIEW_WEB); toggleBrowserAction.setToolTipText(Messages.TaskEditorRichTextPart_Browser_Preview); toggleBrowserAction.setChecked(false); + getEditor().getEditor().addStateChangedListener(new StateChangedListener() { + public void stateChanged(StateChangedEvent event) { + try { + ignoreToggleEvents = true; + toggleBrowserAction.setChecked(event.state == State.BROWSER); + } finally { + ignoreToggleEvents = false; + } + } + }); manager.add(toggleBrowserAction); } if (!getEditor().isReadOnly()) {