TextFieldSelection.java

/*
 * Copyright 2012 The Apache Software Foundation.
 *
 * 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
 *
 * 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.changes;

import static org.odftoolkit.odfdom.changes.OperationConstants.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclElement;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
import org.odftoolkit.odfdom.pkg.OdfElement;

/** @author svante.schubertATgmail.com */
public class TextFieldSelection extends TextSelection implements Comparable {

  private String mReplacementText;
  private final Map<String, Object> mAttrs = new HashMap<String, Object>();

  /**
   * Constructor.
   *
   * @param fieldElement the fieldElement of the Field element.
   * @param startPosition the startPosition of the Field element.
   */
  public TextFieldSelection(
      OdfElement fieldElement,
      List<Integer> startPosition,
      OdfOfficeAutomaticStyles autoStyles,
      Map<String, TextUserFieldDeclElement> userFieldDecls) {
    mSelectionElement = fieldElement;
    mStartPosition = startPosition;

    FieldMap currentMap = FieldMap.fieldMap.get(fieldElement.getLocalName());
    if (currentMap != null) {
      String attributeValue = null;
      if (currentMap.hasFixed()
          && !(attributeValue = mSelectionElement.getAttribute("text:fixed")).isEmpty()) {
        mAttrs.put("fixed", attributeValue.equals("true") ? "true" : "false");
      }
      if (currentMap.hasDateValue()) {
        String dateValue =
            mSelectionElement.getAttribute(
                currentMap.hasTimeStyle() ? "text:time-value" : "text:date-value");
        if (!dateValue.isEmpty()) {
          mAttrs.put("dateValue", dateValue);
        }
        String dataStyleName = mSelectionElement.getAttribute("style:data-style-name");
        if (!dataStyleName.isEmpty()) {
          OdfNumberDateStyle dateStyle = autoStyles.getDateStyle(dataStyleName);

          OdfElement baseStyle = null;
          if (dateStyle != null) {
            baseStyle = dateStyle;
            mAttrs.put("dateFormat", dateStyle.getFormat(true));
          } else {
            OdfNumberTimeStyle timeStyle = autoStyles.getTimeStyle(dataStyleName);
            if (timeStyle != null) {
              baseStyle = timeStyle;
              mAttrs.put("dateFormat", timeStyle.getFormat(true));
            }
          }
          if (baseStyle != null) {
            String language = baseStyle.getAttribute("number:language");
            String country = baseStyle.getAttribute("number:country");
            if (!language.isEmpty()) {
              if (!country.isEmpty()) {
                language += "-";
                language += country;
              }
              mAttrs.put("locale", language);
            }
          }
        }
      }
      if (currentMap.hasdbName()
          && !(attributeValue = mSelectionElement.getAttribute("text:database-name")).isEmpty()) {
        mAttrs.put("dbName", attributeValue);
      }
      if (currentMap.hasTableType()
          && !(attributeValue = mSelectionElement.getAttribute("text:table-type")).isEmpty()) {
        mAttrs.put("tableType", attributeValue);
      }
      if (currentMap.hasdbTable()
          && !(attributeValue = mSelectionElement.getAttribute("text:table-name")).isEmpty()) {
        mAttrs.put("dbTable", attributeValue);
      }
      if (currentMap.hasdbColumn()
          && !(attributeValue = mSelectionElement.getAttribute("text:column-name")).isEmpty()) {
        mAttrs.put("dbColumn", attributeValue);
      }
      if (currentMap.hasDisplay()
          && !(attributeValue = mSelectionElement.getAttribute("text:display")).isEmpty()) {
        mAttrs.put("display", attributeValue);
      }
      if (currentMap.hasRefFormat()
          && !(attributeValue = mSelectionElement.getAttribute("text:reference-format"))
              .isEmpty()) {
        mAttrs.put("refFormat", attributeValue);
      }
      if (currentMap.hasRefName()
          && !(attributeValue = mSelectionElement.getAttribute("text:ref-name")).isEmpty()) {
        mAttrs.put("refName", attributeValue);
      }
      if (currentMap.hasOutlinelevel()
          && !(attributeValue = mSelectionElement.getAttribute("text:outline-level")).isEmpty()) {
        mAttrs.put("outlineLevel", attributeValue);
      }
      if (currentMap.hasPageNumFormat()
          && !(attributeValue = mSelectionElement.getAttribute("style:num-format")).isEmpty()) {
        mAttrs.put("pageNumFormat", attributeValue);
      }
      if (currentMap.hasNumLetterSync()
          && !(attributeValue = mSelectionElement.getAttribute("style:num-letter-sync"))
              .isEmpty()) {
        mAttrs.put("numLetterSync", attributeValue);
      }
      if (currentMap.hasCondition()
          && !(attributeValue = mSelectionElement.getAttribute("text:condition")).isEmpty()) {
        mAttrs.put("condition", attributeValue);
      }
      if (currentMap.hasCurrentValue()
          && !(attributeValue = mSelectionElement.getAttribute("text:current-value")).isEmpty()) {
        mAttrs.put("currentValue", attributeValue);
      }
      if (currentMap.hasFalseValue()
          && !(attributeValue = mSelectionElement.getAttribute("text:string-value-if-false"))
              .isEmpty()) {
        mAttrs.put("falseValue", attributeValue);
      }
      if (currentMap.hasTrueValue()
          && !(attributeValue = mSelectionElement.getAttribute("text:string-value-if-true"))
              .isEmpty()) {
        mAttrs.put("trueValue", attributeValue);
      }
      if (currentMap.hasConnectionName()
          && !(attributeValue = mSelectionElement.getAttribute("text:connection-name")).isEmpty()) {
        mAttrs.put("connectionName", attributeValue);
      }
      if (currentMap.hasDuration()
          && !(attributeValue = mSelectionElement.getAttribute("text-duration")).isEmpty()) {
        mAttrs.put("duration", attributeValue);
      }
      if (currentMap.hasName()
          && !(attributeValue = mSelectionElement.getAttribute("text:name")).isEmpty()) {
        mAttrs.put("name", attributeValue);
      }
      if (currentMap.hasBoolValue()
          && !(attributeValue = mSelectionElement.getAttribute("office:boolean-value")).isEmpty()) {
        mAttrs.put("boolValue", attributeValue);
      }
      if (currentMap.hasCurrency()
          && !(attributeValue = mSelectionElement.getAttribute("office:currency")).isEmpty()) {
        mAttrs.put("currency", attributeValue);
      }
      if (currentMap.hasStringValue()
          && !(attributeValue = mSelectionElement.getAttribute("office:value")).isEmpty()) {
        mAttrs.put("stringValue", attributeValue);
      }
      if (currentMap.hasTimeValue()
          && !(attributeValue = mSelectionElement.getAttribute("text:time-value")).isEmpty()) {
        mAttrs.put("timeValue", attributeValue);
      }
      if (currentMap.hasTValue()
          && !(attributeValue = mSelectionElement.getAttribute("text:value")).isEmpty()) {
        mAttrs.put("value", attributeValue);
      }
      if (currentMap.hasOValue()
          && !(attributeValue = mSelectionElement.getAttribute("office:value")).isEmpty()) {
        mAttrs.put("value", attributeValue);
      }
      if (currentMap.hasValueType()) {
        if (fieldElement.getLocalName().equals("user-field-get")) {
          TextUserFieldDeclElement fieldDecl = userFieldDecls.get(mAttrs.get("name"));
          if (fieldDecl != null
              && !(attributeValue = fieldDecl.getAttribute("office:value-type")).isEmpty()) {
            mAttrs.put("valueType", attributeValue);
          }
        } else if (!(attributeValue = mSelectionElement.getAttribute("office:value-type"))
            .isEmpty()) {
          mAttrs.put("valueType", attributeValue);
        }
      }
      if (currentMap.hasFormula()
          && !(attributeValue = mSelectionElement.getAttribute("text:formula")).isEmpty()) {
        mAttrs.put("formula", attributeValue);
      }
      if (currentMap.hasIsHidden()
          && !(attributeValue = mSelectionElement.getAttribute("xml:id")).isEmpty()) {
        mAttrs.put("isHidden", attributeValue);
      }
      if (currentMap.hasId()
          && !(attributeValue = mSelectionElement.getAttribute("xml:id")).isEmpty()) {
        mAttrs.put(OPK_ID, attributeValue);
      }
      if (currentMap.hasDescription()
          && !(attributeValue = mSelectionElement.getAttribute("text:description")).isEmpty()) {
        mAttrs.put("description", attributeValue);
      }
      if (currentMap.hasActive()
          && !(attributeValue = mSelectionElement.getAttribute("text:active")).isEmpty()) {
        mAttrs.put("active", attributeValue);
      }
      if (currentMap.hasHref()
          && !(attributeValue = mSelectionElement.getAttribute("xlink:href")).isEmpty()) {
        mAttrs.put("href", attributeValue);
      }
      if (currentMap.hasPlaceHolderType()
          && !(attributeValue = mSelectionElement.getAttribute("text:placeholder-type"))
              .isEmpty()) {
        mAttrs.put("placeHolderType", attributeValue);
      }
      if (currentMap.hasKind()
          && !(attributeValue = mSelectionElement.getAttribute("text:kind")).isEmpty()) {
        mAttrs.put("kind", attributeValue);
      }
      if (currentMap.hasLanguage()
          && !(attributeValue = mSelectionElement.getAttribute("script:language")).isEmpty()) {
        mAttrs.put("language", attributeValue);
      }
      if (currentMap.hasLinkType()
          && !(attributeValue = mSelectionElement.getAttribute("xlink:type")).isEmpty()) {
        mAttrs.put("linkType", attributeValue);
      }
      if (currentMap.hasNumFormat()
          && !(attributeValue = mSelectionElement.getAttribute("style:num-format")).isEmpty()) {
        mAttrs.put("numFormat", attributeValue);
      }
      if (currentMap.hasPageAdjust()
          && !(attributeValue = mSelectionElement.getAttribute("text:page-adjust")).isEmpty()) {
        mAttrs.put("pageAdjust", attributeValue);
      }
      if (currentMap.hasRowNumber()
          && !(attributeValue = mSelectionElement.getAttribute("text:row-number")).isEmpty()) {
        mAttrs.put("rowNumber", attributeValue);
      }
    }
  }

  /**
   * Constructor.
   *
   * @param fieldElement the fieldElement of the Field element.
   * @param startPosition the startPosition of the Field element.
   */
  public TextFieldSelection(
      OdfElement fieldElement, List<Integer> startPosition, String replacementText) {
    mSelectionElement = fieldElement;
    mStartPosition = startPosition;
    mReplacementText = replacementText;
  }

  /**
   * Constructor.
   *
   * @param fieldElement the fieldElement of the Field element.
   * @param startPosition the startPosition of the Field element.
   */
  TextFieldSelection(
      OdfElement fieldElement, List<Integer> startPosition, List<Integer> endPosition) {
    mSelectionElement = fieldElement;
    mStartPosition = startPosition;
    mEndPosition = endPosition;
  }

  public String getReplacementText() {
    return mReplacementText;
  }

  public Map<String, Object> getAttributes() {
    return mAttrs;
  }

  @Override
  public String toString() {
    return mStartPosition.toString()
        + "-URL"
        + mUrl
        + "-"
        + mEndPosition.toString()
        + mSelectionElement.toString();
  }
}