1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski package com.sun.star.report.pentaho.output.text;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.OfficeNamespaces;
26*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.OfficeMasterPage;
27*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.OfficeMasterStyles;
28*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.OfficeStyles;
29*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.PageLayout;
30*b1cdbd2cSJim Jagielski import com.sun.star.report.pentaho.model.RawText;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski import java.util.HashMap;
33*b1cdbd2cSJim Jagielski import java.util.Map;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski import org.jfree.layouting.input.style.values.CSSNumericValue;
36*b1cdbd2cSJim Jagielski import org.jfree.report.ReportProcessingException;
37*b1cdbd2cSJim Jagielski import org.jfree.report.structure.Element;
38*b1cdbd2cSJim Jagielski import org.jfree.report.structure.Section;
39*b1cdbd2cSJim Jagielski import org.jfree.report.util.AttributeNameGenerator;
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski /**
43*b1cdbd2cSJim Jagielski  * Todo: Document me!
44*b1cdbd2cSJim Jagielski  *
45*b1cdbd2cSJim Jagielski  * @author Thomas Morgner
46*b1cdbd2cSJim Jagielski  * @since 14.03.2007
47*b1cdbd2cSJim Jagielski  */
48*b1cdbd2cSJim Jagielski public class MasterPageFactory
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski     private static class MasterPageFactoryKey
52*b1cdbd2cSJim Jagielski     {
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski         private final String template;
55*b1cdbd2cSJim Jagielski         private final String pageHeader;
56*b1cdbd2cSJim Jagielski         private final String pageFooter;
57*b1cdbd2cSJim Jagielski 
MasterPageFactoryKey(final String template, final String pageHeader, final String pageFooter)58*b1cdbd2cSJim Jagielski         public MasterPageFactoryKey(final String template,
59*b1cdbd2cSJim Jagielski                 final String pageHeader,
60*b1cdbd2cSJim Jagielski                 final String pageFooter)
61*b1cdbd2cSJim Jagielski         {
62*b1cdbd2cSJim Jagielski             this.template = template;
63*b1cdbd2cSJim Jagielski             this.pageHeader = pageHeader;
64*b1cdbd2cSJim Jagielski             this.pageFooter = pageFooter;
65*b1cdbd2cSJim Jagielski         }
66*b1cdbd2cSJim Jagielski 
equals(final Object o)67*b1cdbd2cSJim Jagielski         public boolean equals(final Object o)
68*b1cdbd2cSJim Jagielski         {
69*b1cdbd2cSJim Jagielski             if (this != o)
70*b1cdbd2cSJim Jagielski             {
71*b1cdbd2cSJim Jagielski                 if (o == null || getClass() != o.getClass())
72*b1cdbd2cSJim Jagielski                 {
73*b1cdbd2cSJim Jagielski                     return false;
74*b1cdbd2cSJim Jagielski                 }
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski                 final MasterPageFactoryKey that = (MasterPageFactoryKey) o;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski                 if (pageFooter != null ? !pageFooter.equals(
79*b1cdbd2cSJim Jagielski                         that.pageFooter) : that.pageFooter != null)
80*b1cdbd2cSJim Jagielski                 {
81*b1cdbd2cSJim Jagielski                     return false;
82*b1cdbd2cSJim Jagielski                 }
83*b1cdbd2cSJim Jagielski                 if (pageHeader != null ? !pageHeader.equals(
84*b1cdbd2cSJim Jagielski                         that.pageHeader) : that.pageHeader != null)
85*b1cdbd2cSJim Jagielski                 {
86*b1cdbd2cSJim Jagielski                     return false;
87*b1cdbd2cSJim Jagielski                 }
88*b1cdbd2cSJim Jagielski                 if (template != null ? !template.equals(
89*b1cdbd2cSJim Jagielski                         that.template) : that.template != null)
90*b1cdbd2cSJim Jagielski                 {
91*b1cdbd2cSJim Jagielski                     return false;
92*b1cdbd2cSJim Jagielski                 }
93*b1cdbd2cSJim Jagielski             }
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski             return true;
96*b1cdbd2cSJim Jagielski         }
97*b1cdbd2cSJim Jagielski 
hashCode()98*b1cdbd2cSJim Jagielski         public int hashCode()
99*b1cdbd2cSJim Jagielski         {
100*b1cdbd2cSJim Jagielski             int result = (template != null ? template.hashCode() : 0);
101*b1cdbd2cSJim Jagielski             result = 31 * result + (pageHeader != null ? pageHeader.hashCode() : 0);
102*b1cdbd2cSJim Jagielski             result = 31 * result + (pageFooter != null ? pageFooter.hashCode() : 0);
103*b1cdbd2cSJim Jagielski             return result;
104*b1cdbd2cSJim Jagielski         }
105*b1cdbd2cSJim Jagielski 
getTemplate()106*b1cdbd2cSJim Jagielski         public String getTemplate()
107*b1cdbd2cSJim Jagielski         {
108*b1cdbd2cSJim Jagielski             return template;
109*b1cdbd2cSJim Jagielski         }
110*b1cdbd2cSJim Jagielski 
getPageHeader()111*b1cdbd2cSJim Jagielski         public String getPageHeader()
112*b1cdbd2cSJim Jagielski         {
113*b1cdbd2cSJim Jagielski             return pageHeader;
114*b1cdbd2cSJim Jagielski         }
115*b1cdbd2cSJim Jagielski 
getPageFooter()116*b1cdbd2cSJim Jagielski         public String getPageFooter()
117*b1cdbd2cSJim Jagielski         {
118*b1cdbd2cSJim Jagielski             return pageFooter;
119*b1cdbd2cSJim Jagielski         }
120*b1cdbd2cSJim Jagielski     }
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     private static class PageLayoutKey
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         private final String templateName;
126*b1cdbd2cSJim Jagielski         private final CSSNumericValue headerHeight;
127*b1cdbd2cSJim Jagielski         private final CSSNumericValue footerHeight;
128*b1cdbd2cSJim Jagielski 
PageLayoutKey(final String templateName, final CSSNumericValue headerHeight, final CSSNumericValue footerHeight)129*b1cdbd2cSJim Jagielski         public PageLayoutKey(final String templateName,
130*b1cdbd2cSJim Jagielski                 final CSSNumericValue headerHeight,
131*b1cdbd2cSJim Jagielski                 final CSSNumericValue footerHeight)
132*b1cdbd2cSJim Jagielski         {
133*b1cdbd2cSJim Jagielski             this.templateName = templateName;
134*b1cdbd2cSJim Jagielski             this.headerHeight = headerHeight;
135*b1cdbd2cSJim Jagielski             this.footerHeight = footerHeight;
136*b1cdbd2cSJim Jagielski         }
137*b1cdbd2cSJim Jagielski 
getTemplateName()138*b1cdbd2cSJim Jagielski         public String getTemplateName()
139*b1cdbd2cSJim Jagielski         {
140*b1cdbd2cSJim Jagielski             return templateName;
141*b1cdbd2cSJim Jagielski         }
142*b1cdbd2cSJim Jagielski 
getHeaderHeight()143*b1cdbd2cSJim Jagielski         public CSSNumericValue getHeaderHeight()
144*b1cdbd2cSJim Jagielski         {
145*b1cdbd2cSJim Jagielski             return headerHeight;
146*b1cdbd2cSJim Jagielski         }
147*b1cdbd2cSJim Jagielski 
getFooterHeight()148*b1cdbd2cSJim Jagielski         public CSSNumericValue getFooterHeight()
149*b1cdbd2cSJim Jagielski         {
150*b1cdbd2cSJim Jagielski             return footerHeight;
151*b1cdbd2cSJim Jagielski         }
152*b1cdbd2cSJim Jagielski 
equals(final Object o)153*b1cdbd2cSJim Jagielski         public boolean equals(final Object o)
154*b1cdbd2cSJim Jagielski         {
155*b1cdbd2cSJim Jagielski             if (this == o)
156*b1cdbd2cSJim Jagielski             {
157*b1cdbd2cSJim Jagielski                 return true;
158*b1cdbd2cSJim Jagielski             }
159*b1cdbd2cSJim Jagielski             if (o == null || getClass() != o.getClass())
160*b1cdbd2cSJim Jagielski             {
161*b1cdbd2cSJim Jagielski                 return false;
162*b1cdbd2cSJim Jagielski             }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski             final PageLayoutKey key = (PageLayoutKey) o;
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski             if (footerHeight != null ? !footerHeight.equals(
167*b1cdbd2cSJim Jagielski                     key.footerHeight) : key.footerHeight != null)
168*b1cdbd2cSJim Jagielski             {
169*b1cdbd2cSJim Jagielski                 return false;
170*b1cdbd2cSJim Jagielski             }
171*b1cdbd2cSJim Jagielski             if (headerHeight != null ? !headerHeight.equals(
172*b1cdbd2cSJim Jagielski                     key.headerHeight) : key.headerHeight != null)
173*b1cdbd2cSJim Jagielski             {
174*b1cdbd2cSJim Jagielski                 return false;
175*b1cdbd2cSJim Jagielski             }
176*b1cdbd2cSJim Jagielski             return !(templateName != null ? !templateName.equals(
177*b1cdbd2cSJim Jagielski                     key.templateName) : key.templateName != null);
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski         }
180*b1cdbd2cSJim Jagielski 
hashCode()181*b1cdbd2cSJim Jagielski         public int hashCode()
182*b1cdbd2cSJim Jagielski         {
183*b1cdbd2cSJim Jagielski             int result;
184*b1cdbd2cSJim Jagielski             result = (templateName != null ? templateName.hashCode() : 0);
185*b1cdbd2cSJim Jagielski             result = 31 * result + (headerHeight != null ? headerHeight.hashCode() : 0);
186*b1cdbd2cSJim Jagielski             result = 31 * result + (footerHeight != null ? footerHeight.hashCode() : 0);
187*b1cdbd2cSJim Jagielski             return result;
188*b1cdbd2cSJim Jagielski         }
189*b1cdbd2cSJim Jagielski     }
190*b1cdbd2cSJim Jagielski     // todo: Patch the page-layout ...
191*b1cdbd2cSJim Jagielski     private static final String DEFAULT_PAGE_NAME = "Default";
192*b1cdbd2cSJim Jagielski     private final OfficeMasterStyles predefinedStyles;
193*b1cdbd2cSJim Jagielski     private final AttributeNameGenerator masterPageNameGenerator;
194*b1cdbd2cSJim Jagielski     private final Map masterPages;
195*b1cdbd2cSJim Jagielski     private final AttributeNameGenerator pageLayoutNameGenerator;
196*b1cdbd2cSJim Jagielski     private final Map pageLayouts;
197*b1cdbd2cSJim Jagielski 
MasterPageFactory(final OfficeMasterStyles predefinedStyles)198*b1cdbd2cSJim Jagielski     public MasterPageFactory(final OfficeMasterStyles predefinedStyles)
199*b1cdbd2cSJim Jagielski     {
200*b1cdbd2cSJim Jagielski         this.predefinedStyles = predefinedStyles;
201*b1cdbd2cSJim Jagielski         this.masterPages = new HashMap();
202*b1cdbd2cSJim Jagielski         this.masterPageNameGenerator = new AttributeNameGenerator();
203*b1cdbd2cSJim Jagielski         this.pageLayouts = new HashMap();
204*b1cdbd2cSJim Jagielski         this.pageLayoutNameGenerator = new AttributeNameGenerator();
205*b1cdbd2cSJim Jagielski     }
206*b1cdbd2cSJim Jagielski 
getMasterPage(final String template, final String pageHeader, final String pageFooter)207*b1cdbd2cSJim Jagielski     public OfficeMasterPage getMasterPage(final String template,
208*b1cdbd2cSJim Jagielski             final String pageHeader,
209*b1cdbd2cSJim Jagielski             final String pageFooter)
210*b1cdbd2cSJim Jagielski     {
211*b1cdbd2cSJim Jagielski         final MasterPageFactoryKey key =
212*b1cdbd2cSJim Jagielski                 new MasterPageFactoryKey(template, pageHeader, pageFooter);
213*b1cdbd2cSJim Jagielski         return (OfficeMasterPage) masterPages.get(key);
214*b1cdbd2cSJim Jagielski     }
215*b1cdbd2cSJim Jagielski 
containsMasterPage(final String template, final String pageHeader, final String pageFooter)216*b1cdbd2cSJim Jagielski     public boolean containsMasterPage(final String template,
217*b1cdbd2cSJim Jagielski             final String pageHeader,
218*b1cdbd2cSJim Jagielski             final String pageFooter)
219*b1cdbd2cSJim Jagielski     {
220*b1cdbd2cSJim Jagielski         final MasterPageFactoryKey key =
221*b1cdbd2cSJim Jagielski                 new MasterPageFactoryKey(template, pageHeader, pageFooter);
222*b1cdbd2cSJim Jagielski         return masterPages.containsKey(key);
223*b1cdbd2cSJim Jagielski     }
224*b1cdbd2cSJim Jagielski 
createMasterPage(final String template, final String pageHeader, final String pageFooter)225*b1cdbd2cSJim Jagielski     public OfficeMasterPage createMasterPage(final String template,
226*b1cdbd2cSJim Jagielski             final String pageHeader,
227*b1cdbd2cSJim Jagielski             final String pageFooter)
228*b1cdbd2cSJim Jagielski     {
229*b1cdbd2cSJim Jagielski         final MasterPageFactoryKey key =
230*b1cdbd2cSJim Jagielski                 new MasterPageFactoryKey(template, pageHeader, pageFooter);
231*b1cdbd2cSJim Jagielski         final OfficeMasterPage cached = (OfficeMasterPage) masterPages.get(key);
232*b1cdbd2cSJim Jagielski         if (cached != null)
233*b1cdbd2cSJim Jagielski         {
234*b1cdbd2cSJim Jagielski             return cached;
235*b1cdbd2cSJim Jagielski         }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski         final String targetName = (masterPages.isEmpty()) ? "Standard" : template;
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski         OfficeMasterPage predef = predefinedStyles.getMasterPage(template);
240*b1cdbd2cSJim Jagielski         if (predef == null)
241*b1cdbd2cSJim Jagielski         {
242*b1cdbd2cSJim Jagielski             // This is a 'magic' name ..
243*b1cdbd2cSJim Jagielski             // todo: It could be that this should be called 'Standard' instead
244*b1cdbd2cSJim Jagielski             predef = predefinedStyles.getMasterPage(MasterPageFactory.DEFAULT_PAGE_NAME);
245*b1cdbd2cSJim Jagielski         }
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski         if (predef != null)
248*b1cdbd2cSJim Jagielski         {
249*b1cdbd2cSJim Jagielski             try
250*b1cdbd2cSJim Jagielski             {
251*b1cdbd2cSJim Jagielski                 // derive
252*b1cdbd2cSJim Jagielski                 final OfficeMasterPage derived = (OfficeMasterPage) predef.clone();
253*b1cdbd2cSJim Jagielski                 return setupMasterPage(derived, targetName, pageHeader, pageFooter,
254*b1cdbd2cSJim Jagielski                         key);
255*b1cdbd2cSJim Jagielski             }
256*b1cdbd2cSJim Jagielski             catch (CloneNotSupportedException cne)
257*b1cdbd2cSJim Jagielski             {
258*b1cdbd2cSJim Jagielski                 throw new IllegalStateException("Implementation error: Unable to derive page", cne);
259*b1cdbd2cSJim Jagielski             }
260*b1cdbd2cSJim Jagielski         }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski         final OfficeMasterPage masterPage = new OfficeMasterPage();
263*b1cdbd2cSJim Jagielski         masterPage.setNamespace(OfficeNamespaces.STYLE_NS);
264*b1cdbd2cSJim Jagielski         masterPage.setType("master-page");
265*b1cdbd2cSJim Jagielski         return setupMasterPage(masterPage, targetName, pageHeader, pageFooter, key);
266*b1cdbd2cSJim Jagielski     }
267*b1cdbd2cSJim Jagielski 
setupMasterPage(final OfficeMasterPage derived, final String targetName, final String pageHeader, final String pageFooter, final MasterPageFactoryKey key)268*b1cdbd2cSJim Jagielski     private OfficeMasterPage setupMasterPage(final OfficeMasterPage derived,
269*b1cdbd2cSJim Jagielski             final String targetName,
270*b1cdbd2cSJim Jagielski             final String pageHeader,
271*b1cdbd2cSJim Jagielski             final String pageFooter,
272*b1cdbd2cSJim Jagielski             final MasterPageFactoryKey key)
273*b1cdbd2cSJim Jagielski     {
274*b1cdbd2cSJim Jagielski         derived.setStyleName(masterPageNameGenerator.generateName(targetName));
275*b1cdbd2cSJim Jagielski         masterPages.put(key, derived);
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski         if (pageHeader != null)
278*b1cdbd2cSJim Jagielski         {
279*b1cdbd2cSJim Jagielski             final Section header = new Section();
280*b1cdbd2cSJim Jagielski             header.setNamespace(OfficeNamespaces.STYLE_NS);
281*b1cdbd2cSJim Jagielski             header.setType("header");
282*b1cdbd2cSJim Jagielski             header.addNode(new RawText(pageHeader));
283*b1cdbd2cSJim Jagielski             derived.addNode(header);
284*b1cdbd2cSJim Jagielski         }
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski         if (pageFooter != null)
287*b1cdbd2cSJim Jagielski         {
288*b1cdbd2cSJim Jagielski             final Section footer = new Section();
289*b1cdbd2cSJim Jagielski             footer.setNamespace(OfficeNamespaces.STYLE_NS);
290*b1cdbd2cSJim Jagielski             footer.setType("footer");
291*b1cdbd2cSJim Jagielski             footer.addNode(new RawText(pageFooter));
292*b1cdbd2cSJim Jagielski             derived.addNode(footer);
293*b1cdbd2cSJim Jagielski         }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski         return derived;
296*b1cdbd2cSJim Jagielski     }
297*b1cdbd2cSJim Jagielski 
createPageStyle(final OfficeStyles commonStyles, final CSSNumericValue headerHeight, final CSSNumericValue footerHeight)298*b1cdbd2cSJim Jagielski     public String createPageStyle(final OfficeStyles commonStyles,
299*b1cdbd2cSJim Jagielski             final CSSNumericValue headerHeight,
300*b1cdbd2cSJim Jagielski             final CSSNumericValue footerHeight)
301*b1cdbd2cSJim Jagielski     {
302*b1cdbd2cSJim Jagielski         final PageLayoutKey key =
303*b1cdbd2cSJim Jagielski                 new PageLayoutKey(null, headerHeight, footerHeight);
304*b1cdbd2cSJim Jagielski         final PageLayout derived = new PageLayout();
305*b1cdbd2cSJim Jagielski         final String name = pageLayoutNameGenerator.generateName("autogenerated");
306*b1cdbd2cSJim Jagielski         derived.setStyleName(name);
307*b1cdbd2cSJim Jagielski         commonStyles.addPageStyle(derived);
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski         if (headerHeight != null)
310*b1cdbd2cSJim Jagielski         {
311*b1cdbd2cSJim Jagielski             final Section headerStyle = new Section();
312*b1cdbd2cSJim Jagielski             headerStyle.setNamespace(OfficeNamespaces.STYLE_NS);
313*b1cdbd2cSJim Jagielski             headerStyle.setType("header-style");
314*b1cdbd2cSJim Jagielski             derived.addNode(headerStyle);
315*b1cdbd2cSJim Jagielski             MasterPageFactory.applyHeaderFooterHeight(headerStyle, headerHeight);
316*b1cdbd2cSJim Jagielski         }
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski         if (footerHeight != null)
319*b1cdbd2cSJim Jagielski         {
320*b1cdbd2cSJim Jagielski             final Section footerStyle = new Section();
321*b1cdbd2cSJim Jagielski             footerStyle.setNamespace(OfficeNamespaces.STYLE_NS);
322*b1cdbd2cSJim Jagielski             footerStyle.setType("footer-style");
323*b1cdbd2cSJim Jagielski             derived.addNode(footerStyle);
324*b1cdbd2cSJim Jagielski             MasterPageFactory.applyHeaderFooterHeight(footerStyle, footerHeight);
325*b1cdbd2cSJim Jagielski         }
326*b1cdbd2cSJim Jagielski         pageLayouts.put(key, name);
327*b1cdbd2cSJim Jagielski         return name;
328*b1cdbd2cSJim Jagielski     }
329*b1cdbd2cSJim Jagielski 
derivePageStyle(final String pageStyleTemplate, final OfficeStyles predefined, final OfficeStyles commonStyles, final CSSNumericValue headerHeight, final CSSNumericValue footerHeight)330*b1cdbd2cSJim Jagielski     public String derivePageStyle(final String pageStyleTemplate,
331*b1cdbd2cSJim Jagielski             final OfficeStyles predefined,
332*b1cdbd2cSJim Jagielski             final OfficeStyles commonStyles,
333*b1cdbd2cSJim Jagielski             final CSSNumericValue headerHeight,
334*b1cdbd2cSJim Jagielski             final CSSNumericValue footerHeight)
335*b1cdbd2cSJim Jagielski             throws ReportProcessingException
336*b1cdbd2cSJim Jagielski     {
337*b1cdbd2cSJim Jagielski         if (pageStyleTemplate == null)
338*b1cdbd2cSJim Jagielski         {
339*b1cdbd2cSJim Jagielski             throw new NullPointerException("A style-name must be given");
340*b1cdbd2cSJim Jagielski         }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski         final PageLayoutKey key =
343*b1cdbd2cSJim Jagielski                 new PageLayoutKey(pageStyleTemplate, headerHeight, footerHeight);
344*b1cdbd2cSJim Jagielski         final String pageLayoutName = (String) pageLayouts.get(key);
345*b1cdbd2cSJim Jagielski         if (pageLayoutName != null)
346*b1cdbd2cSJim Jagielski         {
347*b1cdbd2cSJim Jagielski             // there's already a suitable version included.
348*b1cdbd2cSJim Jagielski             return pageLayoutName;
349*b1cdbd2cSJim Jagielski         }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski         final PageLayout original = predefined.getPageStyle(pageStyleTemplate);
352*b1cdbd2cSJim Jagielski         if (original == null)
353*b1cdbd2cSJim Jagielski         {
354*b1cdbd2cSJim Jagielski             throw new ReportProcessingException("Invalid page-layout '" + pageStyleTemplate + "', will not continue.");
355*b1cdbd2cSJim Jagielski         }
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski         try
358*b1cdbd2cSJim Jagielski         {
359*b1cdbd2cSJim Jagielski             final PageLayout derived = (PageLayout) original.clone();
360*b1cdbd2cSJim Jagielski             final String name = pageLayoutNameGenerator.generateName(
361*b1cdbd2cSJim Jagielski                     pageStyleTemplate);
362*b1cdbd2cSJim Jagielski             derived.setStyleName(name);
363*b1cdbd2cSJim Jagielski             commonStyles.addPageStyle(derived);
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski             if (headerHeight != null)
366*b1cdbd2cSJim Jagielski             {
367*b1cdbd2cSJim Jagielski                 Section headerStyle = derived.getHeaderStyle();
368*b1cdbd2cSJim Jagielski                 if (headerStyle == null)
369*b1cdbd2cSJim Jagielski                 {
370*b1cdbd2cSJim Jagielski                     headerStyle = new Section();
371*b1cdbd2cSJim Jagielski                     headerStyle.setNamespace(OfficeNamespaces.STYLE_NS);
372*b1cdbd2cSJim Jagielski                     headerStyle.setType("header-style");
373*b1cdbd2cSJim Jagielski                     derived.addNode(headerStyle);
374*b1cdbd2cSJim Jagielski                 }
375*b1cdbd2cSJim Jagielski                 MasterPageFactory.applyHeaderFooterHeight(headerStyle, headerHeight);
376*b1cdbd2cSJim Jagielski             }
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski             if (footerHeight != null)
379*b1cdbd2cSJim Jagielski             {
380*b1cdbd2cSJim Jagielski                 Section footerStyle = derived.getFooterStyle();
381*b1cdbd2cSJim Jagielski                 if (footerStyle == null)
382*b1cdbd2cSJim Jagielski                 {
383*b1cdbd2cSJim Jagielski                     footerStyle = new Section();
384*b1cdbd2cSJim Jagielski                     footerStyle.setNamespace(OfficeNamespaces.STYLE_NS);
385*b1cdbd2cSJim Jagielski                     footerStyle.setType("footer-style");
386*b1cdbd2cSJim Jagielski                     derived.addNode(footerStyle);
387*b1cdbd2cSJim Jagielski                 }
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski                 MasterPageFactory.applyHeaderFooterHeight(footerStyle, footerHeight);
390*b1cdbd2cSJim Jagielski             }
391*b1cdbd2cSJim Jagielski             pageLayouts.put(key, name);
392*b1cdbd2cSJim Jagielski             return name;
393*b1cdbd2cSJim Jagielski         }
394*b1cdbd2cSJim Jagielski         catch (CloneNotSupportedException e)
395*b1cdbd2cSJim Jagielski         {
396*b1cdbd2cSJim Jagielski             throw new IllegalStateException("Clone failed.", e);
397*b1cdbd2cSJim Jagielski         }
398*b1cdbd2cSJim Jagielski     }
399*b1cdbd2cSJim Jagielski 
applyHeaderFooterHeight(final Section headerFooterStyle, final CSSNumericValue style)400*b1cdbd2cSJim Jagielski     private static void applyHeaderFooterHeight(final Section headerFooterStyle,
401*b1cdbd2cSJim Jagielski             final CSSNumericValue style)
402*b1cdbd2cSJim Jagielski     {
403*b1cdbd2cSJim Jagielski         Element headerFooterProps = headerFooterStyle.findFirstChild(OfficeNamespaces.STYLE_NS, "header-footer-properties");
404*b1cdbd2cSJim Jagielski         if (headerFooterProps == null)
405*b1cdbd2cSJim Jagielski         {
406*b1cdbd2cSJim Jagielski             headerFooterProps = new Section();
407*b1cdbd2cSJim Jagielski             headerFooterProps.setNamespace(OfficeNamespaces.STYLE_NS);
408*b1cdbd2cSJim Jagielski             headerFooterProps.setType("header-footer-properties");
409*b1cdbd2cSJim Jagielski             headerFooterStyle.addNode(headerFooterProps);
410*b1cdbd2cSJim Jagielski         }
411*b1cdbd2cSJim Jagielski         headerFooterProps.setAttribute(OfficeNamespaces.SVG_NS, "height", style.getValue() + style.getType().getType());
412*b1cdbd2cSJim Jagielski     }
413*b1cdbd2cSJim Jagielski }
414