/*
 *  ====================================================================
 *    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.usermodel;

import org.apache.poi.ss.util.CellRangeAddress;

/**
 * The ConditionalFormatting class encapsulates all settings of Conditional Formatting.
 *
 * The class can be used
 *
 * <UL>
 * <LI>
 * to make a copy ConditionalFormatting settings.
 * </LI>
 *
 *
 * For example:
 * <PRE>
 * ConditionalFormatting cf = sheet.getConditionalFormattingAt(index);
 * newSheet.addConditionalFormatting(cf);
 * </PRE>
 *
 *  <LI>
 *  or to modify existing Conditional Formatting settings (formatting regions and/or rules).
 *  </LI>
 *  </UL>
 *
 * Use {@link org.apache.poi.ss.usermodel.Sheet#getSheetConditionalFormatting()}
 * to get access to an instance of this class.
 * <P>
 * To create a new Conditional Formatting set use the following approach:
 *
 * <PRE>
 *
 * // Define a Conditional Formatting rule, which triggers formatting
 * // when cell's value is greater or equal than 100.0 and
 * // applies patternFormatting defined below.
 * ConditionalFormattingRule rule = sheet.createConditionalFormattingRule(
 *     ComparisonOperator.GE,
 *     "100.0", // 1st formula
 *     null     // 2nd formula is not used for comparison operator GE
 * );
 *
 * // Create pattern with red background
 * PatternFormatting patternFmt = rule.cretePatternFormatting();
 * patternFormatting.setFillBackgroundColor(IndexedColor.RED.getIndex());
 *
 * // Define a region containing first column
 * Region [] regions =
 * {
 *     new Region(1,(short)1,-1,(short)1)
 * };
 *
 * // Apply Conditional Formatting rule defined above to the regions
 * sheet.addConditionalFormatting(regions, rule);
 * </PRE>
 */
public interface ConditionalFormatting {

    /**
     * @return array of <tt>CellRangeAddress</tt>s. Never <code>null</code>
     */
    CellRangeAddress[] getFormattingRanges();

    /**
     * Sets the cell ranges the rule conditional formatting must be applied to.
     * @param ranges non-null array of <tt>CellRangeAddress</tt>s
     */
    void setFormattingRanges(CellRangeAddress[] ranges);

    /**
     * Replaces an existing Conditional Formatting rule at position idx.
     * Excel pre-2007 allows to create up to 3 Conditional Formatting rules,
     *  2007 and later allow unlimited numbers.
     * This method can be useful to modify existing  Conditional Formatting rules.
     *
     * @param idx position of the rule. Should be between 0 and 2 for Excel before 2007, otherwise 0+.
     * @param cfRule - Conditional Formatting rule
     */
    void setRule(int idx, ConditionalFormattingRule cfRule);

    /**
     * Add a Conditional Formatting rule.
     * Excel pre-2007 allows to create up to 3 Conditional Formatting rules.
     *
     * @param cfRule - Conditional Formatting rule
     */
    void addRule(ConditionalFormattingRule cfRule);

    /**
     * @return the Conditional Formatting rule at position idx.
     */
    ConditionalFormattingRule getRule(int idx);

    /**
     * @return number of Conditional Formatting rules.
     */
    int getNumberOfRules();
}
