Update of /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/templates/ui/dialog In directory sc8-pr-cvs1:/tmp/cvs-serv7241/src/org/epic/perleditor/templates/ui/dialog Added Files: MessageLine.java StatusDialog.java StatusInfo.java StatusUtil.java Log Message: Templating support added. --- NEW FILE: MessageLine.java --- package org.epic.perleditor.templates.ui.dialog; import org.epic.perleditor.editors.PerlImages; import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Composite; /** * A message line displaying a status. */ public class MessageLine extends CLabel { private static final RGB ERROR_BACKGROUND_RGB = new RGB(230, 226, 221); private Color fNormalMsgAreaBackground; private Color fErrorMsgAreaBackground; /** * Creates a new message line as a child of the given parent. */ public MessageLine(Composite parent) { this(parent, SWT.LEFT); } /** * Creates a new message line as a child of the parent and with the given SWT stylebits. */ public MessageLine(Composite parent, int style) { super(parent, style); fNormalMsgAreaBackground= getBackground(); fErrorMsgAreaBackground= null; } private Image findImage(IStatus status) { if (status.isOK()) { return null; } else if (status.matches(IStatus.ERROR)) { return PerlImages.IMG_OBJS_ERROR.createImage(); } else if (status.matches(IStatus.WARNING)) { return PerlImages.IMG_OBJS_WARNING.createImage(); } else if (status.matches(IStatus.INFO)) { return PerlImages.IMG_OBJS_INFO.createImage(); } return null; } /** * Sets the message and image to the given status. * <code>null</code> is a valid argument and will set the empty text and no image */ public void setErrorStatus(IStatus status) { if (status != null) { String message= status.getMessage(); if (message != null && message.length() > 0) { setText(message); setImage(findImage(status)); if (fErrorMsgAreaBackground == null) { fErrorMsgAreaBackground= new Color(getDisplay(), ERROR_BACKGROUND_RGB); } setBackground(fErrorMsgAreaBackground); return; } } setText(""); setImage(null); setBackground(fNormalMsgAreaBackground); } /* * @see Widget#dispose() */ public void dispose() { if (fErrorMsgAreaBackground != null) { fErrorMsgAreaBackground.dispose(); fErrorMsgAreaBackground= null; } super.dispose(); } } --- NEW FILE: StatusDialog.java --- package org.epic.perleditor.templates.ui.dialog; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; 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; /** * An abstract base class for dialogs with a status bar and ok/cancel buttons. * The status message must be passed over as StatusInfo object and can be * an error, warning or ok. The OK button is enabled or disabled depending * on the status. */ public abstract class StatusDialog extends Dialog { private Button fOkButton; private MessageLine fStatusLine; private IStatus fLastStatus; private String fTitle; private Image fImage; private boolean fStatusLineAboveButtons; /** * Creates an instane of a status dialog. */ public StatusDialog(Shell parent) { super(parent); fStatusLineAboveButtons= false; } /** * Specifies whether status line appears to the left of the buttons (default) * or above them. * * @param aboveButtons if <code>true</code> status line is placed above buttons; if * <code>false</code> to the right */ public void setStatusLineAboveButtons(boolean aboveButtons) { fStatusLineAboveButtons= aboveButtons; } /** * Update the dialog's status line to reflect the given status. * It is save to call this method before the dialog has been opened. */ protected void updateStatus(IStatus status) { fLastStatus= status; if (fStatusLine != null && !fStatusLine.isDisposed()) { updateButtonsEnableState(status); fStatusLine.setErrorStatus(status); } } /** * Returns the last status. */ public IStatus getStatus() { return fLastStatus; } /** * Updates the status of the ok button to reflect the given status. * Subclasses may override this method to update additional buttons. * @param status the status. */ protected void updateButtonsEnableState(IStatus status) { if (fOkButton != null && !fOkButton.isDisposed()) fOkButton.setEnabled(!status.matches(IStatus.ERROR)); } /* * @see Window#create(Shell) */ protected void configureShell(Shell shell) { super.configureShell(shell); if (fTitle != null) shell.setText(fTitle); } /* * @see Window#create() */ public void create() { super.create(); if (fLastStatus != null) { // policy: dialogs are not allowed to come up with an error message if (fLastStatus.matches(IStatus.ERROR)) { StatusInfo status= new StatusInfo(); status.setError(""); //$NON-NLS-1$ fLastStatus= status; } updateStatus(fLastStatus); } } /* * @see Dialog#createButtonsForButtonBar(Composite) */ protected void createButtonsForButtonBar(Composite parent) { fOkButton= createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /* * @see Dialog#createButtonBar(Composite) */ protected Control createButtonBar(Composite parent) { Composite composite= new Composite(parent, SWT.NULL); GridLayout layout= new GridLayout(); layout.numColumns= 1; layout.marginHeight= 0; layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fStatusLine= new MessageLine(composite); fStatusLine.setAlignment(SWT.LEFT); fStatusLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fStatusLine.setErrorStatus(null); //$NON-NLS-1$ super.createButtonBar(composite); return composite; } /** * Sets the title for this dialog. * @param title the title. */ public void setTitle(String title) { fTitle= title != null ? title : ""; //$NON-NLS-1$ Shell shell= getShell(); if ((shell != null) && !shell.isDisposed()) shell.setText(fTitle); } /** * Sets the image for this dialog. * @param image the image. */ public void setImage(Image image) { fImage= image; Shell shell= getShell(); if ((shell != null) && !shell.isDisposed()) shell.setImage(fImage); } } --- NEW FILE: StatusInfo.java --- package org.epic.perleditor.templates.ui.dialog; import org.epic.perleditor.PerlEditorPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.util.Assert; /** * A settable IStatus. * Can be an error, warning, info or ok. For error, info and warning states, * a message describes the problem. */ public class StatusInfo implements IStatus { private String fStatusMessage; private int fSeverity; /** * Creates a status set to OK (no message) */ public StatusInfo() { this(OK, null); } /** * Creates a status . * @param severity The status severity: ERROR, WARNING, INFO and OK. * @param message The message of the status. Applies only for ERROR, * WARNING and INFO. */ public StatusInfo(int severity, String message) { fStatusMessage = message; fSeverity = severity; } /** * Returns if the status' severity is OK. */ public boolean isOK() { return fSeverity == IStatus.OK; } /** * Returns if the status' severity is WARNING. */ public boolean isWarning() { return fSeverity == IStatus.WARNING; } /** * Returns if the status' severity is INFO. */ public boolean isInfo() { return fSeverity == IStatus.INFO; } /** * Returns if the status' severity is ERROR. */ public boolean isError() { return fSeverity == IStatus.ERROR; } /** * @see IStatus#getMessage */ public String getMessage() { return fStatusMessage; } /** * Sets the status to ERROR. * @param The error message (can be empty, but not null) */ public void setError(String errorMessage) { Assert.isNotNull(errorMessage); fStatusMessage = errorMessage; fSeverity = IStatus.ERROR; } /** * Sets the status to WARNING. * @param The warning message (can be empty, but not null) */ public void setWarning(String warningMessage) { Assert.isNotNull(warningMessage); fStatusMessage = warningMessage; fSeverity = IStatus.WARNING; } /** * Sets the status to INFO. * @param The info message (can be empty, but not null) */ public void setInfo(String infoMessage) { Assert.isNotNull(infoMessage); fStatusMessage = infoMessage; fSeverity = IStatus.INFO; } /** * Sets the status to OK. */ public void setOK() { fStatusMessage = null; fSeverity = IStatus.OK; } /* * @see IStatus#matches(int) */ public boolean matches(int severityMask) { return (fSeverity & severityMask) != 0; } /** * Returns always <code>false</code>. * @see IStatus#isMultiStatus() */ public boolean isMultiStatus() { return false; } /* * @see IStatus#getSeverity() */ public int getSeverity() { return fSeverity; } /* * @see IStatus#getPlugin() */ public String getPlugin() { return PerlEditorPlugin.getPluginId(); } /** * Returns always <code>null</code>. * @see IStatus#getException() */ public Throwable getException() { return null; } /** * Returns always the error severity. * @see IStatus#getCode() */ public int getCode() { return fSeverity; } /** * Returns always <code>null</code>. * @see IStatus#getChildren() */ public IStatus[] getChildren() { return new IStatus[0]; } } --- NEW FILE: StatusUtil.java --- /* * (c) Copyright IBM Corp. 2000, 2001. * All Rights Reserved. */ package org.epic.perleditor.templates.ui.dialog; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.DialogPage; /** * A utility class to work with IStatus. */ public class StatusUtil { /** * Compares two instances of <code>IStatus</code>. The more severe is returned: * An error is more severe than a warning, and a warning is more severe * than ok. If the two stati have the same severity, the second is returned. */ public static IStatus getMoreSevere(IStatus s1, IStatus s2) { if (s1.getSeverity() > s2.getSeverity()) { return s1; } else { return s2; } } /** * Finds the most severe status from a array of stati. * An error is more severe than a warning, and a warning is more severe * than ok. */ public static IStatus getMostSevere(IStatus[] status) { IStatus max= null; for (int i= 0; i < status.length; i++) { IStatus curr= status[i]; if (curr.matches(IStatus.ERROR)) { return curr; } if (max == null || curr.getSeverity() > max.getSeverity()) { max= curr; } } return max; } /** * Applies the status to the status line of a dialog page. */ public static void applyToStatusLine(DialogPage page, IStatus status) { String message= status.getMessage(); switch (status.getSeverity()) { case IStatus.OK: page.setMessage(message, DialogPage.NONE); page.setErrorMessage(null); break; case IStatus.WARNING: page.setMessage(message, DialogPage.WARNING); page.setErrorMessage(null); break; case IStatus.INFO: page.setMessage(message, DialogPage.INFORMATION); page.setErrorMessage(null); break; default: if (message.length() == 0) { message= null; } page.setMessage(null); page.setErrorMessage(message); break; } } } |