01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */
17: /*
18: * Created on May 15, 2005
19: *
20: */
21: package org.apache.poi.hssf.record.formula.functions;
22:
23: import org.apache.poi.hssf.record.formula.eval.AreaEval;
24: import org.apache.poi.hssf.record.formula.eval.BoolEval;
25: import org.apache.poi.hssf.record.formula.eval.ErrorEval;
26: import org.apache.poi.hssf.record.formula.eval.Eval;
27: import org.apache.poi.hssf.record.formula.eval.RefEval;
28: import org.apache.poi.hssf.record.formula.eval.ValueEval;
29:
30: /**
31: * @author Amol S. Deshmukh < amolweb at ya hoo dot com >
32: *
33: */
34: public class IsError implements Function {
35:
36: public Eval evaluate(Eval[] operands, int srcCellRow,
37: short srcCellCol) {
38: ValueEval retval = null;
39: boolean b = false;
40:
41: switch (operands.length) {
42: default:
43: retval = ErrorEval.VALUE_INVALID;
44: break;
45: case 1:
46: if (operands[0] instanceof ErrorEval) {
47: b = true;
48: } else if (operands[0] instanceof AreaEval) {
49: AreaEval ae = (AreaEval) operands[0];
50: if (ae.contains(srcCellRow, srcCellCol)) { // circular ref!
51: retval = ErrorEval.CIRCULAR_REF_ERROR;
52: } else if (ae.isRow()) {
53: if (ae.containsColumn(srcCellCol)) {
54: ValueEval ve = ae.getValueAt(ae.getFirstRow(),
55: srcCellCol);
56: if (ve instanceof RefEval)
57: b = ((RefEval) ve).getInnerValueEval() instanceof ErrorEval;
58: else
59: b = (ve instanceof ErrorEval);
60: } else {
61: b = true;
62: }
63: } else if (ae.isColumn()) {
64: if (ae.containsRow(srcCellRow)) {
65: ValueEval ve = ae.getValueAt(srcCellRow, ae
66: .getFirstColumn());
67: if (ve instanceof RefEval)
68: b = ((RefEval) ve).getInnerValueEval() instanceof ErrorEval;
69: else
70: b = (ve instanceof ErrorEval);
71: } else {
72: b = true;
73: }
74: } else {
75: b = true;
76: }
77: } else if (operands[0] instanceof RefEval) {
78: b = ((RefEval) operands[0]).getInnerValueEval() instanceof ErrorEval;
79: } else {
80: b = false;
81: }
82: }
83:
84: if (retval == null) {
85: retval = b ? BoolEval.TRUE : BoolEval.FALSE;
86: }
87: return retval;
88: }
89: }
|