123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /* ====================================================================
- 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.apache.poi.hssf.usermodel;
-
- import org.apache.poi.ddf.EscherClientAnchorRecord;
- import org.apache.poi.ss.usermodel.ClientAnchor;
-
-
- /**
- * A client anchor is attached to an excel worksheet. It anchors against a
- * top-left and buttom-right cell.
- *
- * @author Glen Stampoultzis (glens at apache.org)
- */
- public final class HSSFClientAnchor extends HSSFAnchor implements ClientAnchor {
- short col1;
- int row1;
- short col2;
- int row2;
- int anchorType;
-
- private EscherClientAnchorRecord escherClientAnchorRecord;
-
- public HSSFClientAnchor(EscherClientAnchorRecord escherClientAnchorRecord) {
- this.escherClientAnchorRecord = escherClientAnchorRecord;
- //TODO set properties or read properties from EscherRecord ?
- }
-
- /**
- * Creates a new client anchor and defaults all the anchor positions to 0.
- */
- public HSSFClientAnchor()
- {
- }
-
- /**
- * Creates a new client anchor and sets the top-left and bottom-right
- * coordinates of the anchor.
- *
- * @param dx1 the x coordinate within the first cell.
- * @param dy1 the y coordinate within the first cell.
- * @param dx2 the x coordinate within the second cell.
- * @param dy2 the y coordinate within the second cell.
- * @param col1 the column (0 based) of the first cell.
- * @param row1 the row (0 based) of the first cell.
- * @param col2 the column (0 based) of the second cell.
- * @param row2 the row (0 based) of the second cell.
- */
- public HSSFClientAnchor( int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2 )
- {
- super( dx1, dy1, dx2, dy2 );
-
- checkRange(dx1, 0, 1023, "dx1");
- checkRange(dx2, 0, 1023, "dx2");
- checkRange(dy1, 0, 255, "dy1");
- checkRange(dy2, 0, 255, "dy2");
- checkRange(col1, 0, 255, "col1");
- checkRange(col2, 0, 255, "col2");
- checkRange(row1, 0, 255 * 256, "row1");
- checkRange(row2, 0, 255 * 256, "row2");
-
- this.col1 = col1;
- this.row1 = row1;
- this.col2 = col2;
- this.row2 = row2;
- }
-
- /**
- * Calculates the height of a client anchor in points.
- *
- * @param sheet the sheet the anchor will be attached to
- * @return the shape height.
- */
- public float getAnchorHeightInPoints(HSSFSheet sheet )
- {
- int y1 = getDy1();
- int y2 = getDy2();
- int row1 = Math.min( getRow1(), getRow2() );
- int row2 = Math.max( getRow1(), getRow2() );
-
- float points = 0;
- if (row1 == row2)
- {
- points = ((y2 - y1) / 256.0f) * getRowHeightInPoints(sheet, row2);
- }
- else
- {
- points += ((256.0f - y1) / 256.0f) * getRowHeightInPoints(sheet, row1);
- for (int i = row1 + 1; i < row2; i++)
- {
- points += getRowHeightInPoints(sheet, i);
- }
- points += (y2 / 256.0f) * getRowHeightInPoints(sheet, row2);
- }
-
- return points;
- }
-
- private float getRowHeightInPoints(HSSFSheet sheet, int rowNum)
- {
- HSSFRow row = sheet.getRow(rowNum);
- if (row == null) {
- return sheet.getDefaultRowHeightInPoints();
- }
- return row.getHeightInPoints();
- }
-
- public short getCol1()
- {
- return col1;
- }
-
- public void setCol1( short col1 )
- {
- checkRange(col1, 0, 255, "col1");
- this.col1 = col1;
- }
- public void setCol1( int col1 ){
- setCol1((short)col1);
- }
-
- public short getCol2()
- {
- return col2;
- }
-
- public void setCol2( short col2 )
- {
- checkRange(col2, 0, 255, "col2");
- this.col2 = col2;
- }
-
- public void setCol2( int col2 ){
- setCol2((short)col2);
- }
-
- public int getRow1()
- {
- return row1;
- }
-
- public void setRow1( int row1 )
- {
- checkRange(row1, 0, 256 * 256, "row1");
- this.row1 = row1;
- }
-
- public int getRow2()
- {
- return row2;
- }
-
- public void setRow2( int row2 )
- {
- checkRange(row2, 0, 256 * 256, "row2");
- this.row2 = row2;
- }
-
- /**
- * Dets the top-left and bottom-right
- * coordinates of the anchor.
- *
- * @param x1 the x coordinate within the first cell.
- * @param y1 the y coordinate within the first cell.
- * @param x2 the x coordinate within the second cell.
- * @param y2 the y coordinate within the second cell.
- * @param col1 the column (0 based) of the first cell.
- * @param row1 the row (0 based) of the first cell.
- * @param col2 the column (0 based) of the second cell.
- * @param row2 the row (0 based) of the second cell.
- */
- public void setAnchor( short col1, int row1, int x1, int y1, short col2, int row2, int x2, int y2 )
- {
- checkRange(dx1, 0, 1023, "dx1");
- checkRange(dx2, 0, 1023, "dx2");
- checkRange(dy1, 0, 255, "dy1");
- checkRange(dy2, 0, 255, "dy2");
- checkRange(col1, 0, 255, "col1");
- checkRange(col2, 0, 255, "col2");
- checkRange(row1, 0, 255 * 256, "row1");
- checkRange(row2, 0, 255 * 256, "row2");
-
- this.col1 = col1;
- this.row1 = row1;
- this.dx1 = x1;
- this.dy1 = y1;
- this.col2 = col2;
- this.row2 = row2;
- this.dx2 = x2;
- this.dy2 = y2;
- }
-
- /**
- * @return true if the anchor goes from right to left.
- */
- public boolean isHorizontallyFlipped()
- {
- if (col1 == col2) {
- return dx1 > dx2;
- }
- return col1 > col2;
- }
-
- /**
- * @return true if the anchor goes from bottom to top.
- */
- public boolean isVerticallyFlipped()
- {
- if (row1 == row2) {
- return dy1 > dy2;
- }
- return row1 > row2;
- }
-
- /**
- * Gets the anchor type
- * <p>
- * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
- */
- public int getAnchorType()
- {
- return anchorType;
- }
-
- /**
- * Sets the anchor type
- * <p>
- * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
- */
- public void setAnchorType( int anchorType )
- {
- this.anchorType = anchorType;
- }
-
- private void checkRange( int value, int minRange, int maxRange, String varName )
- {
- if (value < minRange || value > maxRange)
- throw new IllegalArgumentException(varName + " must be between " + minRange + " and " + maxRange);
- }
-
-
- }
|