123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /* ====================================================================
- 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.record;
-
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.ss.formula.Formula;
- import org.apache.poi.ss.formula.ptg.Ptg;
- import org.apache.poi.util.LittleEndianOutput;
-
- /**
- * Conditional Formatting Rule Record (0x01B1).
- *
- * <p>This is for the older-style Excel conditional formattings,
- * new-style (Excel 2007+) also make use of {@link CFRule12Record}
- * for their rules.</p>
- */
- public final class CFRuleRecord extends CFRuleBase {
- public static final short sid = 0x01B1;
-
- public CFRuleRecord(CFRuleRecord other) {
- super(other);
- }
-
- private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) {
- super(conditionType, comparisonOperation, formula1, formula2);
- setDefaults();
- }
-
- private void setDefaults() {
- // Set modification flags to 1: by default options are not modified
- formatting_options = modificationBits.setValue(formatting_options, -1);
- // Set formatting block flags to 0 (no formatting blocks)
- formatting_options = fmtBlockBits.setValue(formatting_options, 0);
- formatting_options = undocumented.clear(formatting_options);
-
- formatting_not_used = (short)0x8002; // Excel seems to write this value, but it doesn't seem to care what it reads
- _fontFormatting = null;
- _borderFormatting = null;
- _patternFormatting = null;
- }
-
- /**
- * Creates a new comparison operation rule
- *
- * @param sheet the sheet
- * @param formulaText the formula text
- *
- * @return a new comparison operation rule
- */
- public static CFRuleRecord create(HSSFSheet sheet, String formulaText) {
- Ptg[] formula1 = parseFormula(formulaText, sheet);
- return new CFRuleRecord(CONDITION_TYPE_FORMULA, ComparisonOperator.NO_COMPARISON,
- formula1, null);
- }
- /**
- * Creates a new comparison operation rule
- *
- * @param sheet the sheet
- * @param comparisonOperation the comparison operation
- * @param formulaText1 the first formula text
- * @param formulaText2 the second formula text
- *
- * @return a new comparison operation rule
- */
- public static CFRuleRecord create(HSSFSheet sheet, byte comparisonOperation,
- String formulaText1, String formulaText2) {
- Ptg[] formula1 = parseFormula(formulaText1, sheet);
- Ptg[] formula2 = parseFormula(formulaText2, sheet);
- return new CFRuleRecord(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, formula1, formula2);
- }
-
- public CFRuleRecord(RecordInputStream in) {
- setConditionType(in.readByte());
- setComparisonOperation(in.readByte());
- int field_3_formula1_len = in.readUShort();
- int field_4_formula2_len = in.readUShort();
- readFormatOptions(in);
-
- // "You may not use unions, intersections or array constants in Conditional Formatting criteria"
- setFormula1(Formula.read(field_3_formula1_len, in));
- setFormula2(Formula.read(field_4_formula2_len, in));
- }
-
- @Override
- public short getSid() {
- return sid;
- }
-
- /**
- * called by the class that is responsible for writing this sucker.
- * Subclasses should implement this so that their data is passed back in a
- * byte array.
- *
- * @param out the stream to write to
- */
- @Override
- public void serialize(LittleEndianOutput out) {
- int formula1Len=getFormulaSize(getFormula1());
- int formula2Len=getFormulaSize(getFormula2());
-
- out.writeByte(getConditionType());
- out.writeByte(getComparisonOperation());
- out.writeShort(formula1Len);
- out.writeShort(formula2Len);
-
- serializeFormattingBlock(out);
-
- getFormula1().serializeTokens(out);
- getFormula2().serializeTokens(out);
- }
-
- @Override
- protected int getDataSize() {
- return 6 + getFormattingBlockSize() +
- getFormulaSize(getFormula1())+
- getFormulaSize(getFormula2());
- }
-
- @Override
- public CFRuleRecord copy() {
- return new CFRuleRecord(this);
- }
-
- @Override
- public HSSFRecordTypes getGenericRecordType() {
- return HSSFRecordTypes.CF_RULE;
- }
- }
|