Author: nick Date: Wed Jul 22 00:04:59 2015 New Revision: 1692211 URL: http://svn.apache.org/r1692211 Log: Allow creating of an empty Themes Table on request
Modified: poi/trunk/.settings/org.eclipse.jdt.ui.prefs poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/model/TestThemesTable.java Modified: poi/trunk/.settings/org.eclipse.jdt.ui.prefs URL: http://svn.apache.org/viewvc/poi/trunk/.settings/org.eclipse.jdt.ui.prefs?rev=1692211&r1=1692210&r2=1692211&view=diff ============================================================================== --- poi/trunk/.settings/org.eclipse.jdt.ui.prefs (original) +++ poi/trunk/.settings/org.eclipse.jdt.ui.prefs Wed Jul 22 00:04:59 2015 @@ -67,7 +67,7 @@ org.eclipse.jdt.ui.ignorelowercasenames= org.eclipse.jdt.ui.importorder=java;javax;org;com; org.eclipse.jdt.ui.javadoc=false org.eclipse.jdt.ui.keywordthis=false -org.eclipse.jdt.ui.ondemandthreshold=10 +org.eclipse.jdt.ui.ondemandthreshold=20 org.eclipse.jdt.ui.overrideannotation=false org.eclipse.jdt.ui.staticondemandthreshold=10 org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_co ntext" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/* \=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\n Licensed to the Apache Software Foundation (ASF) under one or more\n contributor license agreements. See the NOTICE file distributed with\n this work for additional information regarding copyright ownership.\n The ASF licenses this file to You under the Apache License, Version 2.0\n (the "License"); you may not use this file except in compliance with\n the License. You may obtain a copy of the License at\n\n http\://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an "AS IS" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or impli ed.\n See the License for the specific language governing permissions and\n limitations under the License.\n\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\= */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n *\n * ${tags}\n */</templat e><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.j dt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated cat ch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates> Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java?rev=1692211&r1=1692210&r2=1692211&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java Wed Jul 22 00:04:59 2015 @@ -35,7 +35,10 @@ import org.apache.poi.ss.usermodel.Built import org.apache.poi.ss.usermodel.FontFamily; import org.apache.poi.ss.usermodel.FontScheme; import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFFactory; import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFRelation; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; import org.apache.xmlbeans.XmlException; @@ -57,7 +60,6 @@ import org.openxmlformats.schemas.spread import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType; import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument; - /** * Table of styles shared across all sheets in a workbook. */ @@ -79,6 +81,7 @@ public class StylesTable extends POIXMLD private static final int MAXIMUM_STYLE_ID = SpreadsheetVersion.EXCEL2007.getMaxCellStyles(); private StyleSheetDocument doc; + private XSSFWorkbook workbook; private ThemesTable theme; /** @@ -96,7 +99,17 @@ public class StylesTable extends POIXMLD super(part, rel); readFrom(part.getInputStream()); } + + public void setWorkbook(XSSFWorkbook wb) { + this.workbook = wb; + } + /** + * Get the current Workbook's theme table, or null if the + * Workbook lacks any themes. + * <p>Use {@link #ensureThemesTable()} to have a themes table + * created if needed + */ public ThemesTable getTheme() { return theme; } @@ -113,6 +126,17 @@ public class StylesTable extends POIXMLD border.setThemesTable(theme); } } + + /** + * If there isn't currently a {@link ThemesTable} for the + * current Workbook, then creates one and sets it up. + * After this, calls to {@link #getTheme()} won't give null + */ + public void ensureThemesTable() { + if (theme != null) return; + + theme = (ThemesTable)workbook.createRelationship(XSSFRelation.THEME, XSSFFactory.getInstance()); + } /** * Read this shared styles table from an XML file. Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java?rev=1692211&r1=1692210&r2=1692211&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java Wed Jul 22 00:04:59 2015 @@ -17,12 +17,14 @@ package org.apache.poi.xssf.model; import java.io.IOException; +import java.io.OutputStream; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.drawingml.x2006.main.CTColor; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorScheme; import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument; @@ -35,6 +37,15 @@ public class ThemesTable extends POIXMLD private ThemeDocument theme; /** + * Create a new, empty ThemesTable + */ + public ThemesTable() { + super(); + theme = ThemeDocument.Factory.newInstance(); + theme.addNewTheme().addNewThemeElements(); + } + + /** * Construct a ThemesTable. * @param part A PackagePart. * @param rel A PackageRelationship. @@ -120,4 +131,24 @@ public class ThemesTable extends POIXMLD // All done } + + /** + * Write this table out as XML. + * + * @param out The stream to write to. + * @throws IOException if an error occurs while writing. + */ + public void writeTo(OutputStream out) throws IOException { + XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS); + + theme.save(out, options); + } + + @Override + protected void commit() throws IOException { + PackagePart part = getPackagePart(); + OutputStream out = part.getOutputStream(); + writeTo(out); + out.close(); + } } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=1692211&r1=1692210&r2=1692211&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Wed Jul 22 00:04:59 2015 @@ -153,8 +153,6 @@ public class XSSFWorkbook extends POIXML */ private StylesTable stylesSource; - private ThemesTable theme; - /** * The locator of user-defined functions. * By default includes functions from the Excel Analysis Toolpack @@ -337,6 +335,7 @@ public class XSSFWorkbook extends POIXML WorkbookDocument doc = WorkbookDocument.Factory.parse(getPackagePart().getInputStream()); this.workbook = doc.getWorkbook(); + ThemesTable theme = null; Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>(); Map<String, ExternalLinksTable> elIdMap = new HashMap<String, ExternalLinksTable>(); for(POIXMLDocumentPart p : getRelations()){ @@ -362,6 +361,7 @@ public class XSSFWorkbook extends POIXML stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, XSSFFactory.getInstance()); } } + stylesSource.setWorkbook(this); stylesSource.setTheme(theme); if (sharedStringSource == null) { @@ -428,6 +428,7 @@ public class XSSFWorkbook extends POIXML sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, XSSFFactory.getInstance()); stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, XSSFFactory.getInstance()); + stylesSource.setWorkbook(this); namedRanges = new ArrayList<XSSFName>(); sheets = new ArrayList<XSSFSheet>(); @@ -1578,7 +1579,8 @@ public class XSSFWorkbook extends POIXML * Returns the Theme of current workbook. */ public ThemesTable getTheme() { - return theme; + if (stylesSource == null) return null; + return stylesSource.getTheme(); } /** Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/model/TestThemesTable.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/model/TestThemesTable.java?rev=1692211&r1=1692210&r2=1692211&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/model/TestThemesTable.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/model/TestThemesTable.java Wed Jul 22 00:04:59 2015 @@ -18,6 +18,7 @@ package org.apache.poi.xssf.model; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.FileOutputStream; @@ -29,6 +30,7 @@ import org.apache.poi.xssf.usermodel.XSS import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.Test; @@ -75,4 +77,24 @@ public class TestThemesTable { fos.close(); } } + + @Test + public void testAddNew() throws Exception { + XSSFWorkbook wb = new XSSFWorkbook(); + XSSFSheet s = wb.createSheet(); + assertEquals(null, wb.getTheme()); + + StylesTable styles = wb.getStylesSource(); + assertEquals(null, styles.getTheme()); + + styles.ensureThemesTable(); + + assertNotNull(styles.getTheme()); + assertNotNull(wb.getTheme()); + + wb = XSSFTestDataSamples.writeOutAndReadBack(wb); + styles = wb.getStylesSource(); + assertNotNull(styles.getTheme()); + assertNotNull(wb.getTheme()); + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org