1 16 package com.google.gwt.dev.util.log; 17 18 import com.google.gwt.core.ext.TreeLogger; 19 20 import org.eclipse.swt.SWT; 21 import org.eclipse.swt.graphics.Color; 22 import org.eclipse.swt.graphics.Image; 23 import org.eclipse.swt.widgets.Display; 24 import org.eclipse.swt.widgets.Tree; 25 import org.eclipse.swt.widgets.TreeItem; 26 27 import java.io.IOException ; 28 import java.io.InputStream ; 29 import java.util.Iterator ; 30 import java.util.LinkedList ; 31 import java.util.List ; 32 33 36 public final class TreeItemLogger extends AbstractTreeLogger { 37 38 41 public static class LogEvent { 42 public final Throwable caught; 43 44 public final int index; 45 46 public final boolean isBranchCommit; 47 48 public final TreeItemLogger logger; 49 50 public final String message; 51 52 public final TreeLogger.Type type; 53 54 public LogEvent(TreeItemLogger logger, boolean isBranchCommit, int index, 55 Type type, String message, Throwable caught) { 56 this.logger = logger; 57 this.isBranchCommit = isBranchCommit; 58 this.index = index; 59 this.type = type; 60 this.message = message; 61 this.caught = caught; 62 } 63 64 public String toString() { 65 String s = ""; 66 s += "[logger " + logger.toString(); 67 s += ", " + (isBranchCommit ? "BRANCH" : "LOG"); 68 s += ", index " + index; 69 s += ", type " + type.toString(); 70 s += ", msg '" + message + "'"; 71 s += "]"; 72 return s; 73 } 74 75 78 public void uiFlush(Tree tree) { 79 TreeItem treeItem = createTreeItem(tree); 82 83 if (treeItem == null) { 84 return; 88 } 89 90 uiStyleChildAndAncestors(type, treeItem); 93 } 94 95 99 private TreeItem createTreeItem(Tree tree) { 100 TreeItem treeItem = null; 101 102 if (isBranchCommit) { 103 TreeItemLogger parentLogger = (TreeItemLogger) logger.getParentLogger(); 111 if (parentLogger.lazyTreeItem == null) { 112 treeItem = new TreeItem(tree, SWT.NONE); 115 logger.lazyTreeItem = treeItem; 116 } else if (!parentLogger.lazyTreeItem.isDisposed()) { 117 treeItem = new TreeItem(parentLogger.lazyTreeItem, SWT.NONE); 120 logger.lazyTreeItem = treeItem; 121 } else { 122 parentLogger.markLoggerDead(); 127 return null; 128 } 129 } else { 130 if (logger.lazyTreeItem == null) { 137 treeItem = new TreeItem(tree, SWT.NONE); 140 } else if (!logger.lazyTreeItem.isDisposed()) { 141 treeItem = new TreeItem(logger.lazyTreeItem, SWT.NONE); 144 } else { 145 logger.markLoggerDead(); 150 return null; 151 } 152 } 153 154 String label = message; 157 if (label == null) { 158 if (caught != null) { 159 label = caught.getMessage(); 160 161 if (label == null || label.trim().length() == 0) { 162 label = caught.toString(); 163 } 164 } 165 } 166 treeItem.setText(label); 167 168 treeItem.setData(this); 171 172 return treeItem; 173 } 174 175 178 private void uiStyleChildAndAncestors(TreeLogger.Type type, TreeItem child) { 179 Display display = child.getDisplay(); 180 Color color; 181 182 Image image = null; 183 if (type == TreeLogger.ERROR) { 184 color = display.getSystemColor(SWT.COLOR_RED); 185 image = imageError; 186 } else if (type == TreeLogger.WARN) { 187 color = display.getSystemColor(SWT.COLOR_DARK_YELLOW); 188 image = imageWarning; 189 } else if (type == TreeLogger.INFO) { 190 color = display.getSystemColor(SWT.COLOR_BLACK); 191 image = imageInfo; 192 } else if (type == TreeLogger.TRACE) { 193 color = display.getSystemColor(SWT.COLOR_DARK_GRAY); 194 image = imageTrace; 195 } else if (type == TreeLogger.DEBUG) { 196 color = display.getSystemColor(SWT.COLOR_DARK_CYAN); 197 image = imageDebug; 198 } else { 199 color = display.getSystemColor(SWT.COLOR_DARK_GREEN); 201 image = imageSpam; 202 } 203 204 if (image != null) { 205 child.setImage(image); 206 } 207 208 child.setForeground(color); 211 212 if (type.needsAttention()) { 215 boolean propagateColor = true; 216 TreeItem parent = child.getParentItem(); 217 while (parent != null) { 218 LogEvent parentEvent = (LogEvent) parent.getData(); 219 if (propagateColor) { 220 if (parentEvent.type.isLowerPriorityThan(type)) { 221 parent.setForeground(color); 222 } else { 223 propagateColor = false; 224 } 225 } 226 parent.setExpanded(true); 227 parent = parent.getParentItem(); 228 } 229 } 230 } 231 } 232 238 private static class PendingUpdates { 239 private List updates = new LinkedList (); 240 241 private final Object updatesLock = new Object (); 242 243 public void add(LogEvent update) { 244 synchronized (updatesLock) { 245 updates.add(update); 246 } 247 } 248 249 254 public synchronized boolean uiFlush(Tree tree) { 255 List toFlush = null; 259 synchronized (updatesLock) { 260 if (updates.isEmpty()) { 261 return false; 264 } 265 toFlush = updates; 266 updates = new LinkedList (); 267 } 268 269 for (Iterator iter = toFlush.iterator(); iter.hasNext();) { 270 LogEvent update = (LogEvent) iter.next(); 271 if (!update.logger.isLoggerDead()) { 275 update.uiFlush(tree); 276 } 277 } 278 279 return true; 280 } 281 } 282 283 private static final Image imageDebug = tryLoadImage("log-item-debug.gif"); 287 private static final Image imageError = tryLoadImage("log-item-error.gif"); 288 private static final Image imageInfo = tryLoadImage("log-item-info.gif"); 289 private static final Image imageSpam = tryLoadImage("log-item-spam.gif"); 290 private static final Image imageTrace = tryLoadImage("log-item-trace.gif"); 291 private static final Image imageWarning = tryLoadImage("log-item-warning.gif"); 292 293 private static Image tryLoadImage(String simpleName) { 294 InputStream is = TreeItemLogger.class.getResourceAsStream(simpleName); 295 if (is != null) { 296 try { 297 Image image = new Image(null, is); 298 return image; 299 } finally { 300 try { 301 is.close(); 302 } catch (IOException e) { 303 } 304 } 305 } else { 306 return null; 309 } 310 } 311 312 private boolean dead; 313 314 private TreeItem lazyTreeItem; 315 316 private final PendingUpdates sharedPendingUpdates; 317 318 321 public TreeItemLogger() { 322 sharedPendingUpdates = new PendingUpdates(); 323 } 324 325 328 private TreeItemLogger(PendingUpdates sharedPendingUpdates) { 329 this.sharedPendingUpdates = sharedPendingUpdates; 331 } 332 333 public void markLoggerDead() { 334 if (getParentLogger() != null) { 337 dead = true; 338 } 339 } 340 341 346 public boolean uiFlush(Tree tree) { 347 return sharedPendingUpdates.uiFlush(tree); 348 } 349 350 protected AbstractTreeLogger doBranch() { 351 return new TreeItemLogger(sharedPendingUpdates); 352 } 353 354 protected void doCommitBranch(AbstractTreeLogger childBeingCommitted, 355 Type type, String msg, Throwable caught) { 356 if (isLoggerDead()) { 357 return; 358 } 359 360 TreeItemLogger commitChild = (TreeItemLogger) childBeingCommitted; 361 sharedPendingUpdates.add(new LogEvent(commitChild, true, 362 commitChild.getBranchedIndex(), type, msg, caught)); 363 } 364 365 protected void doLog(int index, TreeLogger.Type type, String msg, 366 Throwable caught) { 367 if (isLoggerDead()) { 368 return; 369 } 370 371 sharedPendingUpdates.add(new LogEvent(this, false, index, type, msg, caught)); 372 } 373 374 378 private boolean isLoggerDead() { 379 if (dead) { 382 return true; 383 } 384 385 TreeItemLogger parentLogger = (TreeItemLogger) getParentLogger(); 388 if (parentLogger == null) { 389 return false; 392 } 393 394 if (parentLogger.isLoggerDead()) { 397 markLoggerDead(); 400 return true; 401 } 402 403 return false; 406 } 407 } 408 | Popular Tags |