blob: 74ef0fa260b25d264febaaad2f22cda8fcaf1ef7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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.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");
}
}
});
}
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);
}
}
});
}
}