diff options
Diffstat (limited to 'bf_sc/source/core/data/sc_olinetab.cxx')
-rw-r--r-- | bf_sc/source/core/data/sc_olinetab.cxx | 556 |
1 files changed, 556 insertions, 0 deletions
diff --git a/bf_sc/source/core/data/sc_olinetab.cxx b/bf_sc/source/core/data/sc_olinetab.cxx new file mode 100644 index 000000000..b146fa79c --- /dev/null +++ b/bf_sc/source/core/data/sc_olinetab.cxx @@ -0,0 +1,556 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +#include <tools/debug.hxx> +#include <limits.h> + + +#include "olinetab.hxx" +#include "global.hxx" +#include "rechead.hxx" +namespace binfilter { + +//------------------------------------------------------------------------ + +/*N*/ ScOutlineEntry::ScOutlineEntry( USHORT nNewStart, USHORT nNewSize, BOOL bNewHidden ) : +/*N*/ nStart ( nNewStart ), +/*N*/ nSize ( nNewSize ), +/*N*/ bHidden ( bNewHidden ), +/*N*/ bVisible( TRUE ) +/*N*/ { +/*N*/ } + +/*N*/ ScOutlineEntry::ScOutlineEntry( const ScOutlineEntry& rEntry ) : DataObject(rEntry), +/*N*/ nStart ( rEntry.nStart ), +/*N*/ nSize ( rEntry.nSize ), +/*N*/ bHidden ( rEntry.bHidden ), +/*N*/ bVisible( rEntry.bVisible ) +/*N*/ { +/*N*/ } + +/*N*/ ScOutlineEntry::ScOutlineEntry( SvStream& rStream, ScMultipleReadHeader& rHdr ) +/*N*/ { +/*N*/ rHdr.StartEntry(); +/*N*/ +/*N*/ rStream >> nStart; +/*N*/ rStream >> nSize; +/*N*/ rStream >> bHidden; +/*N*/ rStream >> bVisible; +/*N*/ +/*N*/ rHdr.EndEntry(); +/*N*/ } + +/*N*/ DataObject* ScOutlineEntry::Clone() const +/*N*/ { +/*N*/ return new ScOutlineEntry( *this ); +/*N*/ } + +/*N*/ void ScOutlineEntry::Move( short nDelta ) +/*N*/ { +/*N*/ short nNewPos = ((short) nStart) + nDelta; +/*N*/ if (nNewPos<0) +/*N*/ { +/*N*/ OSL_FAIL("OutlineEntry < 0"); +/*N*/ nNewPos = 0; +/*N*/ } +/*N*/ nStart = (USHORT) nNewPos; +/*N*/ } + +/*N*/ void ScOutlineEntry::SetSize( USHORT nNewSize ) +/*N*/ { +/*N*/ if (nNewSize) +/*N*/ nSize = nNewSize; +/*N*/ else +/*N*/ OSL_FAIL("ScOutlineEntry Size == 0"); +/*N*/ } + +/*N*/ void ScOutlineEntry::SetPosSize( USHORT nNewPos, USHORT nNewSize ) +/*N*/ { +/*N*/ nStart = nNewPos; +/*N*/ SetSize( nNewSize ); +/*N*/ } + +/*N*/ void ScOutlineEntry::SetVisible( BOOL bNewVisible ) +/*N*/ { +/*N*/ bVisible = bNewVisible; +/*N*/ } + +//------------------------------------------------------------------------ + +/*N*/ ScOutlineCollection::ScOutlineCollection() : +/*N*/ SortedCollection( 4,4,FALSE ) +/*N*/ { +/*N*/ } + +/*N*/ inline short IntCompare( USHORT nX, USHORT nY ) +/*N*/ { +/*N*/ if ( nX==nY ) return 0; +/*N*/ else if ( nX<nY ) return -1; +/*N*/ else return 1; +/*N*/ } + +/*N*/ short ScOutlineCollection::Compare(DataObject* pKey1, DataObject* pKey2) const +/*N*/ { +/*N*/ return IntCompare( ((ScOutlineEntry*)pKey1)->GetStart(), +/*N*/ ((ScOutlineEntry*)pKey2)->GetStart() ); +/*N*/ } +/*N*/ + +//------------------------------------------------------------------------ + +/*N*/ ScOutlineArray::ScOutlineArray() : +/*N*/ nDepth( 0 ) +/*N*/ { +/*N*/ } + +/*N*/ ScOutlineArray::ScOutlineArray( const ScOutlineArray& rArray ) : +/*N*/ nDepth( rArray.nDepth ) +/*N*/ { +/*N*/ for (USHORT nLevel=0; nLevel<nDepth; nLevel++) +/*N*/ { +/*N*/ USHORT nCount = rArray.aCollections[nLevel].GetCount(); +/*N*/ for (USHORT nEntry=0; nEntry<nCount; nEntry++) +/*N*/ { +/*N*/ ScOutlineEntry* pEntry = (ScOutlineEntry*) rArray.aCollections[nLevel].At(nEntry); +/*N*/ aCollections[nLevel].Insert( new ScOutlineEntry( *pEntry ) ); +/*N*/ } +/*N*/ } +/*N*/ } + +/*N*/ void ScOutlineArray::FindEntry( USHORT nSearchPos, USHORT& rFindLevel, USHORT& rFindIndex, +/*N*/ USHORT nMaxLevel ) +/*N*/ { +/*N*/ rFindLevel = rFindIndex = 0; +/*N*/ +/*N*/ if (nMaxLevel > nDepth) +/*N*/ nMaxLevel = nDepth; +/*N*/ +/*N*/ for (USHORT nLevel=0; nLevel<nMaxLevel; nLevel++) //! rueckwaerts suchen ? +/*N*/ { +/*N*/ ScOutlineCollection* pCollect = &aCollections[nLevel]; +/*N*/ USHORT nCount = pCollect->GetCount(); +/*N*/ for (USHORT i=0; i<nCount; i++) +/*N*/ { +/*N*/ ScOutlineEntry* pEntry = (ScOutlineEntry*) pCollect->At(i); +/*N*/ if ( pEntry->GetStart() <= nSearchPos && pEntry->GetEnd() >= nSearchPos ) +/*N*/ { +/*N*/ rFindLevel = nLevel + 1; // naechster Level (zum Einfuegen) +/*N*/ rFindIndex = i; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } + +/*N*/ BOOL ScOutlineArray::Insert( USHORT nStartCol, USHORT nEndCol, BOOL& rSizeChanged, +/*N*/ BOOL bHidden, BOOL bVisible ) +/*N*/ { +/*N*/ rSizeChanged = FALSE; +/*N*/ +/*N*/ USHORT nStartLevel; +/*N*/ USHORT nStartIndex; +/*N*/ USHORT nEndLevel; +/*N*/ USHORT nEndIndex; +/*N*/ BOOL bFound = FALSE; +/*N*/ +/*N*/ BOOL bCont; +/*N*/ USHORT nFindMax; +/*N*/ FindEntry( nStartCol, nStartLevel, nStartIndex ); // nLevel = neuer Level (alter+1) !!! +/*N*/ FindEntry( nEndCol, nEndLevel, nEndIndex ); +/*N*/ nFindMax = Max(nStartLevel,nEndLevel); +/*N*/ do +/*N*/ { +/*N*/ bCont = FALSE; +/*N*/ +/*N*/ if ( nStartLevel == nEndLevel && nStartIndex == nEndIndex && nStartLevel < SC_OL_MAXDEPTH ) +/*N*/ bFound = TRUE; +/*N*/ +/*N*/ if (!bFound) +/*N*/ { +/*N*/ if (nFindMax>0) +/*N*/ { +/*N*/ --nFindMax; +/*N*/ if (nStartLevel) +/*N*/ if ( ((ScOutlineEntry*)aCollections[nStartLevel-1].At(nStartIndex))-> +/*N*/ GetStart() == nStartCol ) +/*N*/ FindEntry( nStartCol, nStartLevel, nStartIndex, nFindMax ); +/*N*/ if (nEndLevel) +/*?*/ if ( ((ScOutlineEntry*)aCollections[nEndLevel-1].At(nEndIndex))-> +/*?*/ GetEnd() == nEndCol ) +/*N*/ FindEntry( nEndCol, nEndLevel, nEndIndex, nFindMax ); +/*N*/ bCont = TRUE; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ while ( !bFound && bCont ); +/*N*/ +/*N*/ if (!bFound) +/*N*/ return FALSE; +/*N*/ +/*N*/ USHORT nLevel = nStartLevel; +/*N*/ +/*N*/ // untere verschieben +/*N*/ +/*N*/ BOOL bNeedSize = FALSE; +/*N*/ for ( short nMoveLevel = nDepth-1; nMoveLevel >= (short) nLevel; nMoveLevel-- ) +/*N*/ { +/*N*/ USHORT nCount = aCollections[nMoveLevel].GetCount(); +/*N*/ BOOL bMoved = FALSE; +/*N*/ for ( USHORT i=0; i<nCount; i += bMoved ? 0 : 1 ) +/*N*/ { +/*N*/ ScOutlineEntry* pEntry = (ScOutlineEntry*) aCollections[nMoveLevel].At(i); +/*N*/ USHORT nEntryStart = pEntry->GetStart(); +/*N*/ if ( nEntryStart >= nStartCol && nEntryStart <= nEndCol ) +/*N*/ { +/*N*/ if (nMoveLevel >= SC_OL_MAXDEPTH - 1) +/*N*/ { +/*?*/ rSizeChanged = FALSE; // kein Platz +/*?*/ return FALSE; +/*N*/ } +/*N*/ aCollections[nMoveLevel+1].Insert( new ScOutlineEntry( *pEntry ) ); +/*N*/ aCollections[nMoveLevel].AtFree( i ); +/*N*/ nCount = aCollections[nMoveLevel].GetCount(); +/*N*/ bMoved = TRUE; +/*N*/ if (nMoveLevel == (short) nDepth - 1) +/*N*/ bNeedSize = TRUE; +/*N*/ } +/*N*/ else +/*N*/ bMoved = FALSE; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if (bNeedSize) +/*N*/ { +/*N*/ ++nDepth; +/*N*/ rSizeChanged = TRUE; +/*N*/ } +/*N*/ +/*N*/ if (nDepth <= nLevel) +/*N*/ { +/*N*/ nDepth = nLevel+1; +/*N*/ rSizeChanged = TRUE; +/*N*/ } +/*N*/ +/*N*/ ScOutlineEntry* pNewEntry = new ScOutlineEntry( nStartCol, nEndCol+1-nStartCol, bHidden ); +/*N*/ pNewEntry->SetVisible( bVisible ); +/*N*/ aCollections[nLevel].Insert( pNewEntry ); +/*N*/ +/*N*/ return TRUE; +/*N*/ } + + + + +/*N*/ BOOL ScOutlineArray::DecDepth() // nDepth auf leere Levels anpassen +/*N*/ { +/*N*/ BOOL bChanged = FALSE; +/*N*/ BOOL bCont; +/*N*/ do +/*N*/ { +/*N*/ bCont = FALSE; +/*N*/ if (nDepth) +/*N*/ if (aCollections[nDepth-1].GetCount() == 0) +/*N*/ { +/*N*/ --nDepth; +/*N*/ bChanged = TRUE; +/*N*/ bCont = TRUE; +/*N*/ } +/*N*/ } +/*N*/ while (bCont); +/*N*/ return bChanged; +/*N*/ } + + +/*M*/ ScOutlineEntry* ScOutlineArray::GetEntry( USHORT nLevel, USHORT nIndex ) const +/*M*/ { +/*M*/ return (ScOutlineEntry*)((nLevel < nDepth) ? aCollections[nLevel].At(nIndex) : NULL); +/*M*/ } + +/*M*/ USHORT ScOutlineArray::GetCount( USHORT nLevel ) const +/*M*/ { +/*M*/ return (nLevel < nDepth) ? aCollections[nLevel].GetCount() : 0; +/*M*/ } + + +/*M*/ void ScOutlineArray::SetVisibleBelow( USHORT nLevel, USHORT nEntry, BOOL bValue, BOOL bSkipHidden ) +/*M*/ { +/*M*/ ScOutlineEntry* pEntry = GetEntry( nLevel, nEntry ); +/*M*/ if( pEntry ) +/*M*/ { +/*M*/ USHORT nStart = pEntry->GetStart(); +/*M*/ USHORT nEnd = pEntry->GetEnd(); +/*M*/ +/*M*/ for (USHORT nSubLevel=nLevel+1; nSubLevel<nDepth; nSubLevel++) +/*M*/ { +/*M*/ USHORT i = 0; +/*M*/ pEntry = (ScOutlineEntry*) aCollections[nSubLevel].At(i); +/*M*/ while (pEntry) +/*M*/ { +/*M*/ if (pEntry->GetStart() >= nStart && pEntry->GetEnd() <= nEnd) +/*M*/ { +/*M*/ pEntry->SetVisible(bValue); +/*M*/ +/*M*/ if (bSkipHidden) +/*M*/ if (!pEntry->IsHidden()) +/*M*/ SetVisibleBelow( nSubLevel, i, bValue, TRUE ); +/*M*/ } +/*M*/ +/*M*/ ++i; +/*M*/ pEntry = (ScOutlineEntry*) aCollections[nSubLevel].At(i); +/*M*/ } +/*M*/ +/*M*/ if (bSkipHidden) +/*M*/ nSubLevel = nDepth; // Abbruch +/*M*/ } +/*M*/ } +/*M*/ } + + + +/*N*/ BOOL ScOutlineArray::TestInsertSpace( USHORT nSize, USHORT nMaxVal ) const +/*N*/ { +/*N*/ USHORT nCount = aCollections[0].GetCount(); +/*N*/ if (nCount) +/*N*/ { +/*N*/ USHORT nEnd = ((ScOutlineEntry*) aCollections[0].At(nCount-1))->GetEnd(); +/*N*/ return ( nEnd+nSize <= nMaxVal ); +/*N*/ } +/*N*/ +/*N*/ return TRUE; +/*N*/ } + +/*N*/ void ScOutlineArray::InsertSpace( USHORT nStartPos, USHORT nSize ) +/*N*/ { +/*N*/ ScSubOutlineIterator aIter( this ); +/*N*/ ScOutlineEntry* pEntry; +/*N*/ while((pEntry=aIter.GetNext())!=NULL) +/*N*/ { +/*N*/ if ( pEntry->GetStart() >= nStartPos ) +/*N*/ pEntry->Move(nSize); +/*N*/ else +/*N*/ { +/*N*/ USHORT nEnd = pEntry->GetEnd(); +/*N*/ // immer erweitern, wenn innerhalb der Gruppe eingefuegt +/*N*/ // beim Einfuegen am Ende nur, wenn die Gruppe nicht ausgeblendet ist +/*N*/ if ( nEnd >= nStartPos || ( nEnd+1 >= nStartPos && !pEntry->IsHidden() ) ) +/*N*/ { +/*N*/ USHORT nEntrySize = pEntry->GetSize(); +/*N*/ nEntrySize += nSize; +/*N*/ pEntry->SetSize( nEntrySize ); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } + +/*N*/ BOOL ScOutlineArray::DeleteSpace( USHORT nStartPos, USHORT nSize ) +/*N*/ { +/*N*/ USHORT nEndPos = nStartPos + nSize - 1; +/*N*/ BOOL bNeedSave = FALSE; // Original fuer Undo benoetigt? +/*N*/ BOOL bChanged = FALSE; // fuer Test auf Level +/*N*/ +/*N*/ ScSubOutlineIterator aIter( this ); +/*N*/ ScOutlineEntry* pEntry; +/*N*/ while((pEntry=aIter.GetNext())!=NULL) +/*N*/ { +/*N*/ USHORT nEntryStart = pEntry->GetStart(); +/*N*/ USHORT nEntryEnd = pEntry->GetEnd(); +/*N*/ USHORT nEntrySize = pEntry->GetSize(); +/*N*/ +/*N*/ if ( nEntryEnd >= nStartPos ) +/*N*/ { +/*N*/ if ( nEntryStart > nEndPos ) // rechts +/*N*/ pEntry->Move(-(short)nSize); +/*N*/ else if ( nEntryStart < nStartPos && nEntryEnd >= nEndPos ) // aussen +/*N*/ pEntry->SetSize( nEntrySize-nSize ); +/*N*/ else +/*N*/ { +/*N*/ bNeedSave = TRUE; +/*N*/ if ( nEntryStart >= nStartPos && nEntryEnd <= nEndPos ) // innen +/*N*/ { +/*N*/ aIter.DeleteLast(); +/*N*/ bChanged = TRUE; +/*N*/ } +/*N*/ else if ( nEntryStart >= nStartPos ) // rechts ueber +/*N*/ pEntry->SetPosSize( nStartPos, nEntryEnd-nEndPos ); +/*N*/ else // links ueber +/*N*/ pEntry->SetSize( nStartPos-nEntryStart ); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if (bChanged) +/*N*/ DecDepth(); +/*N*/ +/*N*/ return bNeedSave; +/*N*/ } + +/*N*/ BOOL ScOutlineArray::ManualAction( USHORT nStartPos, USHORT nEndPos, BOOL bShow, BYTE* pHiddenFlags ) +/*N*/ { +/*N*/ BOOL bModified = FALSE; +/*N*/ ScSubOutlineIterator aIter( this ); +/*N*/ ScOutlineEntry* pEntry; +/*N*/ while((pEntry=aIter.GetNext())!=NULL) +/*N*/ { +/*N*/ USHORT nEntryStart = pEntry->GetStart(); +/*N*/ USHORT nEntryEnd = pEntry->GetEnd(); +/*N*/ +/*N*/ if (nEntryEnd>=nStartPos && nEntryStart<=nEndPos) +/*N*/ { +/*?*/ if ( pEntry->IsHidden() == bShow ) +/*?*/ { +/*?*/ // #i12341# hide if all columns/rows are hidden, show if at least one +/*?*/ // is visible +/*?*/ +/*?*/ BOOL bAllHidden = TRUE; +/*?*/ for ( USHORT i=nEntryStart; i<=nEntryEnd && bAllHidden; i++ ) +/*?*/ if ( ( pHiddenFlags[i] & CR_HIDDEN ) == 0 ) +/*?*/ bAllHidden = FALSE; +/*?*/ } +/*N*/ } +/*N*/ } +/*N*/ return bModified; +/*N*/ } + + +/*N*/ void ScOutlineArray::Load( SvStream& rStream ) +/*N*/ { +/*N*/ ScMultipleReadHeader aHdr( rStream ); +/*N*/ +/*N*/ rStream >> nDepth; +/*N*/ for (USHORT nLevel=0; nLevel<nDepth; nLevel++) +/*N*/ { +/*N*/ USHORT nCount; +/*N*/ rStream >> nCount; +/*N*/ for (USHORT nIndex=0; nIndex<nCount; nIndex++) +/*N*/ { +/*N*/ ScOutlineEntry* pEntry = new ScOutlineEntry( rStream, aHdr ); +/*N*/ aCollections[nLevel].Insert( pEntry ); +/*N*/ } +/*N*/ } +/*N*/ } + +/*N*/ ScOutlineTable::ScOutlineTable() +/*N*/ { +/*N*/ } + +/*N*/ ScOutlineTable::ScOutlineTable( const ScOutlineTable& rOutline ) : +/*N*/ aColOutline( rOutline.aColOutline ), +/*N*/ aRowOutline( rOutline.aRowOutline ) +/*N*/ { +/*N*/ } + +/*N*/ BOOL ScOutlineTable::TestInsertCol( USHORT nSize ) +/*N*/ { +/*N*/ return aColOutline.TestInsertSpace( nSize, MAXCOL ); +/*N*/ } + +/*N*/ void ScOutlineTable::InsertCol( USHORT nStartCol, USHORT nSize ) +/*N*/ { +/*N*/ aColOutline.InsertSpace( nStartCol, nSize ); +/*N*/ } + +/*N*/ BOOL ScOutlineTable::DeleteCol( USHORT nStartCol, USHORT nSize ) +/*N*/ { +/*N*/ return aColOutline.DeleteSpace( nStartCol, nSize ); +/*N*/ } + +/*N*/ BOOL ScOutlineTable::TestInsertRow( USHORT nSize ) +/*N*/ { +/*N*/ return aRowOutline.TestInsertSpace( nSize, MAXROW ); +/*N*/ } + +/*N*/ void ScOutlineTable::InsertRow( USHORT nStartRow, USHORT nSize ) +/*N*/ { +/*N*/ aRowOutline.InsertSpace( nStartRow, nSize ); +/*N*/ } + +/*N*/ BOOL ScOutlineTable::DeleteRow( USHORT nStartRow, USHORT nSize ) +/*N*/ { +/*N*/ return aRowOutline.DeleteSpace( nStartRow, nSize ); +/*N*/ } + +/*N*/ void ScOutlineTable::Load( SvStream& rStream ) +/*N*/ { +/*N*/ DBG_ASSERT( aColOutline.GetDepth()==0 && aRowOutline.GetDepth()==0, +/*N*/ "Load auf nicht leere ScOutlineTable" ); +/*N*/ aColOutline.Load( rStream ); +/*N*/ aRowOutline.Load( rStream ); +/*N*/ } + +/*N*/ ScSubOutlineIterator::ScSubOutlineIterator( ScOutlineArray* pOutlineArray ) : +/*N*/ pArray( pOutlineArray ), +/*N*/ nStart( 0 ), +/*N*/ nEnd( USHRT_MAX ), // alle durchgehen +/*N*/ nSubLevel( 0 ), +/*N*/ nSubEntry( 0 ) +/*N*/ { +/*N*/ nDepth = pArray->nDepth; +/*N*/ } + +/*N*/ +/*N*/ ScOutlineEntry* ScSubOutlineIterator::GetNext() +/*N*/ { +/*N*/ ScOutlineEntry* pEntry; +/*N*/ BOOL bFound = FALSE; +/*N*/ do +/*N*/ { +/*N*/ if (nSubLevel >= nDepth) +/*N*/ return NULL; +/*N*/ +/*N*/ pEntry = (ScOutlineEntry*) pArray->aCollections[nSubLevel].At(nSubEntry); +/*N*/ if (!pEntry) +/*N*/ { +/*N*/ nSubEntry = 0; +/*N*/ ++nSubLevel; +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ if ( pEntry->GetStart() >= nStart && pEntry->GetEnd() <= nEnd ) +/*N*/ bFound = TRUE; +/*N*/ ++nSubEntry; +/*N*/ } +/*N*/ } +/*N*/ while (!bFound); +/*N*/ return pEntry; // nSubLevel gueltig, wenn pEntry != 0 +/*N*/ } +/*N*/ +/*N*/ void ScSubOutlineIterator::DeleteLast() +/*N*/ { +/*N*/ if (nSubLevel >= nDepth) +/*N*/ { +/*N*/ OSL_FAIL("ScSubOutlineIterator::DeleteLast nach Ende"); +/*N*/ return; +/*N*/ } +/*N*/ if (nSubEntry == 0) +/*N*/ { +/*N*/ OSL_FAIL("ScSubOutlineIterator::DeleteLast vor GetNext"); +/*N*/ return; +/*N*/ } +/*N*/ +/*N*/ --nSubEntry; +/*N*/ pArray->aCollections[nSubLevel].AtFree(nSubEntry); +/*N*/ } + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |