| /******************************************************************************* |
| * Copyright (c) 2009 Atlassian and others. |
| * 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: |
| * Atlassian - initial API and implementation |
| ******************************************************************************/ |
| |
| package com.atlassian.connector.eclipse.internal.crucible.ui.dialogs; |
| |
| import com.atlassian.connector.eclipse.internal.crucible.ui.CrucibleUiPlugin; |
| import com.atlassian.connector.eclipse.ui.dialogs.ProgressDialog; |
| import com.atlassian.theplugin.commons.crucible.api.model.CustomField; |
| import com.atlassian.theplugin.commons.crucible.api.model.CustomFieldDef; |
| import com.atlassian.theplugin.commons.crucible.api.model.Review; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.ToolBarManager; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.viewers.ComboViewer; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.mylyn.commons.core.StatusHandler; |
| import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; |
| import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport; |
| import org.eclipse.mylyn.internal.tasks.ui.editors.Messages; |
| import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor; |
| 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.internal.wikitext.tasks.ui.editor.ConfluenceMarkupTaskEditorExtension; |
| import org.eclipse.mylyn.tasks.core.TaskRepository; |
| import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine; |
| import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension; |
| import org.eclipse.mylyn.wikitext.core.parser.MarkupParser; |
| import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage; |
| import org.eclipse.mylyn.wikitext.core.util.ServiceLocator; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.RowLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.ActiveShellExpression; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.contexts.IContextActivation; |
| import org.eclipse.ui.contexts.IContextService; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| import org.eclipse.ui.handlers.IHandlerService; |
| |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| public abstract class AbstractCrucibleCommentDialog extends ProgressDialog { |
| |
| private final String taskKey; |
| |
| private final String taskId; |
| |
| private Review review; |
| |
| protected final HashMap<CustomFieldDef, ComboViewer> customCombos; |
| |
| protected final HashMap<String, CustomField> customFieldSelections; |
| |
| protected Button defectButton; |
| |
| protected CommonTextSupport textSupport; |
| |
| protected IContextService contextService; |
| |
| protected IContextActivation commentContext; |
| |
| private Action toggleEditAction; |
| |
| private Action toggleBrowserAction; |
| |
| protected boolean ignoreToggleEvents; |
| |
| protected RichTextEditor commentText; |
| |
| protected final TaskRepository taskRepository; |
| |
| public AbstractCrucibleCommentDialog(Shell parentShell, TaskRepository taskRepository, Review review, |
| String taskKey, String taskId) { |
| super(parentShell); |
| this.taskRepository = taskRepository; |
| this.review = review; |
| this.taskKey = taskKey; |
| this.taskId = taskId; |
| customCombos = new HashMap<CustomFieldDef, ComboViewer>(); |
| customFieldSelections = new HashMap<String, CustomField>(); |
| } |
| |
| public Review getReview() { |
| return review; |
| } |
| |
| protected void setReview(Review review) { |
| this.review = review; |
| } |
| |
| protected void createWikiTextControl(Composite composite, FormToolkit toolkit) { |
| final AbstractTaskEditorExtension extension = new ConfluenceMarkupTaskEditorExtension(); |
| final String contextId = extension.getEditorContextId(); |
| |
| contextService = (IContextService) PlatformUI.getWorkbench().getService(IContextService.class); |
| commentContext = contextService.activateContext(contextId, new ActiveShellExpression(getShell())); |
| |
| commentText = new RichTextEditor(taskRepository, SWT.MULTI | SWT.BORDER, contextService, extension); |
| final MarkupParser markupParser = new MarkupParser(); |
| final MarkupLanguage markupLanguage = ServiceLocator.getInstance().getMarkupLanguage("Confluence"); |
| if (markupLanguage != null) { |
| commentText.setRenderingEngine(new AbstractRenderingEngine() { |
| |
| @Override |
| public String renderAsHtml(TaskRepository repository, String text, IProgressMonitor monitor) |
| throws CoreException { |
| |
| markupParser.setMarkupLanguage(markupLanguage); |
| String htmlContent = markupParser.parseToHtml(text); |
| return htmlContent; |
| } |
| }); |
| } else { |
| StatusHandler.log(new Status(IStatus.INFO, CrucibleUiPlugin.PLUGIN_ID, |
| "Unable to locate Confluence MarkupLanguage. Browser preview will not be possible")); |
| } |
| |
| commentText.setReadOnly(false); |
| commentText.setSpellCheckingEnabled(true); |
| |
| // creating toolbar - must be created before actually commentText widget is created, to stay on top |
| ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); |
| fillToolBar(toolBarManager, commentText); |
| |
| if (toolBarManager.getSize() > 0) { |
| Composite toolbarComposite = toolkit.createComposite(composite); |
| GridDataFactory.fillDefaults() |
| .grab(false, false) |
| .hint(SWT.DEFAULT, SWT.DEFAULT) |
| .align(SWT.END, SWT.FILL) |
| .applyTo(toolbarComposite); |
| toolbarComposite.setBackground(null); |
| RowLayout rowLayout = new RowLayout(); |
| rowLayout.marginLeft = 0; |
| rowLayout.marginRight = 0; |
| rowLayout.marginTop = 0; |
| rowLayout.marginBottom = 0; |
| rowLayout.center = true; |
| toolbarComposite.setLayout(rowLayout); |
| |
| toolBarManager.createControl(toolbarComposite); |
| } |
| // end of toolbar creation stuff |
| |
| // auto-completion support |
| commentText.createControl(composite, toolkit); |
| IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class); |
| if (handlerService != null) { |
| textSupport = new CommonTextSupport(handlerService); |
| textSupport.install(commentText.getViewer(), true); |
| } |
| |
| commentText.showEditor(); |
| commentText.getViewer().getTextWidget().setBackground(null); |
| |
| GridDataFactory.fillDefaults().grab(true, true).applyTo(commentText.getControl()); |
| |
| GridData textGridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL |
| | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL); |
| textGridData.heightHint = 100; |
| textGridData.widthHint = 500; |
| commentText.getControl().setLayoutData(textGridData); |
| } |
| |
| protected void fillToolBar(ToolBarManager manager, final RichTextEditor editor) { |
| if (editor.hasPreview()) { |
| toggleEditAction = new Action("", SWT.TOGGLE) { //$NON-NLS-1$ |
| @Override |
| public void run() { |
| if (isChecked()) { |
| editor.showEditor(); |
| } else { |
| editor.showPreview(); |
| } |
| |
| if (toggleBrowserAction != null) { |
| toggleBrowserAction.setChecked(false); |
| } |
| } |
| }; |
| toggleEditAction.setImageDescriptor(CommonImages.EDIT_SMALL); |
| toggleEditAction.setToolTipText(Messages.TaskEditorRichTextPart_Edit_Tooltip); |
| toggleEditAction.setChecked(true); |
| editor.addStateChangedListener(new StateChangedListener() { |
| public void stateChanged(StateChangedEvent event) { |
| try { |
| ignoreToggleEvents = true; |
| toggleEditAction.setChecked(event.state == State.EDITOR || event.state == State.DEFAULT); |
| } finally { |
| ignoreToggleEvents = false; |
| } |
| } |
| }); |
| manager.add(toggleEditAction); |
| } |
| if (/* toggleEditAction == null && */editor.hasBrowser()) { |
| toggleBrowserAction = new Action("", SWT.TOGGLE) { //$NON-NLS-1$ |
| @Override |
| public void run() { |
| if (ignoreToggleEvents) { |
| return; |
| } |
| if (isChecked()) { |
| editor.showBrowser(); |
| } else { |
| editor.showEditor(); |
| } |
| |
| if (toggleEditAction != null) { |
| toggleEditAction.setChecked(false); |
| } |
| } |
| }; |
| toggleBrowserAction.setImageDescriptor(CommonImages.PREVIEW_WEB); |
| toggleBrowserAction.setToolTipText(Messages.TaskEditorRichTextPart_Browser_Preview); |
| toggleBrowserAction.setChecked(false); |
| editor.addStateChangedListener(new StateChangedListener() { |
| public void stateChanged(StateChangedEvent event) { |
| try { |
| ignoreToggleEvents = true; |
| toggleBrowserAction.setChecked(event.state == State.BROWSER); |
| } finally { |
| ignoreToggleEvents = false; |
| } |
| } |
| }); |
| manager.add(toggleBrowserAction); |
| } |
| } |
| |
| @Override |
| protected Collection<? extends Control> getDisableableControls() { |
| Set<Control> controls = new HashSet<Control>(super.getDisableableControls()); |
| if (customCombos.size() > 0) { |
| for (ComboViewer viewer : customCombos.values()) { |
| controls.add(viewer.getControl()); |
| } |
| } |
| |
| if (defectButton != null) { |
| controls.add(defectButton); |
| } |
| |
| return controls; |
| } |
| |
| @Override |
| public boolean close() { |
| if (contextService != null && commentContext != null) { |
| contextService.deactivateContext(commentContext); |
| commentContext = null; |
| } |
| |
| if (textSupport != null) { |
| textSupport.dispose(); |
| } |
| return super.close(); |
| } |
| |
| public TaskRepository getTaskRepository() { |
| return taskRepository; |
| } |
| |
| public void cancelUpdateComment() { |
| setReturnCode(Window.CANCEL); |
| close(); |
| } |
| |
| public String getTaskKey() { |
| return taskKey; |
| } |
| |
| public String getTaskId() { |
| return taskId; |
| } |
| |
| } |