org.eclipse.ui.forms.examples.internal.rcp.ErrorMessagesPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.forms.examples.internal.rcp.ErrorMessagesPage.java

Source

/*******************************************************************************
 * 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);
                }
            }
        });
    }
}