001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.cocoon.components.elementprocessor.impl.poi.hssf.elements;
019:
020: import org.apache.cocoon.components.elementprocessor.types.NumericConverter;
021: import org.apache.cocoon.components.elementprocessor.types.Validator;
022:
023: import java.io.IOException;
024:
025: /**
026: * Anchors. This particular object is represented in gnumeric's XML as four
027: * integers, space separated. Presumably, each represents an anchor for a
028: * particular direction -- top, bottom, left, right -- but what the reference
029: * is for each anchor is not known, nor is it known which one is top, bottom,
030: * left, or right, or even whether that's the correct interpretation of the
031: * numbers. This is an area of the gnumeric XML that is not terribly well
032: * documented even in their code, and I don't think the features that use
033: * anchors are terribly mature yet.
034: *
035: * @author Marc Johnson (marc_johnson27591@hotmail.com)
036: * @version CVS $Id: Anchors.java 433543 2006-08-22 06:22:54Z crossley $
037: */
038: public class Anchors {
039: private static final int _component_count = 4;
040: private int[] _components = new int[_component_count];
041:
042: // Each element of an anchor has to be one of these values:
043: public static final int ANCHOR_UNKNOWN = 0;
044: public static final int ANCHOR_PERCENTAGE_FROM_COLROW_ST = 16;
045: public static final int ANCHOR_PERCENTAGE_FROM_COLROW_END = 17;
046: public static final int ANCHOR_PTS_FROM_COLROW_START = 32;
047: public static final int ANCHOR_PTS_FROM_COLROW_END = 33;
048: public static final int ANCHOR_PTS_ABSOLUTE = 48;
049: private static final Validator _validator = new Validator() {
050: public IOException validate(final Number number) {
051: switch (number.intValue()) {
052: case ANCHOR_UNKNOWN:
053: case ANCHOR_PERCENTAGE_FROM_COLROW_ST:
054: case ANCHOR_PERCENTAGE_FROM_COLROW_END:
055: case ANCHOR_PTS_FROM_COLROW_START:
056: case ANCHOR_PTS_FROM_COLROW_END:
057: case ANCHOR_PTS_ABSOLUTE:
058: return null;
059:
060: default:
061: return new IOException("\"" + number
062: + "\" is not a legal value");
063: }
064: }
065: };
066:
067: /**
068: * construct the Anchors object
069: *
070: * @param value the string containing the anchor values
071: *
072: * @exception IOException if the string is badly formed
073: */
074:
075: public Anchors(final String value) throws IOException {
076: if (value == null) {
077: throw new IOException(
078: "cannot process a null anchors string");
079: }
080: char[] input = value.trim().toCharArray();
081: int index = 0;
082:
083: for (int j = 0; j < _component_count; j++) {
084: while (index < input.length
085: && Character.isWhitespace(input[index])) {
086: ++index;
087: }
088: if (index == input.length) {
089: throw new IOException("insufficient anchors in string");
090: }
091: int tailIndex = index;
092:
093: while (tailIndex < input.length
094: && !Character.isWhitespace(input[tailIndex])) {
095: ++tailIndex;
096: }
097: _components[j] = NumericConverter.extractInteger(
098: new String(input, index, tailIndex - index),
099: _validator).intValue();
100: index = tailIndex;
101: }
102: if (new String(input, index, input.length - index).trim()
103: .length() != 0) {
104: throw new IOException("Too much data in string for "
105: + _component_count + " anchors");
106: }
107: }
108:
109: /**
110: * @return components
111: */
112:
113: public int[] getComponents() {
114: return _components;
115: }
116: } // end public class Anchors
|