| /* ==================================================================== |
| 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.ss.formula.ptg; |
| |
| import org.apache.poi.ss.util.CellReference; |
| import org.apache.poi.util.BitField; |
| import org.apache.poi.util.BitFieldFactory; |
| import org.apache.poi.util.LittleEndianInput; |
| import org.apache.poi.util.LittleEndianOutput; |
| |
| /** |
| * ReferencePtgBase - handles references (such as A1, A2, IA4) |
| * |
| * @author Andrew C. Oliver (acoliver@apache.org) |
| * @author Jason Height (jheight at chariot dot net dot au) |
| */ |
| public abstract class RefPtgBase extends OperandPtg { |
| |
| /** The row index - zero based unsigned 16 bit value */ |
| private int field_1_row; |
| /** |
| * Field 2 - lower 8 bits is the zero based unsigned byte column index - bit |
| * 16 - isRowRelative - bit 15 - isColumnRelative |
| */ |
| private int field_2_col; |
| private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000); |
| private static final BitField colRelative = BitFieldFactory.getInstance(0x4000); |
| |
| /** |
| * YK: subclasses of RefPtgBase are used by the FormulaParser and FormulaEvaluator accross HSSF and XSSF. |
| * The bit mask should accomodate the maximum number of avaiable columns, i.e. 0x3FFF. |
| * |
| * @see org.apache.poi.ss.SpreadsheetVersion |
| */ |
| private static final BitField column = BitFieldFactory.getInstance(0x3FFF); |
| |
| protected RefPtgBase() { |
| // Required for clone methods |
| } |
| |
| protected RefPtgBase(CellReference c) { |
| setRow(c.getRow()); |
| setColumn(c.getCol()); |
| setColRelative(!c.isColAbsolute()); |
| setRowRelative(!c.isRowAbsolute()); |
| } |
| |
| protected final void readCoordinates(LittleEndianInput in) { |
| field_1_row = in.readUShort(); |
| field_2_col = in.readUShort(); |
| } |
| |
| protected final void writeCoordinates(LittleEndianOutput out) { |
| out.writeShort(field_1_row); |
| out.writeShort(field_2_col); |
| } |
| |
| public final void setRow(int rowIndex) { |
| field_1_row = rowIndex; |
| } |
| |
| /** |
| * @return the row number as an int |
| */ |
| public final int getRow() { |
| return field_1_row; |
| } |
| |
| public final boolean isRowRelative() { |
| return rowRelative.isSet(field_2_col); |
| } |
| |
| public final void setRowRelative(boolean rel) { |
| field_2_col = rowRelative.setBoolean(field_2_col, rel); |
| } |
| |
| public final boolean isColRelative() { |
| return colRelative.isSet(field_2_col); |
| } |
| |
| public final void setColRelative(boolean rel) { |
| field_2_col = colRelative.setBoolean(field_2_col, rel); |
| } |
| |
| public final void setColumn(int col) { |
| field_2_col = column.setValue(field_2_col, col); |
| } |
| |
| public final int getColumn() { |
| return column.getValue(field_2_col); |
| } |
| |
| protected final String formatReferenceAsString() { |
| // Only make cell references as needed. Memory is an issue |
| CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative()); |
| return cr.formatAsString(); |
| } |
| |
| @Override |
| public final byte getDefaultOperandClass() { |
| return Ptg.CLASS_REF; |
| } |
| } |