Package org.odftoolkit.simple.style

Source Code of org.odftoolkit.simple.style.MasterPage

/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/

package org.odftoolkit.simple.style;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
import org.odftoolkit.odfdom.dom.attribute.style.StylePageLayoutNameAttribute;
import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.type.Color;
import org.odftoolkit.odfdom.type.Percent;
import org.odftoolkit.simple.Document;
import org.odftoolkit.simple.style.StyleTypeDefinitions.AdjustmentStyle;
import org.odftoolkit.simple.style.StyleTypeDefinitions.LineStyle;
import org.odftoolkit.simple.style.StyleTypeDefinitions.PrintOrientation;
import org.odftoolkit.simple.style.StyleTypeDefinitions.WritingMode;

/**
* This class represents the master page style settings. It provides methods to
* access page layout styles. More functions will be added latter.
*
* <p>
* This class is a corresponding high level class for element
* "style:master-page". It provides methods to access the attributes and
* children of "style:master-page".
*
* @since 0.8
*/
public class MasterPage {

  /**
   * This class is the style handler for master page. It provides methods to
   * get the readable element and the writable element of a page layout style.
   * It also provides method to get the readable element and the writable
   * element of page layout properties .
   *
   */
  class StyleHandlerImpl {

    private OdfStylePageLayout mWritableStyleElement;
    private OdfStyleBase mStyleElement;
    private PageLayoutProperties mPageLayoutProperties;
    private PageLayoutProperties mWritablePageLayoutProperties;
    private OdfStylableElement mOdfElement; // master page style element
    private Document mDocument;

    /**
     * Constructor of StyleHandlerImpl
     *
     * @param element
     *            - the instance of master page element in an ODF document
     *
     */
    public StyleHandlerImpl(OdfStylableElement element) {
      mOdfElement = element;
      mDocument = ((Document) ((OdfFileDom) mOdfElement
          .getOwnerDocument()).getDocument());
    }

    /**
     * Return the page layout properties definition for this component, only
     * for read function.
     * <p>
     * Null will be returned if there is no style definition.
     * <p>
     * Null will be returned if there is no explicit page layout properties
     * definition for this component.
     * <p>
     * Note if you try to write style properties to the returned object,
     * errors will be met with.
     *
     * @return the page layout properties definition for this component,
     *         only for read function
     */
    public PageLayoutProperties getPageLayoutPropertiesForRead() {
      if (mWritablePageLayoutProperties != null)
        return mWritablePageLayoutProperties;
      else if (mPageLayoutProperties != null)
        return mPageLayoutProperties;

      OdfStyleBase style = getPageLayoutElementForRead();
      if (style == null) {
        Logger.getLogger(DefaultStyleHandler.class.getName()).log(
            Level.FINE, "No style definition is found!", "");
        return null;
      }
      mPageLayoutProperties = PageLayoutProperties
          .getPageLayoutProperties(style);
      if (mPageLayoutProperties != null)
        return mPageLayoutProperties;
      else {
        Logger
            .getLogger(DefaultStyleHandler.class.getName())
            .log(
                Level.FINE,
                "No explicit pageLayout properties definition is found!",
                "");
        return null;
      }
    }

    /**
     * Return the page layout properties definition for this component, for
     * read and write function.
     * <p>
     * An empty style definition will be created if there is no style
     * definition.
     * <p>
     * An empty page layout properties definition will be created if there
     * is no explicit page layout properties definition.
     *
     * @return the page layout properties definition for this component, for
     *         read and write function
     * @throws Exception
     *             if the corresponding <code>StylePageLayoutElement</code>
     *             cannot be accessed for write.
     */
    public PageLayoutProperties getPageLayoutPropertiesForWrite()
        throws Exception {
      if (mWritablePageLayoutProperties != null)
        return mWritablePageLayoutProperties;
      OdfStylePageLayout style = getPageLayoutElementForWrite();
      mWritablePageLayoutProperties = PageLayoutProperties
          .getOrCreatePageLayoutProperties(style);
      return mWritablePageLayoutProperties;
    }

    /**
     * Return the style element for this component, only for read function.
     * This method will invode <code>getusedStyleName</code> to get the
     * style name, and then find the readable style element by name.
     * <p>
     * Null will be returned if there is no style definition.
     * <p>
     * Note if you try to write style properties to the returned object,
     * errors will be met with.
     *
     * @return the style element
     * @see #getUsedPageLayoutStyleName()
     */
    public OdfStyleBase getPageLayoutElementForRead() {
      // Return current used style
      if (getCurrentUsedStyle() != null)
        return getCurrentUsedStyle();

      String styleName = getUsedPageLayoutStyleName();
      mStyleElement = getReadableStyleElementByName(styleName);
      return mStyleElement;
    }

    /**
     * Return the style element for this component, for read and write
     * functions. This method will invode <code>getusedStyleName</code> to
     * get the style name, and then find the writable style element by name.
     * <p>
     * An empty style definition will be created if there is no style
     * definition.
     *
     * @return the style element
     * @throws Exception
     *             if the corresponding <code>StylePageLayoutElement</code>
     *             cannot be accessed for write.
     * @see #getUsedPageLayoutStyleName()
     */
    public OdfStylePageLayout getPageLayoutElementForWrite()
        throws Exception {
      if (mWritableStyleElement != null)
        return mWritableStyleElement;

      String styleName = getUsedPageLayoutStyleName();
      mWritableStyleElement = getWritableStyleElementByName(styleName,
          false);
      return mWritableStyleElement;
    }

    /**
     * Return a readable style element by style name.
     * <p>
     * If the style name is null, the default style will be returned.
     *
     * @param styleName
     *            - the style name
     * @return a readable style element
     */
    protected OdfStyleBase getReadableStyleElementByName(String styleName) {

      // TODO: get from default page layout style element
      if (styleName == null || (styleName.equals("")))
        ;

      OdfStylePageLayout styleElement = mOdfElement.getAutomaticStyles()
          .getPageLayout(styleName);

      return styleElement;
    }

    /**
     * Return a writable page layout style element by style name.
     * <p>
     * If the style is shared, a copied style element would be returned.
     * <p>
     * If the style name is null, the default style will be copied.
     *
     * @param styleName
     *            - the style name
     * @return a writable style element
     * @throws Exception
     *             if the corresponding StyleElement cannot be accessed for
     *             write.
     */
    protected OdfStylePageLayout getWritableStyleElementByName(
        String styleName, boolean isShared) throws Exception {
      boolean createNew = isShared;
      OdfStylePageLayout pageLayout = null;
      OdfOfficeAutomaticStyles styles = mOdfElement.getAutomaticStyles();
      if (styleName == null || (styleName.equals(""))) {
        createNew = true;
        // TODO: get default page layout style
      } else {
        styles = mOdfElement.getAutomaticStyles();
        pageLayout = styles.getPageLayout(styleName);
        if (pageLayout == null || pageLayout.getStyleUserCount() > 1) {
          createNew = true;
        }
      }
      // if style name is null or this style are used by many users,
      // should create a new one.
      if (createNew) {
        OdfStylePageLayout newPageLayout = null;
        if (pageLayout != null) {
          newPageLayout = (OdfStylePageLayout) pageLayout
              .cloneNode(true);
        }
        newPageLayout = (OdfStylePageLayout) mDocument.getStylesDom()
            .newOdfElement(StylePageLayoutElement.class);
        String newname = newUniquePageLayoutName();
        newPageLayout.setStyleNameAttribute(newname);
        styles.appendChild(newPageLayout);
        mOdfElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(),
            "style:page-layout-name", newname);
        newPageLayout.addStyleUser(mOdfElement);
        return newPageLayout;
      }
      return pageLayout;
    }

    private String newUniquePageLayoutName() {
      String unique_name;
      OdfOfficeAutomaticStyles styles = mOdfElement.getAutomaticStyles();
      do {
        unique_name = String.format("a%06x",
            (int) (Math.random() * 0xffffff));
      } while (styles.getPageLayout(unique_name) != null);
      return unique_name;
    }

    private OdfStyleBase getCurrentUsedStyle() {
      if (mWritableStyleElement != null)
        return mWritableStyleElement;
      else
        return mStyleElement;
    }

    /**
     * Return the referenced style name by this master page.
     *
     * @return - the referenced style name by this master page.
     */
    public String getUsedPageLayoutStyleName() {
      return mOdfElement
          .getAttribute(StylePageLayoutNameAttribute.ATTRIBUTE_NAME
              .getQName());
    }
  }

  private StyleMasterPageElement mStyleMasterPageElement;
  private StyleHandlerImpl mStyleHandler;

  /**
   * Constructor of MasterPage
   *
   * @param styleMasterPageElement
   *            - the instance of style:master-page element in an ODF document
   */
  MasterPage(StyleMasterPageElement styleMasterPageElement) {
    mStyleMasterPageElement = styleMasterPageElement;
  }

  /**
   * Return a master page according to its name and its document.
   * <p>
   * If there is no existing master page defined by this name in the document,
   * a new master with this name will be created and returned.
   *
   * @param doc
   *            - the document to which the master page belongs.
   * @param name
   *            - the name of the master page
   * @return a master page
   * @throws Exception
   *             if the style DOM cannot be initialized
   */
  public static MasterPage getOrCreateMasterPage(Document doc, String name)
      throws Exception {
    OdfOfficeMasterStyles officeMasterStyles = doc.getOfficeMasterStyles();
    StyleMasterPageElement master = officeMasterStyles.getMasterPage(name);
    if (master == null) {
      master = doc.getStylesDom().newOdfElement(
          StyleMasterPageElement.class);
      master.setStyleNameAttribute(name);
      officeMasterStyles.appendChild(master);
    }
    return new MasterPage(master);
  }

  /**
   * Get the style handler of this master page.
   * <p>
   * The style handler is an instance of StyleHandlerImpl
   *
   * @return an instance of StyleHandlerImpl
   * @see StyleHandlerImpl
   */
  StyleHandlerImpl getPageLayoutStyleHandler() {
    if (mStyleHandler != null)
      return mStyleHandler;
    else {
      mStyleHandler = new StyleHandlerImpl(mStyleMasterPageElement);
      return mStyleHandler;
    }

  }

  /**
   * Get the name of this master page.
   * <p>
   * This represents the attribute <code>style:name</code> of
   * <code>style:master-page</code>.
   *
   * @return the style name of this master page.
   */
  public String getName() {
    return mStyleMasterPageElement.getStyleNameAttribute();
  }

  /**
   * Get the top margin of the <code>PageLayoutProperties</code> referenced by
   * this master page.
   *
   * @return the top margin (in Millimeter)
   */
  public double getMarginTop() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getMarginTop();
  }

  /**
   * Get the right margin of the <code>PageLayoutProperties</code> referenced
   * by this master page.
   *
   * @return the right margin (in Millimeter)
   */
  public double getMarginRight() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getMarginRight();
  }

  /**
   * Get the left margin of the <code>PageLayoutProperties</code> referenced
   * by this master page.
   *
   * @return the left margin (in Millimeter)
   */
  public double getMarginLeft() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getMarginLeft();
  }

  /**
   * Get the bottom margin of the <code>PageLayoutProperties</code> referenced
   * by this master page.
   *
   * @return the bottom margin (in Millimeter)
   */
  public double getMarginBottom() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getMarginBottom();
  }

  /**
   * Set the margins of the <code>PageLayoutProperties</code> referenced by
   * this master page.
   * <p>
   * If the margin size is set to zero, the corresponding margin definition
   * will be removed.
   *
   * @param marginTop
   *            the size of the top margin (in Millimeter)
   * @param marginBottom
   *            the size of the bottom margin (in Millimeter)
   * @param marginLeft
   *            the size of the left margin (in Millimeter)
   * @param marginRight
   *            the size of the right margin (in Millimeter)
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   *
   */
  public void setMargins(double marginTop, double marginBottom,
      double marginLeft, double marginRight) throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setMarginTop(marginTop);
    properties.setMarginBottom(marginBottom);
    properties.setMarginLeft(marginLeft);
    properties.setMarginRight(marginRight);
  }

  /**
   * Get the page width of the the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @return the size of page width (in Millimeter)
   */
  public double getPageWidth() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getPageWidth();
  }

  /**
   * Set the page width of the <code>PageLayoutProperties</code> referenced by
   * this master page.
   * <p>
   * If the size is set to zero, the page width definition will be removed.
   *
   * @param pageWidth
   *            the size of the page width (in Millimeter)
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   */
  public void setPageWidth(double pageWidth) throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setPageWidth(pageWidth);
  }

  /**
   * Get the page height of the the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @return the size of page height (in Millimeter)
   */
  public double getPageHeight() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getPageHeight();
  }

  /**
   * Set the page height of the <code>PageLayoutProperties</code> referenced
   * by this master page.
   * <p>
   * If the size is set to zero, the page height definition will be removed.
   *
   * @param pageHeight
   *            the size of the page height (in Millimeter)
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   */
  public void setPageHeight(double pageHeight) throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setPageHeight(pageHeight);
  }

  /**
   * Get the number format of the the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @return the value of number format
   */
  public String getNumberFormat() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getNumberFormat();
  }

  /**
   * Set the number format of the <code>PageLayoutProperties</code> referenced
   * by this master page.
   *
   * @param format
   *            specify the number format. The values of the style:num-format
   *            attribute are 1, i, I, string, an empty string, a or A.
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   */
  public void setNumberFormat(String format) throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setNumberFormat(format);
  }

  /**
   * Get the print orientation of the the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @return the value of print orientation
   */
  public String getPrintOrientation() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getPrintOrientation();
  }

  /**
   * Set the print orientation of the <code>PageLayoutProperties</code>
   * referenced by this master page.
   * <p>
   * If the parameter <code>orientation</code> is null, the print orientation
   * definition will be removed.
   *
   * @param orientation
   *            - the print orientation
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   */
  public void setPrintOrientation(PrintOrientation orientation)
      throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setPrintOrientation(orientation);
  }

  /**
   * Get the writing mode of the the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @return the value of writing mode
   */
  public String getWritingMode() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getWritingMode();
  }

  /**
   * Set the writing mode of the <code>PageLayoutProperties</code> referenced
   * by this master page.
   *
   * @param mode
   *            - writing mode
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   */
  public void setWritingMode(WritingMode mode) throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setWritingMode(mode);
  }

  /**
   * Get the footnote max height of the the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @return the value of footnote max height
   */
  public double getFootnoteMaxHeight() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteMaxHeight();
  }

  /**
   * Set the footnote max height of the <code>PageLayoutProperties</code>
   * referenced by this master page.
   *
   * @param height
   *            - the max height of a footnote area
   *@throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   */
  public void setFootnoteMaxHeight(double height) throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setFootnoteMaxHeight(height);
  }

  /**
   * Get the way in which a footnote separator line aligned to a page, which
   * is set by the <code>PageLayoutProperties</code> referenced by this master
   * page.
   *
   * @return the adjustment of a footnote separator line
   */
  public String getFootnoteSepAdjustment() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepAdjustment();
  }

  /**
   * Get the color of a footnote separator which is set by the
   * <code>PageLayoutProperties</code> referenced by this master page.
   *
   * @return the color of a footnote separator line
   */
  public String getFootnoteSepColor() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepColor();
  }

  /**
   * Get the distance between a footnote separator and the footnote area,
   * which is set by the <code>PageLayoutProperties</code> referenced by this
   * master page.
   *
   * @return the distance after a footnote separator line
   */
  public double getFootnoteSepDistanceAfterSep() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepDistanceAfterSep();
  }

  /**
   * Get the distance between the text area and the footnote separator, which
   * is set by the <code>PageLayoutProperties</code> referenced by this master
   * page.
   *
   * @return the distance before a footnote separator line
   */
  public double getFootnoteSepDistanceBeforeSep() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepDistanceBeforeSep();
  }

  /**
   * Get the line style of a footnote separator which is set by the
   * <code>PageLayoutProperties</code> referenced by this master page.
   *
   * @return the line style of a footnote separator line
   */
  public String getFootnoteSepLineStyle() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepLineStyle();
  }

  /**
   * Get the real width of a footnote separator which is set by the
   * <code>PageLayoutProperties</code> referenced by this master page.
   *
   * @return the real width of a footnote separator line
   */
  public double getFootnoteSepWidth() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepWidth();
  }

  /**
   * Get the thickness of a footnote separator which is set by the
   * <code>PageLayoutProperties</code> referenced by this master page.
   *
   * @return the thickness of a footnote separator line
   */
  public double getFootnoteSepThickness() {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForRead();
    return properties.getFootnoteSepThickness();
  }

  /**
   * Set the foot note separator properties of the
   * <code>PageLayoutProperties</code> referenced by this master page.
   *
   * @throws Exception
   *             if the corresponding <code>StylePageLayoutElement</code>
   *             cannot be accessed for write.
   * @see PageLayoutProperties#setFootnoteSepProperties(AdjustmentStyle,
   *      Color, double, double, LineStyle, Percent, double)
   *
   */
  public void setFootnoteSepProperties(AdjustmentStyle adjustment,
      Color color, double distanceAfterSep, double distanceBeforeSep,
      LineStyle lineStyle, Percent width, double thickness)
      throws Exception {
    PageLayoutProperties properties = getPageLayoutStyleHandler()
        .getPageLayoutPropertiesForWrite();
    properties.setFootnoteSepProperties(adjustment, color,
        distanceAfterSep, distanceBeforeSep, lineStyle, width,
        thickness);
  }

}
TOP

Related Classes of org.odftoolkit.simple.style.MasterPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.