001: /*
002: * Copyright 2007 Google Inc.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License. You may obtain a copy of
006: * the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013: * License for the specific language governing permissions and limitations under
014: * the License.
015: */
016: package com.google.gwt.dev.util.log;
017:
018: import com.google.gwt.dev.shell.LowLevel;
019:
020: import org.eclipse.swt.layout.FillLayout;
021: import org.eclipse.swt.widgets.Display;
022: import org.eclipse.swt.widgets.Shell;
023:
024: /**
025: * Useful for debugging, this class manages to standalone window
026: * and provides access to a logger you can use to write to it.
027: *
028: */
029: public class DetachedTreeLoggerWindow implements Runnable {
030: private static DetachedTreeLoggerWindow singleton;
031:
032: /**
033: * Provides a reference to a singleton <code>DetachedTreeLoggerWindow</code>.
034: *
035: * @param caption the text to appear in the windows title bar.
036: * @param width the widget of the window
037: * @param height the height of the window
038: * @param autoScroll whether or not the window should autoscroll as output is
039: * produced
040: * @return a proxy object providing limited control of the window.
041: */
042: public static synchronized DetachedTreeLoggerWindow getInstance(
043: final String caption, final int width, final int height,
044: final boolean autoScroll) {
045: if (singleton == null) {
046: singleton = new DetachedTreeLoggerWindow(caption, width,
047: height, autoScroll);
048: }
049: return singleton;
050: }
051:
052: private final Shell shell;
053: private final AbstractTreeLogger logger;
054: private boolean isRunning = false;
055:
056: private DetachedTreeLoggerWindow(final String caption,
057: final int width, final int height, final boolean autoScroll) {
058:
059: shell = new Shell(Display.getCurrent());
060: shell.setText(caption);
061: FillLayout fillLayout = new FillLayout();
062: fillLayout.marginWidth = 0;
063: fillLayout.marginHeight = 0;
064: shell.setLayout(fillLayout);
065:
066: final TreeLoggerWidget treeLoggerWidget = new TreeLoggerWidget(
067: shell);
068: treeLoggerWidget.setAutoScroll(autoScroll);
069: logger = treeLoggerWidget.getLogger();
070:
071: shell.setImage(LowLevel.loadImage("gwt.ico"));
072: shell.setSize(width, height);
073: shell.open();
074: }
075:
076: public AbstractTreeLogger getLogger() {
077: return logger;
078: }
079:
080: public synchronized boolean isRunning() {
081: return isRunning;
082: }
083:
084: public void run() {
085: if (!maybeStart()) {
086: throw new IllegalStateException(
087: "DetachedTreeLogger window is already running.");
088: }
089:
090: final Display display = shell.getDisplay();
091: while (!shell.isDisposed()) {
092: if (!display.readAndDispatch()) {
093: display.sleep();
094: }
095: }
096: }
097:
098: private synchronized boolean maybeStart() {
099: if (isRunning) {
100: return false;
101: }
102: isRunning = true;
103: return true;
104: }
105: }
|