OdfStyleableShapeElement.java

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 *
 * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
 *
 * Use is subject to license terms.
 *
 * Licensed 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. You can also
 * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
 *
 * 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.odfdom.dom.element;

import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.pkg.OdfName;
import org.w3c.dom.Attr;

/**
 * This class decides upon the shape style attribute, whether the style family is of type 'graphic'
 * or 'presentation'.
 *
 * <p>Why do have ODF shapes two alternatives for their style:family attribute?
 *
 * <p>In ODF a style (ie. style:style) is always identified not alone by its name, but as well by
 * its style:family. Elements are in general predefined to one style:family. For instance, a
 * paragraph (text:p) will have a style from the style:family="paragraph", a span (text:span) would
 * have a style:family="text".
 *
 * <p>Only ODF shapes (e.g. draw:frame) can choose between two different style:family values, ie.
 * 'presentation' and 'graphic'.
 *
 * <p>The idea behind is that 'graphic' family shapes have a style that belong to the document
 * similar as all other styles, but 'presentation' family shapes have a style that belongs to a
 * master page.
 *
 * <p>The difference: Whenever in an application the master page of a page is being changed, all
 * 'graphic' shapes look the same, only the 'presentation' shapes will get a new look-and-feel from
 * the new master page.
 */
public abstract class OdfStyleableShapeElement extends OdfStylableElement {

  private static final long serialVersionUID = 3604813885619852184L;
  private static OdfName PresStyleAttrName =
      OdfName.newName(OdfDocumentNamespace.PRESENTATION, "style-name");
  private static OdfName DrawStyleAttrName =
      OdfName.newName(OdfDocumentNamespace.DRAW, "style-name");

  public OdfStyleableShapeElement(OdfFileDom ownerDocument, OdfName name) {
    super(ownerDocument, name, OdfStyleFamily.Graphic, DrawStyleAttrName);
  }

  /**
   * When the style-name prefix is changed between draw: and presentation: the style:family is
   * adjusted as well
   *
   * @param uri the namespace uri of the attribute to be changed
   * @param localname of the attribute to be changed
   */
  protected void adjustStyleNameAttrib(String uri, String localname) {
    if (DrawStyleAttrName.equals(uri, localname)) {
      mStyleNameAttrib = DrawStyleAttrName;
      mFamily = OdfStyleFamily.Graphic;
    } else if (PresStyleAttrName.equals(uri, localname)) {
      mStyleNameAttrib = PresStyleAttrName;
      mFamily = OdfStyleFamily.Presentation;
    }
  }

  @Override
  public void setAttributeNS(String uri, String localname, String value) {
    if ((value != null) && (value.length() != 0)) {
      adjustStyleNameAttrib(uri, localname);
    }

    super.setAttributeNS(uri, localname, value);
  }

  @Override
  public Attr setAttributeNodeNS(Attr newAttr) {
    String uri = newAttr.getNamespaceURI();
    String localname = newAttr.getName();
    adjustStyleNameAttrib(uri, localname);
    return super.setAttributeNodeNS(newAttr);
  }
}