| /******************************************************************************* |
| * Copyright (c) 2000, 2008 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.forms.examples.internal.rcp; |
| |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| |
| import org.eclipse.jface.dialogs.IMessageProvider; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.layout.FillLayout; |
| 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.Control; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.ui.ISharedImages; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.forms.HyperlinkSettings; |
| import org.eclipse.ui.forms.IManagedForm; |
| import org.eclipse.ui.forms.IMessage; |
| import org.eclipse.ui.forms.IMessageManager; |
| import org.eclipse.ui.forms.editor.FormEditor; |
| import org.eclipse.ui.forms.editor.FormPage; |
| import org.eclipse.ui.forms.events.HyperlinkAdapter; |
| import org.eclipse.ui.forms.events.HyperlinkEvent; |
| import org.eclipse.ui.forms.widgets.Form; |
| 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.Section; |
| import org.eclipse.ui.forms.widgets.TableWrapLayout; |
| |
| /** |
| * This page shows how to use the message manager to handle errors in a form |
| * page. |
| * |
| * @since 3.3 |
| */ |
| public class ErrorMessagesPage extends FormPage { |
| |
| /* |
| private RichMessageToolTipManager richToolTipMessageManager; |
| class RichToolTip extends ToolTip { |
| private IManagedForm mform; |
| private FormText text; |
| private String content; |
| |
| public RichToolTip(IManagedForm mform, Control control) { |
| super(control); |
| this.mform = mform; |
| setShift(new Point(10, 10)); |
| } |
| |
| protected Composite createToolTipContentArea(Event event, |
| Composite parent) { |
| this.text = mform.getToolkit().createFormText(parent, true); |
| configureFormText(mform.getForm().getForm(), text); |
| update(); |
| return text; |
| } |
| |
| public void update(String content) { |
| if (content == null) { |
| // hide |
| deactivate(); |
| } else { |
| activate(); |
| this.content = content; |
| update(); |
| } |
| } |
| |
| private void update() { |
| if (text != null && text.isDisposed()) |
| text = null; |
| if (text != null) { |
| if (content != null) |
| text.setText(content, true, false); |
| else |
| text.setText("", false, false); |
| } |
| } |
| } |
| |
| class RichMessageToolTipManager implements IMessageToolTipManager { |
| private ArrayList toolTips = new ArrayList(); |
| private IManagedForm mform; |
| |
| public RichMessageToolTipManager(IManagedForm mform) { |
| this.mform = mform; |
| } |
| |
| public void createToolTip(Control control, boolean imageLabel) { |
| ToolTip toolTip = new RichToolTip(mform, control); |
| toolTips.add(toolTip); |
| } |
| |
| public void setActive(boolean active) { |
| for (int i = 0; i < toolTips.size(); i++) { |
| RichToolTip toolTip = (RichToolTip) toolTips.get(i); |
| if (active) |
| toolTip.activate(); |
| else |
| toolTip.deactivate(); |
| } |
| } |
| |
| public void update() { |
| IMessage[] messages = mform.getForm().getForm() |
| .getChildrenMessages(); |
| String content = mform.getForm().getMessage() == null ? null |
| : createFormTextContent(messages); |
| for (int i = 0; i < toolTips.size(); i++) { |
| RichToolTip toolTip = (RichToolTip) toolTips.get(i); |
| toolTip.update(content); |
| } |
| } |
| } |
| |
| */ |
| |
| /** |
| * @param id |
| * @param title |
| */ |
| public ErrorMessagesPage(FormEditor editor) { |
| super(editor, "messageManager", "Message Manager"); |
| } |
| |
| protected void createFormContent(final IManagedForm managedForm) { |
| final ScrolledForm form = managedForm.getForm(); |
| final FormToolkit toolkit = managedForm.getToolkit(); |
| toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode( |
| HyperlinkSettings.UNDERLINE_HOVER); |
| form.setText("Example with message handling"); |
| toolkit.decorateFormHeading(form.getForm()); |
| form.getForm().addMessageHyperlinkListener(new HyperlinkAdapter() { |
| public void linkActivated(HyperlinkEvent e) { |
| String title = e.getLabel(); |
| // String details = title; |
| Object href = e.getHref(); |
| if (href instanceof IMessage[]) { |
| // details = |
| // managedForm.getMessageManager().createSummary((IMessage[])href); |
| } |
| // int type = form.getForm().getMessageType(); |
| /* |
| * switch (type) { case IMessageProvider.NONE: case |
| * IMessageProvider.INFORMATION: |
| * MessageDialog.openInformation(form.getShell(), title, |
| * details); break; case IMessageProvider.WARNING: |
| * MessageDialog.openWarning(form.getShell(), title, details); |
| * break; case IMessageProvider.ERROR: |
| * MessageDialog.openError(form.getShell(), title, details); |
| * break; } |
| */ |
| Point hl = ((Control) e.widget).toDisplay(0, 0); |
| hl.x += 10; |
| hl.y += 10; |
| Shell shell = new Shell(form.getShell(), SWT.ON_TOP | SWT.TOOL); |
| shell.setImage(getImage(form.getMessageType())); |
| shell.setText(title); |
| shell.setLayout(new FillLayout()); |
| // ScrolledFormText stext = new ScrolledFormText(shell, false); |
| // stext.setBackground(toolkit.getColors().getBackground()); |
| FormText text = toolkit.createFormText(shell, true); |
| configureFormText(form.getForm(), text); |
| // stext.setFormText(text); |
| if (href instanceof IMessage[]) |
| text.setText(createFormTextContent((IMessage[]) href), |
| true, false); |
| shell.setLocation(hl); |
| // Point size = shell.computeSize(400, SWT.DEFAULT); |
| /* |
| richToolTipMessageManager.setActive(false); |
| shell.addDisposeListener(new DisposeListener() { |
| public void widgetDisposed(DisposeEvent e) { |
| richToolTipMessageManager.setActive(true); |
| } |
| }); |
| */ |
| shell.pack(); |
| shell.open(); |
| } |
| }); |
| |
| //richToolTipMessageManager = new RichMessageToolTipManager(managedForm); |
| //form.getForm().setMessageToolTipManager(richToolTipMessageManager); |
| |
| final IMessageManager mmng = managedForm.getMessageManager(); |
| |
| TableWrapLayout layout = new TableWrapLayout(); |
| form.getBody().setLayout(layout); |
| Section section = toolkit.createSection(form.getBody(), |
| Section.TITLE_BAR); |
| section.setText("Local field messages"); |
| Composite sbody = toolkit.createComposite(section); |
| section.setClient(sbody); |
| GridLayout glayout = new GridLayout(); |
| glayout.horizontalSpacing = 10; |
| glayout.numColumns = 2; |
| sbody.setLayout(glayout); |
| toolkit.paintBordersFor(sbody); |
| createDecoratedTextField("Field1", toolkit, sbody, mmng); |
| createDecoratedTextField("Field2", toolkit, sbody, mmng); |
| createDecoratedTextField("Field3", toolkit, sbody, mmng); |
| final Button button1 = toolkit.createButton(form.getBody(), |
| "Add general error", SWT.CHECK); |
| button1.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| if (button1.getSelection()) { |
| mmng.addMessage("saveError", "Save Error", null, |
| IMessageProvider.ERROR); |
| } else { |
| mmng.removeMessage("saveError"); |
| } |
| } |
| }); |
| final Button button2 = toolkit.createButton(form.getBody(), |
| "Add static message", SWT.CHECK); |
| button2.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| if (button2.getSelection()) { |
| mmng.addMessage("info", "Secondary info", null, |
| IMessageProvider.NONE); |
| } else { |
| mmng.removeMessage("info"); |
| } |
| } |
| }); |
| final Button button3 = toolkit.createButton(form.getBody(), |
| "Auto update", SWT.CHECK); |
| button3.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| mmng.setAutoUpdate(button3.getSelection()); |
| } |
| }); |
| button3.setSelection(true); |
| } |
| |
| private Image getImage(int type) { |
| switch (type) { |
| case IMessageProvider.ERROR: |
| return PlatformUI.getWorkbench().getSharedImages().getImage( |
| ISharedImages.IMG_OBJS_ERROR_TSK); |
| case IMessageProvider.WARNING: |
| return PlatformUI.getWorkbench().getSharedImages().getImage( |
| ISharedImages.IMG_OBJS_WARN_TSK); |
| case IMessageProvider.INFORMATION: |
| return PlatformUI.getWorkbench().getSharedImages().getImage( |
| ISharedImages.IMG_OBJS_INFO_TSK); |
| } |
| return null; |
| } |
| |
| private void configureFormText(final Form form, FormText text) { |
| text.addHyperlinkListener(new HyperlinkAdapter() { |
| public void linkActivated(HyperlinkEvent e) { |
| String is = (String)e.getHref(); |
| try { |
| int index = Integer.parseInt(is); |
| IMessage [] messages = form.getChildrenMessages(); |
| IMessage message =messages[index]; |
| Control c = message.getControl(); |
| ((FormText)e.widget).getShell().dispose(); |
| if (c!=null) |
| c.setFocus(); |
| } |
| catch (NumberFormatException ex) { |
| } |
| } |
| }); |
| text.setImage("error", getImage(IMessageProvider.ERROR)); |
| text.setImage("warning", getImage(IMessageProvider.WARNING)); |
| text.setImage("info", getImage(IMessageProvider.INFORMATION)); |
| } |
| |
| String createFormTextContent(IMessage[] messages) { |
| StringWriter sw = new StringWriter(); |
| PrintWriter pw = new PrintWriter(sw); |
| pw.println("<form>"); |
| for (int i = 0; i < messages.length; i++) { |
| IMessage message = messages[i]; |
| pw |
| .print("<li vspace=\"false\" style=\"image\" indent=\"16\" value=\""); |
| switch (message.getMessageType()) { |
| case IMessageProvider.ERROR: |
| pw.print("error"); |
| break; |
| case IMessageProvider.WARNING: |
| pw.print("warning"); |
| break; |
| case IMessageProvider.INFORMATION: |
| pw.print("info"); |
| break; |
| } |
| pw.print("\"> <a href=\""); |
| pw.print(i+""); |
| pw.print("\">"); |
| if (message.getPrefix() != null) |
| pw.print(message.getPrefix()); |
| pw.print(message.getMessage()); |
| pw.println("</a></li>"); |
| } |
| pw.println("</form>"); |
| pw.flush(); |
| return sw.toString(); |
| } |
| |
| private void createDecoratedTextField(String label, FormToolkit toolkit, |
| Composite parent, final IMessageManager mmng) { |
| toolkit.createLabel(parent, label); |
| final Text text = toolkit.createText(parent, ""); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.widthHint = 150; |
| text.setLayoutData(gd); |
| text.addModifyListener(new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| String s = text.getText(); |
| // flag length |
| if (s.length() > 0 && s.length() <= 5) { |
| mmng.addMessage("textLength", |
| "Text is longer than 0 characters", null, |
| IMessageProvider.INFORMATION, text); |
| } else if (s.length() > 5 && s.length() <= 10) { |
| mmng.addMessage("textLength", |
| "Text is longer than 5 characters", null, |
| IMessageProvider.WARNING, text); |
| } else if (s.length() > 10) { |
| mmng.addMessage("textLength", |
| "Text is longer than 10 characters", null, |
| IMessageProvider.ERROR, text); |
| } else { |
| mmng.removeMessage("textLength", text); |
| } |
| // flag type |
| boolean badType = false; |
| for (int i = 0; i < s.length(); i++) { |
| if (!Character.isLetter(s.charAt(i))) { |
| badType = true; |
| break; |
| } |
| } |
| if (badType) { |
| mmng.addMessage("textType", |
| "Text must only contain letters", null, |
| IMessageProvider.ERROR, text); |
| } else { |
| mmng.removeMessage("textType", text); |
| } |
| } |
| }); |
| } |
| } |