diff --git a/diylc/diylc-core/src/org/diylc/common/DrawOption.java b/diylc/diylc-core/src/org/diylc/common/DrawOption.java index 557e9862..7d47e0a4 100644 --- a/diylc/diylc-core/src/org/diylc/common/DrawOption.java +++ b/diylc/diylc-core/src/org/diylc/common/DrawOption.java @@ -56,5 +56,9 @@ public enum DrawOption { /** * Draw components in outline mode. */ - OUTLINE_MODE; + OUTLINE_MODE, + /** + * Include extra space around the layout. + */ + EXTRA_SPACE; } diff --git a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java index 356dec3a..70a57b3e 100644 --- a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java +++ b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java @@ -73,7 +73,8 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP public static final String SHOW_RULERS_KEY = "showRulers"; public static final String SHOW_GRID_KEY = "showGrid"; public static final String HIGHLIGHT_CONTINUITY_AREA = "highlightContinuityArea"; - public static final String HARDWARE_ACCELERATION = "hardwareAcceleration"; + public static final String HARDWARE_ACCELERATION = "hardwareAcceleration"; + public static final String EXTRA_SPACE_KEY = "extraSpace"; public static final int DND_TOGGLE_STICKY = 0x1; public static final int DND_TOGGLE_SNAP = 0x40000000; @@ -91,11 +92,12 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP * Each dimension is calculated as the product of the actual size and the number of pixels per * unit. If useZoom is set to true, the result is scaled by zoom factor. * - * @param useZoom + * @param useZoom + * @param includeExtraSpace * * @return canvas dimensions */ - Dimension getCanvasDimensions(boolean useZoom); + Dimension getCanvasDimensions(boolean useZoom, boolean includeExtraSpace); /** * Returns an instance of {@link Cursor} that should be used at the specified location. diff --git a/diylc/diylc-core/src/org/diylc/presenter/CalcUtils.java b/diylc/diylc-core/src/org/diylc/presenter/CalcUtils.java index 78e8904f..08740d4e 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/CalcUtils.java +++ b/diylc/diylc-core/src/org/diylc/presenter/CalcUtils.java @@ -33,7 +33,7 @@ public class CalcUtils { * @param x * @return */ - public static int roundToGrid(int x, Size gridSpacing) { + public static int roundToGrid(double x, Size gridSpacing) { double grid = gridSpacing.convertToPixels(); return (int) (Math.round(1f * x / grid) * grid); } diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index 2ce94c79..b7164021 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -26,10 +26,12 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.PathIterator; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -65,6 +67,7 @@ public class DrawingManager { private static final Logger LOG = Logger.getLogger(DrawingManager.class); public static int CONTROL_POINT_SIZE = 7; + public static double EXTRA_SPACE = 0.2; public static final String ZOOM_KEY = "zoom"; @@ -141,7 +144,7 @@ public class DrawingManager { } else { zoom = 1 / Constants.PIXEL_SIZE; } - + if (externalZoom != null) zoom *= externalZoom; @@ -171,7 +174,7 @@ public class DrawingManager { } // AffineTransform initialTx = g2d.getTransform(); - Dimension d = getCanvasDimensions(project, zoom, true); + Dimension d = getCanvasDimensions(project, zoom, drawOptions.contains(DrawOption.EXTRA_SPACE)); g2dWrapper.setColor(theme.getBgColor()); g2dWrapper.fillRect(0, 0, d.width, d.height); @@ -185,8 +188,8 @@ public class DrawingManager { g2d.setStroke(new BasicStroke(gridThickness, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] { (float) zoomStep / 2, (float) zoomStep / 2}, (float) zoomStep / 4)); } else if (gridType == GridType.DOT) { - g2d.setStroke(new BasicStroke(gridThickness, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] {1f, - (float) zoomStep - 1}, 0f)); + g2d.setStroke(new BasicStroke(gridThickness, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] { + 1f, (float) zoomStep - 1}, 0f)); } else { g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(gridThickness)); } @@ -199,11 +202,26 @@ public class DrawingManager { g2dWrapper.draw(new Line2D.Double(0, j, d.width - 1, j)); } } + + // manage extra space + double extraSpace = 0; + if (drawOptions.contains(DrawOption.EXTRA_SPACE)) { + Dimension dInner = getCanvasDimensions(project, zoom, false); + extraSpace = getExtraSpace(project) * zoom; + float borderThickness = (float) (3f * (zoom > 1 ? 1 : zoom)); + g2d.setStroke(ObjectCache.getInstance().fetchStroke(borderThickness, new float[] {borderThickness * 4, borderThickness * 4, }, 0, BasicStroke.CAP_BUTT)); + g2dWrapper.setColor(theme.getOutlineColor()); + g2d.draw(new Rectangle2D.Double(extraSpace, extraSpace, dInner.getWidth(), dInner.getHeight())); + // translate to the new (0, 0) + g2d.transform(AffineTransform.getTranslateInstance(extraSpace, extraSpace)); + } + + // apply zoom if (Math.abs(1.0 - zoom) > 1e-4) { g2dWrapper.scale(zoom, zoom); } - + // Composite mainComposite = g2d.getComposite(); // Composite alphaComposite = // AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); @@ -363,9 +381,9 @@ public class DrawingManager { g2d.draw(a); } } - - if (continuityArea != null && (ConfigurationManager.getInstance().readBoolean(IPlugInPort.HIGHLIGHT_CONTINUITY_AREA, false))) - { + + if (continuityArea != null + && (ConfigurationManager.getInstance().readBoolean(IPlugInPort.HIGHLIGHT_CONTINUITY_AREA, false))) { Composite oldComposite = g2d.getComposite(); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); g2d.setColor(Color.green); @@ -399,7 +417,7 @@ public class DrawingManager { componentAreaMap.clear(); lastDrawnStateMap.clear(); } - + public void clearContinuityArea() { this.continuityArea = null; } @@ -415,16 +433,26 @@ public class DrawingManager { return components; } - public Dimension getCanvasDimensions(Project project, Double zoomLevel, boolean useZoom) { + public double getExtraSpace(Project project) { double width = project.getWidth().convertToPixels(); double height = project.getHeight().convertToPixels(); - if (useZoom) { - width *= zoomLevel; - height *= zoomLevel; - } else { - width /= Constants.PIXEL_SIZE; - height /= Constants.PIXEL_SIZE; + double targetExtraSpace = EXTRA_SPACE * Math.max(width, height); + return CalcUtils.roundToGrid(targetExtraSpace, project.getGridSpacing()); + } + + public Dimension getCanvasDimensions(Project project, Double zoomLevel, boolean includeExtraSpace) { + double width = project.getWidth().convertToPixels(); + double height = project.getHeight().convertToPixels(); + + if (includeExtraSpace) { + double extraSpace = getExtraSpace(project); + width += 2 * extraSpace; + height += 2 * extraSpace; } + + width *= zoomLevel; + height *= zoomLevel; + return new Dimension((int) width, (int) height); } @@ -481,8 +509,8 @@ public class DrawingManager { List areas = new ArrayList(); for (int i = 0; i < preliminaryAreas.size(); i++) { Area a = preliminaryAreas.get(i); -// if (checkBreakout.get(i)) - areas.addAll(tryBreakout(a)); + // if (checkBreakout.get(i)) + areas.addAll(tryBreakout(a)); // else // areas.add(a); } diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 5ca0ccd4..b3edf3f6 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -250,8 +250,8 @@ public class Presenter implements IPlugInPort { } @Override - public Dimension getCanvasDimensions(boolean useZoom) { - return drawingManager.getCanvasDimensions(currentProject, drawingManager.getZoomLevel(), useZoom); + public Dimension getCanvasDimensions(boolean useZoom, boolean includeExtraSpace) { + return drawingManager.getCanvasDimensions(currentProject, useZoom ? drawingManager.getZoomLevel() : 1/ Constants.PIXEL_SIZE, includeExtraSpace); } @Override @@ -1182,8 +1182,10 @@ public class Presenter implements IPlugInPort { int actualDy = 0; // For each component, do a simulation of the move to see if any of // them will overlap or go out of bounds. - int width = (int) currentProject.getWidth().convertToPixels(); - int height = (int) currentProject.getHeight().convertToPixels(); + + boolean useExtraSpace = ConfigurationManager.getInstance().readBoolean(EXTRA_SPACE_KEY, true); + Dimension d = drawingManager.getCanvasDimensions(currentProject, 1d, useExtraSpace); + double extraSpace = useExtraSpace ? drawingManager.getExtraSpace(currentProject) : 0; if (controlPointMap.size() == 1) { Map.Entry, Set> entry = controlPointMap.entrySet().iterator().next(); @@ -1220,8 +1222,9 @@ public class Presenter implements IPlugInPort { // actually moved after snapping. if (entry.getValue().contains(index)) { controlPoints[index].translate(actualDx, actualDy); - if (controlPoints[index].x < 0 || controlPoints[index].y < 0 || controlPoints[index].x > width - || controlPoints[index].y > height) { + controlPoints[index].translate((int)extraSpace, (int)extraSpace); + if (controlPoints[index].x < 0 || controlPoints[index].y < 0 || controlPoints[index].x > d.width + || controlPoints[index].y > d.height) { // At least one control point went out of bounds. return null; } @@ -2424,8 +2427,14 @@ public class Presenter implements IPlugInPort { * @return */ private Point scalePoint(Point point) { - return point == null ? null : new Point((int) (point.x / drawingManager.getZoomLevel()), + Point p = point == null ? null : new Point((int) (point.x / drawingManager.getZoomLevel()), (int) (point.y / drawingManager.getZoomLevel())); + + if (p != null && ConfigurationManager.getInstance().readBoolean(EXTRA_SPACE_KEY, true)) { + double extraSpace = drawingManager.getExtraSpace(currentProject); + p.translate((int)(-extraSpace), (int)(-extraSpace)); + } + return p; } @SuppressWarnings("unchecked") diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 58b7bcfe..9cae64f9 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/DIYLCStarter.launch b/diylc/diylc-swing/DIYLCStarter.launch index 690fc5ab..38c8ab51 100644 --- a/diylc/diylc-swing/DIYLCStarter.launch +++ b/diylc/diylc-swing/DIYLCStarter.launch @@ -11,5 +11,5 @@ - + diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 58b7bcfe..9cae64f9 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 4159e36d..c62fc94e 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java b/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java index da856ffb..8385bd84 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java @@ -235,7 +235,7 @@ public class TemplateDialog extends JDialog { File file = (File) fileList.getSelectedValue(); if (file != null) { presenter.loadProjectFromFile(file.getAbsolutePath()); - Dimension dim = presenter.getCanvasDimensions(true); + Dimension dim = presenter.getCanvasDimensions(true, true); double xFactor = panelSize.getWidth() / dim.getWidth(); double yFactor = panelSize.getHeight() / dim.getHeight(); presenter.setZoomLevel(Math.min(xFactor, yFactor)); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index d4fc4f47..8305d1bc 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -67,7 +67,9 @@ public class CanvasPanel extends JComponent implements Autoscroll { private static final long serialVersionUID = 1L; - private static final Logger LOG = Logger.getLogger(CanvasPlugin.class); + private static final Logger LOG = Logger.getLogger(CanvasPlugin.class); + + public static boolean RENDER_VISIBLE_RECT_ONLY = true; private IPlugInPort plugInPort; @@ -208,12 +210,23 @@ public class CanvasPanel extends JComponent implements Autoscroll { this.plugInPort.mouseMoved(getMousePosition(), false, false, false); } - protected void createBufferImage() { + protected void createBufferImage() { + int imageWidth; + int imageHeight; + if (RENDER_VISIBLE_RECT_ONLY) { + Rectangle visibleRect = getVisibleRect(); + imageWidth = visibleRect.width; + imageHeight = visibleRect.height; + } else { + imageWidth = getWidth(); + imageHeight = getHeight(); + } + if (useHardwareAcceleration) { - bufferImage = screenGraphicsConfiguration.createCompatibleVolatileImage(getWidth(), getHeight()); + bufferImage = screenGraphicsConfiguration.createCompatibleVolatileImage(imageWidth, imageHeight); ((VolatileImage) bufferImage).validate(screenGraphicsConfiguration); } else { - bufferImage = createImage(getWidth(), getHeight()); + bufferImage = createImage(imageWidth, imageHeight); } } @@ -225,8 +238,21 @@ public class CanvasPanel extends JComponent implements Autoscroll { if (bufferImage == null) { createBufferImage(); } - Graphics2D g2d = (Graphics2D) bufferImage.getGraphics(); - g2d.setClip(getVisibleRect()); + Graphics2D g2d = (Graphics2D) bufferImage.getGraphics(); + + Rectangle visibleRect = getVisibleRect(); + + int x = 0; + int y = 0; + + if (RENDER_VISIBLE_RECT_ONLY) { + x = visibleRect.x; + y = visibleRect.y; + g2d.translate(-x, -y); + } else { + g2d.setClip(visibleRect); + } + Set drawOptions = EnumSet.of(DrawOption.SELECTION, DrawOption.ZOOM, DrawOption.CONTROL_POINTS); if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.ANTI_ALIASING_KEY, true)) { drawOptions.add(DrawOption.ANTIALIASING); @@ -236,8 +262,13 @@ public class CanvasPanel extends JComponent implements Autoscroll { } if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.SHOW_GRID_KEY, true)) { drawOptions.add(DrawOption.GRID); + } + if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.EXTRA_SPACE_KEY, true)) { + drawOptions.add(DrawOption.EXTRA_SPACE); } - plugInPort.draw(g2d, drawOptions, null, null); + + plugInPort.draw(g2d, drawOptions, null, null); + if (useHardwareAcceleration) { VolatileImage volatileImage = (VolatileImage) bufferImage; do { @@ -250,13 +281,13 @@ public class CanvasPanel extends JComponent implements Autoscroll { // if (validation == VolatileImage.IMAGE_INCOMPATIBLE) { // createBufferImage(); // } - g.drawImage(bufferImage, 0, 0, this); + g.drawImage(bufferImage, x, y, this); } catch (NullPointerException e) { createBufferImage(); } } while (volatileImage == null || volatileImage.contentsLost()); } else { - g.drawImage(bufferImage, 0, 0, this); + g.drawImage(bufferImage, x, y, this); // bufferImage.flush(); } g2d.dispose(); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java index 6b5501da..227e7ecf 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java @@ -26,6 +26,8 @@ import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; @@ -106,7 +108,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { private Clipboard clipboard; private double zoomLevel = 1; - + public CanvasPlugin(ISwingUI swingUI) { @@ -125,6 +127,27 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { getScrollPane().setRulerVisible(ConfigurationManager.getInstance().readBoolean(IPlugInPort.SHOW_RULERS_KEY, true)); + // revalidate canvas on scrolling when we render visible rect only + if (CanvasPanel.RENDER_VISIBLE_RECT_ONLY) { + getScrollPane().getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { + + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + getCanvasPanel().invalidateCache(); + getCanvasPanel().revalidate(); + } + }); + + getScrollPane().getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { + + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + getCanvasPanel().invalidateCache(); + getCanvasPanel().revalidate(); + } + }); + } + ConfigurationManager.getInstance().addConfigListener(IPlugInPort.SHOW_RULERS_KEY, new IConfigListener() { @Override @@ -133,30 +156,44 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { getScrollPane().setRulerVisible((Boolean) value); } }); - + ConfigurationManager.getInstance().addConfigListener(IPlugInPort.HARDWARE_ACCELERATION, new IConfigListener() { - + @Override public void valueChanged(String key, Object value) { canvasPanel.setUseHardwareAcceleration((Boolean) value); scrollPane.setUseHardwareAcceleration((Boolean) value); } }); + + ConfigurationManager.getInstance().addConfigListener(IPlugInPort.EXTRA_SPACE_KEY, new IConfigListener() { + + @Override + public void valueChanged(String key, Object value) { + refreshSize(); + // Scroll to the center. + Rectangle visibleRect = canvasPanel.getVisibleRect(); + visibleRect.setLocation((canvasPanel.getWidth() - visibleRect.width) / 2, + (canvasPanel.getHeight() - visibleRect.height) / 2); + canvasPanel.scrollRectToVisible(visibleRect); + canvasPanel.revalidate(); + } + }); } public CanvasPanel getCanvasPanel() { if (canvasPanel == null) { canvasPanel = new CanvasPanel(plugInPort); canvasPanel.addMouseListener(new MouseAdapter() { - + private MouseEvent pressedEvent; - + @Override public void mouseClicked(MouseEvent e) { if (scrollPane.isMouseScrollMode() || e.getButton() == MouseEvent.BUTTON2) return; - plugInPort.mouseClicked(e.getPoint(), e.getButton(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown(), - e.getClickCount()); + plugInPort.mouseClicked(e.getPoint(), e.getButton(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), + e.isShiftDown(), e.isAltDown(), e.getClickCount()); } @Override @@ -174,7 +211,8 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { @Override public void run() { - if (plugInPort.getNewComponentTypeSlot() == null && (e.isPopupTrigger() || (pressedEvent != null && pressedEvent.isPopupTrigger()))) { + if (plugInPort.getNewComponentTypeSlot() == null + && (e.isPopupTrigger() || (pressedEvent != null && pressedEvent.isPopupTrigger()))) { // Enable actions. boolean enabled = !plugInPort.getSelectedComponents().isEmpty(); getCutAction().setEnabled(enabled); @@ -214,7 +252,8 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { @Override public void keyPressed(KeyEvent e) { - if (plugInPort.keyPressed(e.getKeyCode(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown())) { + if (plugInPort.keyPressed(e.getKeyCode(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), + e.isShiftDown(), e.isAltDown())) { e.consume(); } } @@ -227,7 +266,8 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { if (scrollPane.isMouseScrollMode()) return; canvasPanel.setCursor(plugInPort.getCursorAt(e.getPoint())); - plugInPort.mouseMoved(e.getPoint(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown()); + plugInPort.mouseMoved(e.getPoint(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), + e.isAltDown()); } }); } @@ -237,11 +277,12 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { private RulerScrollPane getScrollPane() { if (scrollPane == null) { scrollPane = - new RulerScrollPane(getCanvasPanel(), new ProjectDrawingProvider(plugInPort, true, false), new Size(1d, + new RulerScrollPane(getCanvasPanel(), new ProjectDrawingProvider(plugInPort, true, false, true), new Size(1d, SizeUnit.cm).convertToPixels(), new Size(1d, SizeUnit.in).convertToPixels()); boolean metric = ConfigurationManager.getInstance().readBoolean(Presenter.METRIC_KEY, true); - - boolean useHardwareAcceleration = ConfigurationManager.getInstance().readBoolean(IPlugInPort.HARDWARE_ACCELERATION, false); + + boolean useHardwareAcceleration = + ConfigurationManager.getInstance().readBoolean(IPlugInPort.HARDWARE_ACCELERATION, false); scrollPane.setUseHardwareAcceleration(useHardwareAcceleration); scrollPane.setMetric(metric); @@ -655,7 +696,9 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { } private void refreshSize() { - Dimension d = plugInPort.getCanvasDimensions(true); + Dimension d = + plugInPort.getCanvasDimensions(true, + ConfigurationManager.getInstance().readBoolean(IPlugInPort.EXTRA_SPACE_KEY, true)); canvasPanel.setSize(d); canvasPanel.setPreferredSize(d); getScrollPane().setZoomLevel(plugInPort.getZoomLevel()); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java index a91c8a53..f2786e5c 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java @@ -216,7 +216,7 @@ public class UploadDialog extends ButtonDialog { } private Dimension getThumbnailSize() { - Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false); + Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false, false); if (d.height > d.width) return new Dimension(192 * d.width / d.height, 192); else @@ -304,7 +304,7 @@ public class UploadDialog extends ButtonDialog { private void paintThumbnail(Graphics g, Rectangle rect) { Graphics2D g2d = (Graphics2D) g; - Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false); + Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false, false); g2d.setColor(Color.white); g2d.fill(rect); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java index ba3e8724..29d5b40f 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java @@ -75,6 +75,9 @@ public class ConfigPlugin implements IPlugIn { swingUI.injectMenuAction( ActionFactory.getInstance().createConfigAction(plugInPort, "Export Grid", IPlugInPort.EXPORT_GRID_KEY, false), CONFIG_MENU); + swingUI.injectMenuAction( + ActionFactory.getInstance().createConfigAction(plugInPort, "Extra Working Area", IPlugInPort.EXTRA_SPACE_KEY, true), + CONFIG_MENU); swingUI.injectMenuAction( ActionFactory.getInstance().createConfigAction(plugInPort, "Hardware Acceleration", IPlugInPort.HARDWARE_ACCELERATION, false), CONFIG_MENU); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java index b30d7643..4480d4cc 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileMenuPlugin.java @@ -62,7 +62,7 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler { @Override public void connect(IPlugInPort plugInPort) { this.plugInPort = plugInPort; - this.drawingProvider = new ProjectDrawingProvider(plugInPort, false, true); + this.drawingProvider = new ProjectDrawingProvider(plugInPort, false, true, false); this.traceMaskDrawingProvider = new TraceMaskDrawingProvider(plugInPort); ActionFactory actionFactory = ActionFactory.getInstance(); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java index 8959e7be..8b13dfc5 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java @@ -41,18 +41,20 @@ public class ProjectDrawingProvider implements IDrawingProvider { private IPlugInPort plugInPort; private boolean useZoom; - private boolean showGridWhenNeeded; + private boolean showGridWhenNeeded; + private boolean includeExtraSpace; - public ProjectDrawingProvider(IPlugInPort plugInPort, boolean useZoom, boolean showGridWhenNeeded) { + public ProjectDrawingProvider(IPlugInPort plugInPort, boolean useZoom, boolean showGridWhenNeeded, boolean includeExtraSpace) { super(); this.plugInPort = plugInPort; this.useZoom = useZoom; - this.showGridWhenNeeded = showGridWhenNeeded; + this.showGridWhenNeeded = showGridWhenNeeded; + this.includeExtraSpace = includeExtraSpace; } @Override public Dimension getSize() { - return plugInPort.getCanvasDimensions(useZoom); + return plugInPort.getCanvasDimensions(useZoom, includeExtraSpace); } @Override @@ -66,6 +68,9 @@ public class ProjectDrawingProvider implements IDrawingProvider { } if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.OUTLINE_KEY, false)) { drawOptions.add(DrawOption.OUTLINE_MODE); + } + if (includeExtraSpace) { + drawOptions.add(DrawOption.EXTRA_SPACE); } plugInPort.draw((Graphics2D) g, drawOptions, null, zoomFactor); } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java index ad8ce808..59bcce40 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java @@ -127,7 +127,7 @@ public class ProjectPreview extends JPanel implements PropertyChangeListener, IF super.paint(g); Graphics2D g2d = (Graphics2D) g; - Dimension d = presenter.getCanvasDimensions(false); + Dimension d = presenter.getCanvasDimensions(false, false); // System.out.println(d); Rectangle rect = getBounds(); // System.out.println(rect); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java index 77436da2..aff3561c 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java @@ -55,7 +55,7 @@ public class TraceMaskDrawingProvider implements IDrawingProvider { @Override public Dimension getSize() { - return plugInPort.getCanvasDimensions(false); + return plugInPort.getCanvasDimensions(false, false); } @Override diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 9d8fe49b..b4298999 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2393,7 +2393,15 @@ 2019-02-03 00:00:00.000 CET - + + + NEW_FEATURE + Added extra work space around the layout that can be used to store additional components and helpers, but does not get exported to a file. Configurable from the menu + + + IMPROVEMENT + Vast improvement of rendering performance, especially with large layouts + IMPROVEMENT Create a backup of config file when there is an issue with loading (for example running two DIYLC versions on the same machine) to avoid data loss