office-gobmx/sc/inc/attarray.hxx
2002-12-05 15:00:12 +00:00

269 lines
9.8 KiB
C++

/*************************************************************************
*
* $RCSfile: attarray.hxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: er $ $Date: 2002-12-05 16:00:11 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef SC_ATRARR_HXX
#define SC_ATRARR_HXX
#ifndef SC_SCGLOB_HXX
#include "global.hxx"
#endif
#ifndef SC_SCATTR_HXX
#include "attrib.hxx"
#endif
class ScDocument;
class ScMarkArray;
class ScPatternAttr;
class ScStyleSheet;
class Rectangle;
class SfxItemPoolCache;
class SfxStyleSheetBase;
class SvxBorderLine;
class SvxBoxItem;
class SvxBoxInfoItem;
#define SC_LINE_EMPTY 0
#define SC_LINE_SET 1
#define SC_LINE_DONTCARE 2
#define SC_ATTRARRAY_DELTA 4
struct ScLineFlags
{
BYTE nLeft;
BYTE nRight;
BYTE nTop;
BYTE nBottom;
BYTE nHori;
BYTE nVert;
ScLineFlags() : nLeft(SC_LINE_EMPTY),nRight(SC_LINE_EMPTY),nTop(SC_LINE_EMPTY),
nBottom(SC_LINE_EMPTY),nHori(SC_LINE_EMPTY),nVert(SC_LINE_EMPTY) {}
};
struct ScAttrEntry
{
USHORT nRow;
const ScPatternAttr* pPattern;
};
class ScAttrArray
{
private:
USHORT nCol;
USHORT nTab;
ScDocument* pDocument;
USHORT nCount;
USHORT nLimit;
ScAttrEntry* pData;
friend class ScDocument; // fuer FillInfo
friend class ScDocumentIterator;
friend class ScAttrIterator;
friend class ScHorizontalAttrIterator;
friend void lcl_IterGetNumberFormat( ULONG& nFormat,
const ScAttrArray*& rpArr, USHORT& nAttrEndRow,
const ScAttrArray* pNewArr, USHORT nRow, ScDocument* pDoc );
BOOL ApplyFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
USHORT nStartRow, USHORT nEndRow,
BOOL bLeft, USHORT nDistRight, BOOL bTop, USHORT nDistBottom );
public:
ScAttrArray( USHORT nNewCol, USHORT nNewTab, ScDocument* pDoc );
~ScAttrArray();
void SetTab(USHORT nNewTab) { nTab = nNewTab; }
void SetCol(USHORT nNewCol) { nCol = nNewCol; }
void TestData() const;
void Reset( const ScPatternAttr* pPattern, BOOL bAlloc = TRUE );
BOOL Concat(USHORT nPos);
const ScPatternAttr* GetPattern( USHORT nRow ) const;
const ScPatternAttr* GetPatternRange( USHORT& rStartRow, USHORT& rEndRow, USHORT nRow ) const;
void MergePatternArea( USHORT nStartRow, USHORT nEndRow, SfxItemSet** ppSet, BOOL bDeep ) const;
void MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner, ScLineFlags& rFlags,
USHORT nStartRow, USHORT nEndRow, BOOL bLeft, USHORT nDistRight ) const;
void ApplyBlockFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
USHORT nStartRow, USHORT nEndRow, BOOL bLeft, USHORT nDistRight );
void SetPattern( USHORT nRow, const ScPatternAttr* pPattern, BOOL bPutToPool = FALSE );
void SetPatternArea( USHORT nStartRow, USHORT nEndRow, const ScPatternAttr* pPattern, BOOL bPutToPool = FALSE);
void ApplyStyleArea( USHORT nStartRow, USHORT nEndRow, ScStyleSheet* pStyle );
void ApplyCacheArea( USHORT nStartRow, USHORT nEndRow, SfxItemPoolCache* pCache );
void ApplyLineStyleArea( USHORT nStartRow, USHORT nEndRow,
const SvxBorderLine* pLine, BOOL bColorOnly );
void ClearItems( USHORT nStartRow, USHORT nEndRow, const USHORT* pWhich );
void ChangeIndent( USHORT nStartRow, USHORT nEndRow, BOOL bIncrement );
short GetNextUnprotected( short nRow, BOOL bUp ) const; // inkl. aktuelle
short SearchStyle( short nRow, const ScStyleSheet* pSearchStyle,
BOOL bUp, ScMarkArray* pMarkArray = NULL );
BOOL SearchStyleRange( short& rRow, short& rEndRow, const ScStyleSheet* pSearchStyle,
BOOL bUp, ScMarkArray* pMarkArray = NULL );
BOOL ApplyFlags( USHORT nStartRow, USHORT nEndRow, INT16 nFlags );
BOOL RemoveFlags( USHORT nStartRow, USHORT nEndRow, INT16 nFlags );
BOOL Search( USHORT nRow, short& nIndex ) const;
BOOL HasLines( USHORT nRow1, USHORT nRow2, Rectangle& rSizes,
BOOL bLeft, BOOL bRight ) const;
BOOL HasAttrib( USHORT nRow1, USHORT nRow2, USHORT nMask ) const;
BOOL ExtendMerge( USHORT nThisCol, USHORT nStartRow, USHORT nEndRow,
USHORT& rPaintCol, USHORT& rPaintRow,
BOOL bRefresh, BOOL bAttrs );
BOOL RemoveAreaMerge( USHORT nStartRow, USHORT nEndRow );
void FindStyleSheet( const SfxStyleSheetBase* pStyleSheet, BOOL* pUsed, BOOL bReset );
BOOL IsStyleSheetUsed( const ScStyleSheet& rStyle, BOOL bGatherAllStyles ) const;
void DeleteAreaSafe(USHORT nStartRow, USHORT nEndRow);
void SetPatternAreaSafe( USHORT nStartRow, USHORT nEndRow,
const ScPatternAttr* pWantedPattern, BOOL bDefault );
void CopyAreaSafe( USHORT nStartRow, USHORT nEndRow, short nDy, ScAttrArray& rAttrArray );
BOOL IsEmpty() const;
USHORT GetFirstEntryPos() const;
USHORT GetLastEntryPos( BOOL bIncludeBottom ) const;
BOOL HasVisibleAttr( USHORT& rFirstRow, USHORT& rLastRow, BOOL bSkipFirst ) const;
BOOL HasVisibleAttrIn( USHORT nStartRow, USHORT nEndRow ) const;
BOOL IsVisibleEqual( const ScAttrArray& rOther,
USHORT nStartRow, USHORT nEndRow ) const;
BOOL IsAllEqual( const ScAttrArray& rOther, USHORT nStartRow, USHORT nEndRow ) const;
BOOL TestInsertCol( USHORT nStartRow, USHORT nEndRow) const;
BOOL TestInsertRow( USHORT nSize ) const;
void InsertRow( USHORT nStartRow, USHORT nSize );
void DeleteRow( USHORT nStartRow, USHORT nSize );
void DeleteRange( USHORT nStartIndex, USHORT nEndIndex );
void DeleteArea( USHORT nStartRow, USHORT nEndRow );
void MoveTo( USHORT nStartRow, USHORT nEndRow, ScAttrArray& rAttrArray );
void CopyArea( USHORT nStartRow, USHORT nEndRow, short nDy, ScAttrArray& rAttrArray,
INT16 nStripFlags = 0 );
void DeleteHardAttr( USHORT nStartRow, USHORT nEndRow );
void Save( SvStream& rStream ) const;
void Load( SvStream& rStream );
void ConvertFontsAfterLoad(); // old binary file format
};
// ------------------------------------------------------------------------------
// Iterator fuer Attribute
// ------------------------------------------------------------------------------
class ScAttrIterator
{
const ScAttrArray* pArray;
short nPos;
USHORT nRow;
USHORT nEndRow;
public:
inline ScAttrIterator( const ScAttrArray* pNewArray, USHORT nStart, USHORT nEnd );
inline const ScPatternAttr* Next( USHORT& rTop, USHORT& rBottom );
USHORT GetNextRow() const { return nRow; }
};
inline ScAttrIterator::ScAttrIterator( const ScAttrArray* pNewArray, USHORT nStart, USHORT nEnd ) :
pArray( pNewArray ),
nRow( nStart ),
nEndRow( nEnd )
{
if ( nStart )
pArray->Search( nStart, nPos );
else
nPos = 0;
}
inline const ScPatternAttr* ScAttrIterator::Next( USHORT& rTop, USHORT& rBottom )
{
const ScPatternAttr* pRet;
if ( nPos < (short) pArray->nCount && nRow <= nEndRow )
{
rTop = nRow;
rBottom = Min( pArray->pData[nPos].nRow, nEndRow );
pRet = pArray->pData[nPos].pPattern;
nRow = rBottom + 1;
++nPos;
}
else
pRet = NULL;
return pRet;
}
#endif