/**************************************************************
 *
 * 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 SC_DBCOLECT_HXX
#define SC_DBCOLECT_HXX

#include "scdllapi.h"
#include "collect.hxx"
#include "global.hxx"       // MAXQUERY
#include "sortparam.hxx"    // MAXSORT
#include "refreshtimer.hxx"
#include "address.hxx"
#include "scdllapi.h"

//------------------------------------------------------------------------

class ScDocument;

//------------------------------------------------------------------------

class ScDBData : public ScDataObject, public ScRefreshTimer
{
friend class ScDBCollection;
private:
    // DBParam
    String          aName;
    SCTAB           nTable;
    SCCOL           nStartCol;
    SCROW           nStartRow;
    SCCOL           nEndCol;
    SCROW           nEndRow;
    sal_Bool            bByRow;
    sal_Bool            bHasHeader;
    sal_Bool            bDoSize;
    sal_Bool            bKeepFmt;
    sal_Bool            bStripData;
    // SortParam
    sal_Bool            bSortCaseSens;
    sal_Bool            bIncludePattern;
    sal_Bool            bSortInplace;
    sal_Bool            bSortUserDef;
    sal_uInt16          nSortUserIndex;
    SCTAB           nSortDestTab;
    SCCOL           nSortDestCol;
    SCROW           nSortDestRow;
    sal_Bool            bDoSort[MAXSORT];
    SCCOLROW        nSortField[MAXSORT];
    sal_Bool            bAscending[MAXSORT];
    ::com::sun::star::lang::Locale aSortLocale;
    String          aSortAlgorithm;
    // QueryParam
    sal_Bool            bQueryInplace;
    sal_Bool            bQueryCaseSens;
    sal_Bool            bQueryRegExp;
    sal_Bool            bQueryDuplicate;
    SCTAB           nQueryDestTab;
    SCCOL           nQueryDestCol;
    SCROW           nQueryDestRow;
    sal_Bool            bDoQuery[MAXQUERY];
    SCCOLROW        nQueryField[MAXQUERY];
    ScQueryOp       eQueryOp[MAXQUERY];
    sal_Bool            bQueryByString[MAXQUERY];
    bool            bQueryByDate[MAXQUERY];
    String*         pQueryStr[MAXQUERY];
    double          nQueryVal[MAXQUERY];
    ScQueryConnect  eQueryConnect[MAXQUERY];
    sal_Bool            bIsAdvanced;        // sal_True if created by advanced filter
    ScRange         aAdvSource;         // source range
    // SubTotalParam
    sal_Bool            bSubRemoveOnly;
    sal_Bool            bSubReplace;
    sal_Bool            bSubPagebreak;
    sal_Bool            bSubCaseSens;
    sal_Bool            bSubDoSort;
    sal_Bool            bSubAscending;
    sal_Bool            bSubIncludePattern;
    sal_Bool            bSubUserDef;
    sal_uInt16          nSubUserIndex;
    sal_Bool            bDoSubTotal[MAXSUBTOTAL];
    SCCOL           nSubField[MAXSUBTOTAL];
    SCCOL           nSubTotals[MAXSUBTOTAL];
    SCCOL*          pSubTotals[MAXSUBTOTAL];
    ScSubTotalFunc* pFunctions[MAXSUBTOTAL];
    // Datenbank-Import
    sal_Bool            bDBImport;
    String          aDBName;
    String          aDBStatement;
    sal_Bool            bDBNative;
    sal_Bool            bDBSelection;       // nicht im Param: Wenn Selektion, Update sperren
    sal_Bool            bDBSql;             // aDBStatement ist SQL und kein Name
    sal_uInt8           nDBType;            // enum DBObject (bisher nur dbTable, dbQuery)

    sal_uInt16          nIndex;             // eindeutiger Index fuer Formeln
    sal_Bool            bAutoFilter;        // AutoFilter? (nicht gespeichert)
    sal_Bool            bModified;          // wird bei UpdateReference gesetzt/geloescht

    using ScRefreshTimer::operator==;

public:
            SC_DLLPUBLIC ScDBData(const String& rName,
                     SCTAB nTab,
                     SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
                     sal_Bool bByR = sal_True, sal_Bool bHasH = sal_True);
            ScDBData(const ScDBData& rData);
            ~ScDBData();

    virtual ScDataObject*   Clone() const;

            ScDBData&   operator= (const ScDBData& rData);

            sal_Bool        operator== (const ScDBData& rData) const;

            const String& GetName() const               { return aName; }
            void        GetName(String& rName) const    { rName = aName; }
            void        SetName(const String& rName)    { aName = rName; }
            void        GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2) const;
            SC_DLLPUBLIC void       GetArea(ScRange& rRange) const;
            void        SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
            void        MoveTo(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
            sal_Bool        IsByRow() const                 { return bByRow; }
            void        SetByRow(sal_Bool bByR)             { bByRow = bByR; }
            sal_Bool        HasHeader() const               { return bHasHeader; }
            void        SetHeader(sal_Bool bHasH)           { bHasHeader = bHasH; }
            void        SetIndex(sal_uInt16 nInd)           { nIndex = nInd; }
            sal_uInt16      GetIndex() const                { return nIndex; }
            sal_Bool        IsDoSize() const                { return bDoSize; }
            void        SetDoSize(sal_Bool bSet)            { bDoSize = bSet; }
            sal_Bool        IsKeepFmt() const               { return bKeepFmt; }
            void        SetKeepFmt(sal_Bool bSet)           { bKeepFmt = bSet; }
            sal_Bool        IsStripData() const             { return bStripData; }
            void        SetStripData(sal_Bool bSet)         { bStripData = bSet; }

//UNUSED2008-05  sal_Bool       IsBeyond(SCROW nMaxRow) const;

            String      GetSourceString() const;
            String      GetOperations() const;

            void        GetSortParam(ScSortParam& rSortParam) const;
            void        SetSortParam(const ScSortParam& rSortParam);

            SC_DLLPUBLIC void       GetQueryParam(ScQueryParam& rQueryParam) const;
            SC_DLLPUBLIC void       SetQueryParam(const ScQueryParam& rQueryParam);
            SC_DLLPUBLIC sal_Bool       GetAdvancedQuerySource(ScRange& rSource) const;
            SC_DLLPUBLIC void       SetAdvancedQuerySource(const ScRange* pSource);

            void        GetSubTotalParam(ScSubTotalParam& rSubTotalParam) const;
            void        SetSubTotalParam(const ScSubTotalParam& rSubTotalParam);

            void        GetImportParam(ScImportParam& rImportParam) const;
            void        SetImportParam(const ScImportParam& rImportParam);

            sal_Bool        IsDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool bStartOnly) const;
            sal_Bool        IsDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const;

            sal_Bool        HasImportParam() const   { return bDBImport; }
            sal_Bool        HasQueryParam() const    { return bDoQuery[0]; }
            sal_Bool        HasSortParam() const     { return bDoSort[0]; }
            sal_Bool        HasSubTotalParam() const { return bDoSubTotal[0]; }

            sal_Bool        HasImportSelection() const      { return bDBSelection; }
            void        SetImportSelection(sal_Bool bSet)   { bDBSelection = bSet; }

            sal_Bool        HasAutoFilter() const       { return bAutoFilter; }
            void        SetAutoFilter(sal_Bool bSet)    { bAutoFilter = bSet; }

            sal_Bool        IsModified() const          { return bModified; }
            void        SetModified(sal_Bool bMod)      { bModified = bMod; }
};


//------------------------------------------------------------------------
class SC_DLLPUBLIC ScDBCollection : public ScSortedCollection
{

private:
    Link        aRefreshHandler;
    ScDocument* pDoc;
    sal_uInt16 nEntryIndex;         // Zaehler fuer die eindeutigen Indizes

public:
    ScDBCollection(sal_uInt16 nLim = 4, sal_uInt16 nDel = 4, sal_Bool bDup = sal_False, ScDocument* pDocument = NULL) :
                    ScSortedCollection  ( nLim, nDel, bDup ),
                    pDoc                ( pDocument ),
                    nEntryIndex         ( SC_START_INDEX_DB_COLL )  // oberhalb der Namen
                    {}
    ScDBCollection(const ScDBCollection& rScDBCollection) :
                    ScSortedCollection  ( rScDBCollection ),
                    pDoc                ( rScDBCollection.pDoc ),
                    nEntryIndex         ( rScDBCollection.nEntryIndex)
                    {}

    virtual ScDataObject*   Clone() const { return new ScDBCollection(*this); }
            ScDBData*   operator[]( const sal_uInt16 nIndex) const {return (ScDBData*)At(nIndex);}
    virtual short       Compare(ScDataObject* pKey1, ScDataObject* pKey2) const;
    virtual sal_Bool        IsEqual(ScDataObject* pKey1, ScDataObject* pKey2) const;
            ScDBData*   GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool bStartOnly) const;
            ScDBData*   GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const;
            ScDBData*       GetFilterDBAtTable(SCTAB nTab) const;

    sal_Bool    SearchName( const String& rName, sal_uInt16& rIndex ) const;

    void    DeleteOnTab( SCTAB nTab );
    void    UpdateReference(UpdateRefMode eUpdateRefMode,
                                SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
                                SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
                                SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
    void    UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );

    ScDBData* FindIndex(sal_uInt16 nIndex);
    sal_uInt16  GetEntryIndex()                 { return nEntryIndex; }
    void    SetEntryIndex(sal_uInt16 nInd)      { nEntryIndex = nInd; }
    virtual sal_Bool Insert(ScDataObject* pScDataObject);

    void            SetRefreshHandler( const Link& rLink )
                        { aRefreshHandler = rLink; }
    const Link&     GetRefreshHandler() const   { return aRefreshHandler; }
};

#endif