diff --git a/umlet-elements/src/main/java/com/baselet/element/facet/PropertiesParserState.java b/umlet-elements/src/main/java/com/baselet/element/facet/PropertiesParserState.java index f6c65a519..7bbec81ff 100644 --- a/umlet-elements/src/main/java/com/baselet/element/facet/PropertiesParserState.java +++ b/umlet-elements/src/main/java/com/baselet/element/facet/PropertiesParserState.java @@ -29,6 +29,7 @@ public class PropertiesParserState { private StickingPolygonGenerator stickingPolygonGenerator = SimpleStickingPolygonGenerator.INSTANCE; private double totalTextBlockHeight; private final Map, Object> facetResponse = new HashMap, Object>(); + private String page; public PropertiesParserState(Settings settings, DrawHandler drawer) { this.settings = settings; @@ -46,6 +47,7 @@ public void resetValues(Dimension gridElementSize, double totalTextBlockHeight, this.totalTextBlockHeight = totalTextBlockHeight; facetResponse.clear(); drawer.setEnableDrawing(enableDrawing); + page = ""; } public Alignment getAlignment() { @@ -152,4 +154,12 @@ public void setDrawer(DrawHandler drawer) { this.drawer = drawer; } + public void setPage(String page) { + this.page = page; + } + + public String getPage() { + return page; + } + } diff --git a/umlet-elements/src/main/java/com/baselet/element/facet/Settings.java b/umlet-elements/src/main/java/com/baselet/element/facet/Settings.java index 83fb81637..e3dce7c36 100644 --- a/umlet-elements/src/main/java/com/baselet/element/facet/Settings.java +++ b/umlet-elements/src/main/java/com/baselet/element/facet/Settings.java @@ -21,6 +21,7 @@ import com.baselet.element.facet.common.LayerFacet; import com.baselet.element.facet.common.LineTypeFacet; import com.baselet.element.facet.common.LineWidthFacet; +import com.baselet.element.facet.common.PageFacet; import com.baselet.element.facet.common.SeparatorLineFacet; import com.baselet.element.facet.common.TextPrintFacet; import com.baselet.element.facet.common.TransparencyFacet; @@ -39,7 +40,7 @@ */ public abstract class Settings { // the following lists are default facet configurations. they are declared here as a simple overview and for easy reuse - protected static final List BASE = listOf(BackgroundColorFacet.INSTANCE, TransparencyFacet.INSTANCE, ForegroundColorFacet.INSTANCE, LayerFacet.INSTANCE, LineWidthFacet.INSTANCE, GroupFacet.INSTANCE, CommentFacet.INSTANCE); + protected static final List BASE = listOf(BackgroundColorFacet.INSTANCE, TransparencyFacet.INSTANCE, ForegroundColorFacet.INSTANCE, LayerFacet.INSTANCE, LineWidthFacet.INSTANCE, GroupFacet.INSTANCE, CommentFacet.INSTANCE, PageFacet.INSTANCE); protected static final List BASE_WITH_LINETYPE = listOf(BASE, LineTypeFacet.INSTANCE, CustomDrawingFacet.INSTANCE, AdvancedDrawingsFacet.INSTANCE); protected static final List BASE_EXTENDED = listOf(BASE_WITH_LINETYPE, TextPrintFacet.INSTANCE, FontSizeFacet.INSTANCE); diff --git a/umlet-elements/src/main/java/com/baselet/element/facet/common/PageFacet.java b/umlet-elements/src/main/java/com/baselet/element/facet/common/PageFacet.java new file mode 100644 index 000000000..2fe0ff366 --- /dev/null +++ b/umlet-elements/src/main/java/com/baselet/element/facet/common/PageFacet.java @@ -0,0 +1,33 @@ +package com.baselet.element.facet.common; + +import com.baselet.diagram.draw.helper.StyleException; +import com.baselet.element.facet.FirstRunKeyValueFacet; +import com.baselet.element.facet.PropertiesParserState; + +public class PageFacet extends FirstRunKeyValueFacet { + + public static final PageFacet INSTANCE = new PageFacet(); + + private PageFacet() { + } + + public static final String KEY = "page"; + public static final String DEFAULT_VALUE = ""; + + @Override + public KeyValue getKeyValue() { + return new KeyValue(KEY, false, DEFAULT_VALUE.toString(), "Page frame to print"); + } + + @Override + public void handleValue(String value, PropertiesParserState state) { + if (value.matches("\\S+")) { + state.setPage(value); + } + else { + throw new StyleException("page identifier must be text w/o whitespaces"); + } + + } + +} diff --git a/umlet-swing/src/main/java/com/baselet/diagram/DrawPanel.java b/umlet-swing/src/main/java/com/baselet/diagram/DrawPanel.java index 6c672d3c1..9bf91f058 100644 --- a/umlet-swing/src/main/java/com/baselet/diagram/DrawPanel.java +++ b/umlet-swing/src/main/java/com/baselet/diagram/DrawPanel.java @@ -190,6 +190,34 @@ public List getGridElements() { return gridElements; } + public List getPages() { + List pages = new ArrayList(); + + // Search for pages + for (GridElement e : getGridElements()) { + if (null != e.getSetting("page")) { + pages.add(e); + } + } + + return pages; + } + + public List getPageElements(GridElement page) { + + List pageElements = new ArrayList(); + pageElements.add(page); + + // Identify the elements per page + Rectangle pageArea = page.getRectangle(); + for (GridElement e : getGridElements()) { + if (e.isInRange(pageArea)) { + pageElements.add(e); + } + } + return pageElements; + } + public List getOldRelations() { return getHelper(Relation.class); } diff --git a/umlet-swing/src/main/java/com/baselet/diagram/io/OutputHandler.java b/umlet-swing/src/main/java/com/baselet/diagram/io/OutputHandler.java index 366610a03..19e32c319 100644 --- a/umlet-swing/src/main/java/com/baselet/diagram/io/OutputHandler.java +++ b/umlet-swing/src/main/java/com/baselet/diagram/io/OutputHandler.java @@ -48,12 +48,14 @@ public class OutputHandler { - private OutputHandler() {} // private constructor to avoid instantiation + private OutputHandler() { + } // private constructor to avoid instantiation public static void createAndOutputToFile(String extension, File file, DiagramHandler handler) throws Exception { OutputStream ostream = new FileOutputStream(file); createToStream(extension, ostream, handler); ostream.close(); + createToStreamForPages(extension, file, handler); } public static void createToStream(String extension, OutputStream ostream, DiagramHandler handler) throws Exception { @@ -63,7 +65,8 @@ public static void createToStream(String extension, OutputStream ostream, Diagra // if some GridElements are selected, only export them Collection elementsToDraw = handler.getDrawPanel().getSelector().getSelectedElements(); - // if nothing is selected, draw everything + + // if no page frame is defined, draw everything if (elementsToDraw.isEmpty()) { elementsToDraw = handler.getDrawPanel().getGridElements(); } @@ -73,6 +76,29 @@ public static void createToStream(String extension, OutputStream ostream, Diagra handler.setGridAndZoom(oldZoom, false); // Zoom back to the oldGridsize after execution } + private static void createToStreamForPages(String extension, File file, DiagramHandler handler) throws Exception { + + // Skip export of pages if something is selected + if (!handler.getDrawPanel().getSelector().getSelectedElements().isEmpty()) { + return; + } + + int oldZoom = handler.getGridSize(); + handler.setGridAndZoom(Constants.DEFAULTGRIDSIZE, false); // Zoom to the defaultGridsize before execution + + // File without extension + String filenameWholeExport = file.getAbsolutePath().replaceFirst("[.][^.]+$", ""); + + for (GridElement page : handler.getDrawPanel().getPages()) { + OutputStream ostream = new FileOutputStream(new File(filenameWholeExport + "_" + page.getSetting("page") + "." + extension)); + Collection elementsToDraw = handler.getDrawPanel().getPageElements(page); + OutputHandler.exportToOutputStream(extension, ostream, elementsToDraw, handler.getFontHandler()); + ostream.close(); + } + + handler.setGridAndZoom(oldZoom, false); // Zoom back to the oldGridsize after execution + } + private static void exportToOutputStream(String extension, OutputStream ostream, Collection entities, FontHandler diagramFont) throws IOException { for (GridElement ge : entities) { ge.getDeprecatedAddons().doBeforeExport();