From a8cc661d09d08001997544bbf893f966345137ec Mon Sep 17 00:00:00 2001 From: bancika Date: Sun, 30 Jan 2011 14:10:38 +0000 Subject: [PATCH] better error handling when drawing --- .../DIYLC/config.xml | 2 +- .../DIYLC/src/org/diylc/common/EventType.java | 10 +++- .../org/diylc/presenter/DrawingManager.java | 49 ++++++++++++++++--- .../src/org/diylc/presenter/Presenter.java | 24 +++++++-- .../swing/plugins/statusbar/StatusBar.java | 10 ++-- 5 files changed, 76 insertions(+), 19 deletions(-) diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index 40587189..1d5d337d 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -9,7 +9,7 @@ lastPath - C:\Documents and Settings\Branislav Stojkovic\Desktop + C:\Documents and Settings\Branislav Stojkovic\Desktop\oldFiles showTemplatesAtStartup diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java index 8f59f63c..fd1d8838 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java @@ -72,6 +72,12 @@ public enum EventType { * current cursor location (not taking zoom into account). */ MOUSE_MOVED, - LAYER_STATE_CHANGED; - ; + /** + * Called when a layer status is changed. The first parameter is a set of indices of locked layers. All layers not included are considered unlocked. + */ + LAYER_STATE_CHANGED, + /** + * Called to update the status message. New status message is passed as a first parameter. + */ + STATUS_MESSAGE_CHANGED; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java index 8ad3773f..489dbe74 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.log4j.Logger; import org.diylc.common.DrawOption; import org.diylc.common.EventType; import org.diylc.common.GridType; @@ -38,6 +39,8 @@ import com.diyfever.gui.simplemq.MessageDispatcher; */ public class DrawingManager { + private static final Logger LOG = Logger.getLogger(DrawingManager.class); + public static int CONTROL_POINT_SIZE = 7; public static final String ANTIALIASING_KEY = "anti-aliasing"; @@ -56,6 +59,7 @@ public class DrawingManager { private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); private Composite lockedComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + private List> failedComponents = new ArrayList>(); private double zoomLevel = 1d;// ConfigurationManager.getInstance().readDouble(ZOOM_KEY, // 1d); @@ -69,12 +73,31 @@ public class DrawingManager { lastDrawnStateMap = new HashMap, ComponentState>(); } - public void drawProject(Graphics2D g2d, Project project, Set drawOptions, - IComponentFiler filter, Rectangle selectionRect, List> selectedComponents, - Set> lockedComponents, Set> groupedComponents, - List controlPointSlot, IDIYComponent componentSlot, boolean dragInProgress) { + /** + * Paints the project onto the canvas and returns the list of components + * that failed to draw. + * + * @param g2d + * @param project + * @param drawOptions + * @param filter + * @param selectionRect + * @param selectedComponents + * @param lockedComponents + * @param groupedComponents + * @param controlPointSlot + * @param componentSlot + * @param dragInProgress + * @return + */ + public List> drawProject(Graphics2D g2d, Project project, + Set drawOptions, IComponentFiler filter, Rectangle selectionRect, + List> selectedComponents, Set> lockedComponents, + Set> groupedComponents, List controlPointSlot, + IDIYComponent componentSlot, boolean dragInProgress) { + failedComponents.clear(); if (project == null) { - return; + return failedComponents; } G2DWrapper g2dWrapper = new G2DWrapper(g2d); @@ -158,7 +181,12 @@ public class DrawingManager { g2d.setComposite(lockedComposite); } // Draw the component through the g2dWrapper. - component.draw(g2dWrapper, state, project, g2dWrapper); + try { + component.draw(g2dWrapper, state, project, g2dWrapper); + } catch (Exception e) { + LOG.error("Error drawing " + component.getName(), e); + failedComponents.add(component); + } Area area = g2dWrapper.finishedDrawingComponent(); if (trackArea) { componentAreaMap.put(component, area); @@ -214,7 +242,12 @@ public class DrawingManager { if (componentSlot != null) { g2dWrapper.startedDrawingComponent(); g2dWrapper.setComposite(slotComposite); - componentSlot.draw(g2dWrapper, ComponentState.NORMAL, project, g2dWrapper); + try { + componentSlot.draw(g2dWrapper, ComponentState.NORMAL, project, g2dWrapper); + } catch (Exception e) { + LOG.error("Error drawing " + componentSlot.getName(), e); + failedComponents.add(componentSlot); + } g2dWrapper.finishedDrawingComponent(); } @@ -258,6 +291,8 @@ public class DrawingManager { g2d.draw(area); } } + + return failedComponents; } public double getZoomLevel() { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index 94c26e1c..0617a4f2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -299,7 +299,8 @@ public class Presenter implements IPlugInPort { groupedComponents.add(component); } } - // Don't draw the component in the slot if both control points match. + // Don't draw the component in the slot if both control points + // match. IDIYComponent componentSlotToDraw; if (instantiationManager.getFirstControlPoint() != null && instantiationManager.getPotentialControlPoint() != null @@ -309,10 +310,23 @@ public class Presenter implements IPlugInPort { } else { componentSlotToDraw = instantiationManager.getComponentSlot(); } - drawingManager.drawProject(g2d, currentProject, drawOptions, filter, selectionRect, - selectedComponents, getLockedComponents(), groupedComponents, Arrays.asList( - instantiationManager.getFirstControlPoint(), instantiationManager - .getPotentialControlPoint()), componentSlotToDraw, dragInProgress); + List> failedComponents = drawingManager.drawProject(g2d, currentProject, + drawOptions, filter, selectionRect, selectedComponents, getLockedComponents(), + groupedComponents, Arrays.asList(instantiationManager.getFirstControlPoint(), + instantiationManager.getPotentialControlPoint()), componentSlotToDraw, + dragInProgress); + List failedComponentNames = new ArrayList(); + for (IDIYComponent component : failedComponents) { + failedComponentNames.add(component.getName()); + } + Collections.sort(failedComponentNames); + if (!failedComponentNames.isEmpty()) { + messageDispatcher.dispatchMessage(EventType.STATUS_MESSAGE_CHANGED, + "Failed to draw components: " + + Utils.toCommaString(failedComponentNames) + ""); + } else { + messageDispatcher.dispatchMessage(EventType.STATUS_MESSAGE_CHANGED, ""); + } } /** diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/statusbar/StatusBar.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/statusbar/StatusBar.java index f8808038..c2ac05e4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/statusbar/StatusBar.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/statusbar/StatusBar.java @@ -66,6 +66,7 @@ public class StatusBar extends JPanel implements IPlugIn { private List componentNamesUnderCursor; private List selectedComponentNames; private List stuckComponentNames; + private String statusMessage; public StatusBar(ISwingUI swingUI) { super(); @@ -196,7 +197,8 @@ public class StatusBar extends JPanel implements IPlugIn { @Override public EnumSet getSubscribedEventTypes() { return EnumSet.of(EventType.ZOOM_CHANGED, EventType.SLOT_CHANGED, - EventType.AVAILABLE_CTRL_POINTS_CHANGED, EventType.SELECTION_CHANGED); + EventType.AVAILABLE_CTRL_POINTS_CHANGED, EventType.SELECTION_CHANGED, + EventType.STATUS_MESSAGE_CHANGED); } @SuppressWarnings("unchecked") @@ -247,11 +249,13 @@ public class StatusBar extends JPanel implements IPlugIn { Collections.sort(componentNamesUnderCursor); refreshStatusText(); break; + case STATUS_MESSAGE_CHANGED: + statusMessage = (String) params[0]; } } private void refreshStatusText() { - String statusText = ""; + String statusText = this.statusMessage; if (componentSlot == null) { if (componentNamesUnderCursor != null && !componentNamesUnderCursor.isEmpty()) { String formattedNames = Utils.toCommaString(componentNamesUnderCursor); @@ -265,8 +269,6 @@ public class StatusBar extends JPanel implements IPlugIn { builder.append(")"); } statusText = "Selection: " + builder.toString() + ""; - } else { - statusText = ""; } } else { switch (componentSlot.getCreationMethod()) {