/******************************************************************************* * Copyright (c) 2005, 2007 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.cheatsheets.composite.views; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.ManagedForm; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.FormText; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; import org.eclipse.ui.internal.cheatsheets.CheatSheetPlugin; import org.eclipse.ui.internal.cheatsheets.ICheatSheetResource; import org.eclipse.ui.internal.cheatsheets.Messages; import org.eclipse.ui.internal.cheatsheets.composite.model.AbstractTask; import org.eclipse.ui.internal.cheatsheets.composite.model.SuccesorTaskFinder; import org.eclipse.ui.internal.cheatsheets.composite.model.TaskStateUtilities; import org.eclipse.ui.internal.cheatsheets.composite.parser.ICompositeCheatsheetTags; import org.eclipse.ui.internal.cheatsheets.composite.parser.MarkupParser; import org.eclipse.ui.internal.provisional.cheatsheets.ICompositeCheatSheetTask; import org.eclipse.ui.internal.provisional.cheatsheets.IEditableTask; import org.eclipse.ui.internal.provisional.cheatsheets.ITaskGroup; /** * The description panel of a composite cheat sheet panel. This panel shows the introduction * message and depending upon the type and state of the task a selection of the following: * Completion message * A message indicating that the task has been skipped. * A message indicating that a parent task has been skipped. * A message indicating that the task is blocked. * A message indicationg that a parent choice is already satisfied. * A link to a successor task. * All tasks completed message. */ public class DescriptionPanel { public static final String REVIEW_IMAGE = "review"; //$NON-NLS-1$ private static final String GOTO_IMAGE = "goto"; //$NON-NLS-1$ private static final String SKIP_IMAGE = "skip"; //$NON-NLS-1$ private static final String START_IMAGE = "start"; //$NON-NLS-1$ private static final String WARNING_IMAGE = "warning"; //$NON-NLS-1$ private static final String INFORMATION_IMAGE = "info"; //$NON-NLS-1$ private Composite panel; private Composite control; private FormText upperText; private FormText lowerText; private ScrolledForm form; protected DescriptionPanel() {} public DescriptionPanel(ManagedForm mform, Composite parent) { FormToolkit toolkit = mform.getToolkit(); control = new Composite(parent, SWT.NULL); final GridLayout controlLayout = new GridLayout(); controlLayout.marginHeight = 0; controlLayout.marginWidth = 0; control.setLayout(controlLayout); form = toolkit.createScrolledForm(control); panel = form.getBody(); form.setLayoutData(new GridData(GridData.FILL_BOTH)); toolkit.adapt(panel); TableWrapLayout layout = new TableWrapLayout(); panel.setLayout(layout); upperText = mform.getToolkit().createFormText(panel, false); mform.getToolkit().adapt(upperText, false, false); Composite separator = toolkit.createCompositeSeparator(panel); TableWrapData data = new TableWrapData(); data.align = TableWrapData.FILL; data.grabHorizontal = true; data.maxHeight = 1; separator.setLayoutData(data); lowerText = mform.getToolkit().createFormText(panel, false); mform.getToolkit().adapt(lowerText, false, false); upperText.marginWidth = 5; upperText.marginHeight = 5; upperText.setFont("header", JFaceResources.getHeaderFont()); //$NON-NLS-1$ upperText.setColor("title", toolkit.getColors().getColor(IFormColors.TITLE)); //$NON-NLS-1$ lowerText.marginWidth = 5; lowerText.marginHeight = 5; lowerText.setImage(START_IMAGE, CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.COMPOSITE_TASK_START)); lowerText.setImage(SKIP_IMAGE, CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.COMPOSITE_TASK_SKIP)); lowerText.setImage(GOTO_IMAGE, CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.COMPOSITE_GOTO_TASK)); lowerText.setImage(REVIEW_IMAGE, CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.COMPOSITE_TASK_REVIEW)); lowerText.setImage(WARNING_IMAGE, CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.WARNING)); lowerText.setImage(INFORMATION_IMAGE, CheatSheetPlugin.getPlugin().getImage(ICheatSheetResource.INFORMATION)); } public Control getControl() { return control; } public void addHyperlinkListener(IHyperlinkListener listener) { lowerText.addHyperlinkListener(listener); } public void showDescription(final ICompositeCheatSheetTask task) { StringBuffer upperMessage = new StringBuffer(); upperMessage.append("<form>"); //$NON-NLS-1$ upperMessage.append("<p><span color=\"title\" font=\"header\">"); //$NON-NLS-1$ upperMessage.append(MarkupParser.escapeText(task.getName())); upperMessage.append("</span></p>"); //$NON-NLS-1$ upperMessage.append(MarkupParser.createParagraph(task.getDescription(), null)); upperMessage.append("</form>"); //$NON-NLS-1$ upperText.setText(upperMessage.toString(), true, false); StringBuffer buf = new StringBuffer(); buf.append("<form>"); //$NON-NLS-1$ boolean startable = false; boolean isBlocked = false; boolean isSkippable = ((AbstractTask)task).isSkippable(); if (task.getState() == ICompositeCheatSheetTask.COMPLETED) { buf.append(MarkupParser.createParagraph(task.getCompletionMessage(), null)); isSkippable = false; } else if (task.getState() == ICompositeCheatSheetTask.SKIPPED) { buf.append(MarkupParser.createParagraph(Messages.get().THIS_TASK_SKIPPED, INFORMATION_IMAGE)); isSkippable = false; } else if (TaskStateUtilities.findSkippedAncestor(task) != null) { ICompositeCheatSheetTask skipped = TaskStateUtilities.findSkippedAncestor(task); String skipParentMsg = NLS.bind(Messages.get().PARENT_SKIPPED, (new Object[] {MarkupParser.escapeText((skipped.getName()))})); buf.append(MarkupParser.createParagraph(skipParentMsg, WARNING_IMAGE)); isSkippable = false; } else if (TaskStateUtilities.findCompletedAncestor(task) != null) { ICompositeCheatSheetTask completed = TaskStateUtilities.findCompletedAncestor(task); String completedParentMsg = NLS.bind(Messages.get().PARENT_COMPLETED, (new Object[] {MarkupParser.escapeText(completed.getName())})); buf.append(MarkupParser.createParagraph(completedParentMsg, WARNING_IMAGE)); isSkippable = false; } else if (!task.requiredTasksCompleted()) { isBlocked = true; showBlockingTasks(Messages.get().COMPOSITE_PAGE_BLOCKED, task, buf); } else if (TaskStateUtilities.findBlockedAncestor(task) != null) { isBlocked = true; ICompositeCheatSheetTask blockedAncestor = TaskStateUtilities.findBlockedAncestor(task); String blockingAncestorMsg = NLS.bind(Messages.get().PARENT_BLOCKED, (new Object[] {MarkupParser.escapeText(blockedAncestor.getName())})); showBlockingTasks(blockingAncestorMsg , blockedAncestor, buf); } else { startable = task instanceof IEditableTask && task.getState() == ICompositeCheatSheetTask.NOT_STARTED; } if (startable) { addHyperlink(buf, CompositeCheatSheetPage.START_HREF, START_IMAGE, Messages.get().COMPOSITE_PAGE_START_TASK); } if (task instanceof IEditableTask && task.getState() == ICompositeCheatSheetTask.COMPLETED ) { addHyperlink(buf, CompositeCheatSheetPage.REVIEW_TAG, REVIEW_IMAGE, Messages.get().COMPOSITE_PAGE_REVIEW_TASK); } if (isSkippable) { String skipMessage; if (task instanceof ITaskGroup) { skipMessage = Messages.get().COMPOSITE_PAGE_SKIP_TASK_GROUP; } else { skipMessage = Messages.get().COMPOSITE_PAGE_SKIP_TASK; } addHyperlink(buf, CompositeCheatSheetPage.SKIP_HREF, SKIP_IMAGE, skipMessage); } if (!startable && !isBlocked) { showSuccesorTaskLinks(task, buf); } buf.append("</form>"); //$NON-NLS-1$ lowerText.setText(buf.toString(), true, false); getControl().setData(ICompositeCheatsheetTags.TASK, task); form.reflow(true); } private void showBlockingTasks(String message, final ICompositeCheatSheetTask task, StringBuffer buf) { buf.append("<p/>"); //$NON-NLS-1$ buf.append("<p>"); //$NON-NLS-1$ buf.append("<img href=\""); //$NON-NLS-1$ buf.append(WARNING_IMAGE); buf.append("\"/> "); //$NON-NLS-1$ buf.append(message); buf.append("</p>"); //$NON-NLS-1$// Add the list of blocking tasks ICompositeCheatSheetTask[] requiredTasks = task.getRequiredTasks(); for (int i = 0; i < requiredTasks.length; i++) { warnOfIncompleteTask(buf, requiredTasks[i]); } buf.append("<p>"); //$NON-NLS-1$ buf.append("</p>"); //$NON-NLS-1$ } private void addHyperlink(StringBuffer buf, String href, String imageRef, String message) { buf.append("<p><a href=\""); //$NON-NLS-1$ buf.append(href); buf.append("\">"); //$NON-NLS-1$ buf.append("<img href=\""); //$NON-NLS-1$ buf.append(imageRef); buf.append("\"/> "); //$NON-NLS-1$ buf.append(message); buf.append("</a></p>"); //$NON-NLS-1$ } /* * If this task is incomplete create a message to that effect */ private void warnOfIncompleteTask(StringBuffer buf, ICompositeCheatSheetTask task) { if (task.getState() != ICompositeCheatSheetTask.COMPLETED && task.getState() != ICompositeCheatSheetTask.SKIPPED ) { buf.append("<li>"); //$NON-NLS-1$ buf.append("<a href=\""); //$NON-NLS-1$ buf.append(CompositeCheatSheetPage.GOTO_TASK_TAG); buf.append(task.getId()); buf.append("\">"); //$NON-NLS-1$ buf.append(NLS.bind(Messages.get().COMPOSITE_PAGE_TASK_NOT_COMPLETE, (new Object[] {MarkupParser.escapeText(task.getName())}))); buf.append("</a>"); //$NON-NLS-1$ buf.append("</li>"); //$NON-NLS-1$ } } private void showSuccesorTaskLinks(ICompositeCheatSheetTask task, StringBuffer buf) { // Add the links to the next tasks ICompositeCheatSheetTask[] successorTasks = new SuccesorTaskFinder(task).getRecommendedSuccessors(); for (int i = 0; i < successorTasks.length; i++) { ICompositeCheatSheetTask successor = successorTasks[i]; String message = NLS.bind(Messages.get().COMPOSITE_PAGE_GOTO_TASK, (new Object[] {MarkupParser.escapeText(successor.getName())})); addHyperlink(buf, CompositeCheatSheetPage.GOTO_TASK_TAG + successor.getId(), GOTO_IMAGE, message); } } }