blob: 30f412613a69c38678659cff61178a238299727a [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#ifndef OOX_XLS_AUTOFILTERBUFFER_HXX
#define OOX_XLS_AUTOFILTERBUFFER_HXX
#include <com/sun/star/table/CellRangeAddress.hpp>
#include "oox/helper/refvector.hxx"
#include "oox/xls/workbookhelper.hxx"
namespace com { namespace sun { namespace star {
namespace sheet { struct TableFilterField2; }
namespace sheet { class XDatabaseRange; }
namespace sheet { class XSheetFilterDescriptor2; }
} } }
namespace oox {
namespace xls {
// ============================================================================
/** Contains UNO API filter settings for a column in a filtered range. */
struct ApiFilterSettings
{
typedef ::std::vector< ::com::sun::star::sheet::TableFilterField2 > FilterFieldVector;
FilterFieldVector maFilterFields; /// List of UNO API filter settings.
OptValue< bool > mobNeedsRegExp; /// If set, requires regular expressions to be enabled/disabled.
explicit ApiFilterSettings();
void appendField( bool bAnd, sal_Int32 nOperator, double fValue );
void appendField( bool bAnd, sal_Int32 nOperator, const ::rtl::OUString& rValue );
};
// ============================================================================
/** Base class for specific filter settings for a column in a filtered range.
*/
class FilterSettingsBase : public WorkbookHelper
{
public:
explicit FilterSettingsBase( const WorkbookHelper& rHelper );
/** Derived classes import filter settings from the passed attribute list. */
virtual void importAttribs( sal_Int32 nElement, const AttributeList& rAttribs );
/** Derived classes import filter settings from the passed record. */
virtual void importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm );
/** Derived classes import filter settings from the FILTERCOLUMN record. */
virtual void importBiffRecord( BiffInputStream& rStrm, sal_uInt16 nFlags );
/** Derived classes return converted UNO API filter settings representing all filter settings. */
virtual ApiFilterSettings finalizeImport( sal_Int32 nMaxCount );
};
typedef ::boost::shared_ptr< FilterSettingsBase > FilterSettingsRef;
// ============================================================================
/** Settings for a discrete filter, specifying a list of values to be shown in
the filtered range.
*/
class DiscreteFilter : public FilterSettingsBase
{
public:
explicit DiscreteFilter( const WorkbookHelper& rHelper );
/** Imports filter settings from the filters and filter elements. */
virtual void importAttribs( sal_Int32 nElement, const AttributeList& rAttribs );
/** Imports filter settings from the FILTERS and FILTER records. */
virtual void importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm );
/** Returns converted UNO API filter settings representing all filter settings. */
virtual ApiFilterSettings finalizeImport( sal_Int32 nMaxCount );
private:
typedef ::std::vector< ::rtl::OUString > FilterValueVector;
FilterValueVector maValues;
sal_Int32 mnCalendarType;
bool mbShowBlank;
};
// ============================================================================
/** Settings for a top-10 filter. */
class Top10Filter : public FilterSettingsBase
{
public:
explicit Top10Filter( const WorkbookHelper& rHelper );
/** Imports filter settings from the filters and filter elements. */
virtual void importAttribs( sal_Int32 nElement, const AttributeList& rAttribs );
/** Imports filter settings from the FILTERS and FILTER records. */
virtual void importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm );
/** Imports filter settings from the FILTERCOLUMN record. */
virtual void importBiffRecord( BiffInputStream& rStrm, sal_uInt16 nFlags );
/** Returns converted UNO API filter settings representing all filter settings. */
virtual ApiFilterSettings finalizeImport( sal_Int32 nMaxCount );
private:
double mfValue; /// Number of items or percentage.
bool mbTop; /// True = show top (greatest) items/percentage.
bool mbPercent; /// True = percentage, false = number of items.
};
// ============================================================================
/** A filter criterion for a custom filter. */
struct FilterCriterionModel
{
::com::sun::star::uno::Any maValue; /// Comparison operand.
sal_Int32 mnOperator; /// Comparison operator.
sal_uInt8 mnDataType; /// Operand data type (BIFF only).
sal_uInt8 mnStrLen; /// Length of string operand (BIFF5-BIFF8 only).
explicit FilterCriterionModel();
/** Sets the passed BIFF operator constant. */
void setBiffOperator( sal_uInt8 nOperator );
/** Imports the criterion model from the passed BIFF12 stream. */
void readBiffData( SequenceInputStream& rStrm );
/** Imports the initial criterion data from the passed BIFF5/BIFF8 stream. */
void readBiffData( BiffInputStream& rStrm );
/** Imports the trailing string data from the passed BIFF5/BIFF8 stream. */
void readString( BiffInputStream& rStrm, BiffType eBiff, rtl_TextEncoding eTextEnc );
};
// ----------------------------------------------------------------------------
/** Settings for a custom filter, specifying one or two comparison operators
associated with some values.
*/
class CustomFilter : public FilterSettingsBase
{
public:
explicit CustomFilter( const WorkbookHelper& rHelper );
/** Imports filter settings from the filters and filter elements. */
virtual void importAttribs( sal_Int32 nElement, const AttributeList& rAttribs );
/** Imports filter settings from the FILTERS and FILTER records. */
virtual void importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm );
/** Imports filter settings from the FILTERCOLUMN record. */
virtual void importBiffRecord( BiffInputStream& rStrm, sal_uInt16 nFlags );
/** Returns converted UNO API filter settings representing all filter settings. */
virtual ApiFilterSettings finalizeImport( sal_Int32 nMaxCount );
private:
/** Apeends the passed filter criteriom, if it contains valid settings. */
void appendCriterion( const FilterCriterionModel& rCriterion );
private:
typedef ::std::vector< FilterCriterionModel > FilterCriterionVector;
FilterCriterionVector maCriteria;
bool mbAnd;
};
// ============================================================================
/** A column in a filtered range. Contains an object with specific filter
settings for the cells in the column.
*/
class FilterColumn : public WorkbookHelper
{
public:
explicit FilterColumn( const WorkbookHelper& rHelper );
/** Imports auto filter column settings from the filterColumn element. */
void importFilterColumn( const AttributeList& rAttribs );
/** Imports auto filter column settings from the FILTERCOLUMN record. */
void importFilterColumn( SequenceInputStream& rStrm );
/** Imports auto filter column settings from the FILTERCOLUMN record. */
void importFilterColumn( BiffInputStream& rStrm );
/** Creates and returns the specified filter settings object. */
template< typename FilterSettingsType >
inline FilterSettingsBase& createFilterSettings()
{ mxSettings.reset( new FilterSettingsType( *this ) ); return *mxSettings; }
/** Returns the index of the column in the filtered range this object is related to. */
inline sal_Int32 getColumnId() const { return mnColId; }
/** Returns converted UNO API filter settings representing all filter
settings of this column. */
ApiFilterSettings finalizeImport( sal_Int32 nMaxCount );
private:
FilterSettingsRef mxSettings;
sal_Int32 mnColId;
bool mbHiddenButton;
bool mbShowButton;
};
// ============================================================================
class AutoFilter : public WorkbookHelper
{
public:
explicit AutoFilter( const WorkbookHelper& rHelper );
/** Imports auto filter settings from the autoFilter element. */
void importAutoFilter( const AttributeList& rAttribs, sal_Int16 nSheet );
/** Imports auto filter settings from the AUTOFILTER record. */
void importAutoFilter( SequenceInputStream& rStrm, sal_Int16 nSheet );
/** Creates a new auto filter column and stores it internally. */
FilterColumn& createFilterColumn();
/** Applies the filter to the passed filter descriptor. */
void finalizeImport( const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSheetFilterDescriptor2 >& rxFilterDesc );
private:
typedef RefVector< FilterColumn > FilterColumnVector;
FilterColumnVector maFilterColumns;
::com::sun::star::table::CellRangeAddress maRange;
};
// ============================================================================
class AutoFilterBuffer : public WorkbookHelper
{
public:
explicit AutoFilterBuffer( const WorkbookHelper& rHelper );
/** Creates a new auto filter and stores it internally. */
AutoFilter& createAutoFilter();
/** Applies filter settings to a new database range object (used for sheet
autofilter or advanced filter as specified by built-in defined names). */
void finalizeImport( sal_Int16 nSheet );
/** Applies the filters to the passed database range object.
@return True = this buffer contains valid auto filter settings. */
bool finalizeImport( const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDatabaseRange >& rxDatabaseRange );
private:
/** Returns the auto filter object used to perform auto filtering. */
AutoFilter* getActiveAutoFilter();
private:
typedef RefVector< AutoFilter > AutoFilterVector;
AutoFilterVector maAutoFilters;
};
// ============================================================================
} // namespace xls
} // namespace oox
#endif