98 lines
3.9 KiB
Java
98 lines
3.9 KiB
Java
/* ====================================================================
|
|
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;
|
|
|
|
import org.apache.poi.ss.formula.eval.AreaEval;
|
|
import org.apache.poi.ss.formula.eval.AreaEvalBase;
|
|
import org.apache.poi.ss.formula.eval.ValueEval;
|
|
import org.apache.poi.ss.formula.ptg.AreaI;
|
|
import org.apache.poi.ss.formula.ptg.AreaI.OffsetArea;
|
|
import org.apache.poi.ss.util.CellReference;
|
|
|
|
/**
|
|
* Provides Lazy Evaluation to 3D Ranges
|
|
*/
|
|
final class LazyAreaEval extends AreaEvalBase {
|
|
private final SheetRangeEvaluator _evaluator;
|
|
|
|
LazyAreaEval(AreaI ptg, SheetRangeEvaluator evaluator) {
|
|
super(ptg, evaluator);
|
|
_evaluator = evaluator;
|
|
}
|
|
|
|
public LazyAreaEval(int firstRowIndex, int firstColumnIndex, int lastRowIndex,
|
|
int lastColumnIndex, SheetRangeEvaluator evaluator) {
|
|
super(evaluator, firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex);
|
|
_evaluator = evaluator;
|
|
}
|
|
|
|
public ValueEval getRelativeValue(int relativeRowIndex, int relativeColumnIndex) {
|
|
return getRelativeValue(getFirstSheetIndex(), relativeRowIndex, relativeColumnIndex);
|
|
}
|
|
public ValueEval getRelativeValue(int sheetIndex, int relativeRowIndex, int relativeColumnIndex) {
|
|
int rowIx = (relativeRowIndex + getFirstRow() ) ;
|
|
int colIx = (relativeColumnIndex + getFirstColumn() ) ;
|
|
|
|
return _evaluator.getEvalForCell(sheetIndex, rowIx, colIx);
|
|
}
|
|
|
|
public AreaEval offset(int relFirstRowIx, int relLastRowIx, int relFirstColIx, int relLastColIx) {
|
|
AreaI area = new OffsetArea(getFirstRow(), getFirstColumn(),
|
|
relFirstRowIx, relLastRowIx, relFirstColIx, relLastColIx);
|
|
|
|
return new LazyAreaEval(area, _evaluator);
|
|
}
|
|
public LazyAreaEval getRow(int rowIndex) {
|
|
if (rowIndex >= getHeight()) {
|
|
throw new IllegalArgumentException("Invalid rowIndex " + rowIndex
|
|
+ ". Allowable range is (0.." + getHeight() + ").");
|
|
}
|
|
int absRowIx = getFirstRow() + rowIndex;
|
|
return new LazyAreaEval(absRowIx, getFirstColumn(), absRowIx, getLastColumn(), _evaluator);
|
|
}
|
|
public LazyAreaEval getColumn(int columnIndex) {
|
|
if (columnIndex >= getWidth()) {
|
|
throw new IllegalArgumentException("Invalid columnIndex " + columnIndex
|
|
+ ". Allowable range is (0.." + getWidth() + ").");
|
|
}
|
|
int absColIx = getFirstColumn() + columnIndex;
|
|
return new LazyAreaEval(getFirstRow(), absColIx, getLastRow(), absColIx, _evaluator);
|
|
}
|
|
|
|
public String toString() {
|
|
CellReference crA = new CellReference(getFirstRow(), getFirstColumn());
|
|
CellReference crB = new CellReference(getLastRow(), getLastColumn());
|
|
return getClass().getName() + "[" +
|
|
_evaluator.getSheetNameRange() +
|
|
'!' +
|
|
crA.formatAsString() +
|
|
':' +
|
|
crB.formatAsString() +
|
|
"]";
|
|
}
|
|
|
|
/**
|
|
* @return whether cell at rowIndex and columnIndex is a subtotal
|
|
*/
|
|
public boolean isSubTotal(int rowIndex, int columnIndex){
|
|
// delegate the query to the sheet evaluator which has access to internal ptgs
|
|
SheetRefEvaluator _sre = _evaluator.getSheetEvaluator(_evaluator.getFirstSheetIndex());
|
|
return _sre.isSubTotal(getFirstRow() + rowIndex, getFirstColumn() + columnIndex);
|
|
}
|
|
}
|