diff options
Diffstat (limited to 'plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/LogDialog.java')
-rw-r--r-- | plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/LogDialog.java | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/LogDialog.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/LogDialog.java new file mode 100644 index 0000000000..d754326363 --- /dev/null +++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/LogDialog.java @@ -0,0 +1,167 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.ui.widgets; + +import org.eclipse.net4j.util.io.IORuntimeException; + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyleRange; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.TextStyle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Eike Stepper + */ +public class LogDialog extends BaseDialog +{ + private StringBuilder log = new StringBuilder(); + + private StyledText text; + + private TextStyle textStyle; + + private List<StyleRange> styleRanges = new ArrayList(); + + private StyleRange currentStyleRange = new StyleRange(); + + private StyleRange lastStyleRange; + + private Font font; + + public LogDialog(Shell parentShell, int shellStyle, String title, String message, IDialogSettings settings) + { + super(parentShell, shellStyle, title, message, settings); + } + + public LogDialog(Shell parentShell, String title, String message, IDialogSettings settings) + { + this(parentShell, DEFAULT_SHELL_STYLE, title, message, settings); + } + + public TextStyle getTextStyle() + { + return textStyle; + } + + public void setTextStyle(TextStyle textStyle) + { + if (textStyle == null) + { + throw new IllegalArgumentException("textStyle == null"); + } + + if (textStyle.equals(this.textStyle)) + { + return; + } + + lastStyleRange = currentStyleRange; + this.textStyle = textStyle; + + currentStyleRange = new StyleRange(); + currentStyleRange.start = log.length(); + currentStyleRange.rise = textStyle.rise; + currentStyleRange.background = textStyle.background; + currentStyleRange.font = textStyle.font; + currentStyleRange.foreground = textStyle.foreground; + currentStyleRange.metrics = textStyle.metrics; + currentStyleRange.strikeout = textStyle.strikeout; + currentStyleRange.underline = textStyle.underline; + } + + public void append(String text) + { + checkStyleRange(); + log.append(text); + currentStyleRange.length += text.length(); + } + + public void append(Throwable t) + { + try + { + checkStyleRange(); + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + String message = t.getMessage() + "\n"; + bytes.write(message.getBytes()); + t.printStackTrace(new PrintStream(bytes)); + + String text = bytes.toString(); + log.append(text); + currentStyleRange.length += text.length(); + } + catch (IOException ex) + { + throw new IORuntimeException(ex); + } + } + + @Override + public boolean close() + { + font.dispose(); + return super.close(); + } + + @Override + protected void createUI(Composite parent) + { + GridLayout grid = new GridLayout(); + grid.marginTop = 6; + grid.marginLeft = 6; + grid.marginRight = 6; + grid.marginBottom = 6; + + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(grid); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + font = new Font(getShell().getDisplay(), "Courier New", 9, SWT.NORMAL); + checkStyleRange(); + lastStyleRange = currentStyleRange; + checkStyleRange(); + + text = new StyledText(composite, SWT.MULTI | SWT.READ_ONLY | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + text.setText(log.toString()); + text.setStyleRanges(styleRanges.toArray(new StyleRange[styleRanges.size()])); + text.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_WHITE)); + text.setFont(font); + } + + @Override + protected void createButtonsForButtonBar(Composite parent) + { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); + } + + private void checkStyleRange() + { + if (lastStyleRange != null) + { + styleRanges.add(lastStyleRange); + lastStyleRange = null; + } + } +} |