summaryrefslogtreecommitdiff
path: root/editeng/source/outliner/outliner.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/outliner/outliner.cxx')
-rw-r--r--editeng/source/outliner/outliner.cxx2193
1 files changed, 0 insertions, 2193 deletions
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
deleted file mode 100644
index 7e23e18235..0000000000
--- a/editeng/source/outliner/outliner.cxx
+++ /dev/null
@@ -1,2193 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_editeng.hxx"
-
-#include <svl/intitem.hxx>
-#include <editeng/editeng.hxx>
-#include <editeng/editview.hxx>
-#include <editeng/editdata.hxx>
-#include <editeng/eerdll.hxx>
-#include <editeng/lrspitem.hxx>
-#include <editeng/fhgtitem.hxx>
-
-#include <math.h>
-#include <svl/style.hxx>
-#include <vcl/wrkwin.hxx>
-#define _OUTLINER_CXX
-#include <editeng/outliner.hxx>
-#include <paralist.hxx>
-#include <editeng/outlobj.hxx>
-#include <outleeng.hxx>
-#include <outlundo.hxx>
-#include <editeng/eeitem.hxx>
-#include <editeng/editstat.hxx>
-#include <editeng/scripttypeitem.hxx>
-#include <editeng/editobj.hxx>
-#include <svl/itemset.hxx>
-#include <svl/whiter.hxx>
-#include <vcl/metric.hxx>
-#include <editeng/numitem.hxx>
-#include <editeng/adjitem.hxx>
-#include <vcl/graph.hxx>
-#include <vcl/gdimtf.hxx>
-#include <vcl/metaact.hxx>
-#include <svtools/grfmgr.hxx>
-#include <editeng/svxfont.hxx>
-#include <editeng/brshitem.hxx>
-#include <svl/itempool.hxx>
-
-// calculate if it's RTL or not
-#include <unicode/ubidi.h>
-#include <cassert>
-using ::std::advance;
-
-#define DEFAULT_SCALE 75
-
-static const sal_uInt16 nDefStyles = 3; // Special treatment for the first 3 levels
-static const sal_uInt16 nDefBulletIndent = 800;
-static const sal_uInt16 nDefBulletWidth = 700;
-static const sal_uInt16 pDefBulletIndents[nDefStyles]= { 1400, 800, 800 };
-static const sal_uInt16 pDefBulletWidths[nDefStyles] = { 1000, 850, 700 };
-
-// ----------------------------------------------------------------------
-// Outliner
-// ----------------------------------------------------------------------
-DBG_NAME(Outliner);
-
-void Outliner::ImplCheckDepth( sal_Int16& rnDepth ) const
-{
- if( rnDepth < nMinDepth )
- rnDepth = nMinDepth;
- else if( rnDepth > nMaxDepth )
- rnDepth = nMaxDepth;
-}
-
-Paragraph* Outliner::Insert(const XubString& rText, sal_uLong nAbsPos, sal_Int16 nDepth)
-{
- DBG_CHKTHIS(Outliner,0);
- DBG_ASSERT(pParaList->GetParagraphCount(),"Insert:No Paras");
-
- Paragraph* pPara;
-
- ImplCheckDepth( nDepth );
-
- sal_uLong nParagraphCount = pParaList->GetParagraphCount();
- if( nAbsPos > nParagraphCount )
- nAbsPos = nParagraphCount;
-
- if( bFirstParaIsEmpty )
- {
- pPara = pParaList->GetParagraph( 0 );
- if( pPara->GetDepth() != nDepth )
- {
- nDepthChangedHdlPrevDepth = pPara->GetDepth();
- mnDepthChangeHdlPrevFlags = pPara->nFlags;
- pPara->SetDepth( nDepth );
- pHdlParagraph = pPara;
- DepthChangedHdl();
- }
- pPara->nFlags |= PARAFLAG_HOLDDEPTH;
- SetText( rText, pPara );
- }
- else
- {
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
- ImplBlockInsertionCallbacks( sal_True );
- pPara = new Paragraph( nDepth );
- pParaList->Insert( pPara, nAbsPos );
- pEditEngine->InsertParagraph( (sal_uInt16)nAbsPos, String() );
- DBG_ASSERT(pPara==pParaList->GetParagraph(nAbsPos),"Insert:Failed");
- ImplInitDepth( (sal_uInt16)nAbsPos, nDepth, sal_False );
- pHdlParagraph = pPara;
- ParagraphInsertedHdl();
- pPara->nFlags |= PARAFLAG_HOLDDEPTH;
- SetText( rText, pPara );
- ImplBlockInsertionCallbacks( sal_False );
- pEditEngine->SetUpdateMode( bUpdate );
- }
- bFirstParaIsEmpty = sal_False;
- DBG_ASSERT(pEditEngine->GetParagraphCount()==pParaList->GetParagraphCount(),"SetText failed");
- return pPara;
-}
-
-
-void Outliner::ParagraphInserted( sal_uInt16 nPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- if ( bBlockInsCallback )
- return;
-
- if( bPasting || pEditEngine->IsInUndo() )
- {
- Paragraph* pPara = new Paragraph( -1 );
- pParaList->Insert( pPara, nPara );
- if( pEditEngine->IsInUndo() )
- {
- pPara->nFlags = PARAFLAG_SETBULLETTEXT;
- pPara->bVisible = sal_True;
- const SfxInt16Item& rLevel = (const SfxInt16Item&) pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
- pPara->SetDepth( rLevel.GetValue() );
- }
- }
- else
- {
- sal_Int16 nDepth = -1;
- Paragraph* pParaBefore = pParaList->GetParagraph( nPara-1 );
- if ( pParaBefore )
- nDepth = pParaBefore->GetDepth();
-
- Paragraph* pPara = new Paragraph( nDepth );
- pParaList->Insert( pPara, nPara );
-
- if( !pEditEngine->IsInUndo() )
- {
- ImplCalcBulletText( nPara, sal_True, sal_False );
- pHdlParagraph = pPara;
- ParagraphInsertedHdl();
- }
- }
-}
-
-void Outliner::ParagraphDeleted( sal_uInt16 nPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- if ( bBlockInsCallback || ( nPara == EE_PARA_ALL ) )
- return;
-
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (!pPara)
- return;
-
- sal_Int16 nDepth = pPara->GetDepth();
-
- if( !pEditEngine->IsInUndo() )
- {
- pHdlParagraph = pPara;
- ParagraphRemovingHdl();
- }
-
- pParaList->Remove( nPara );
- delete pPara;
-
- if( !pEditEngine->IsInUndo() && !bPasting )
- {
- pPara = pParaList->GetParagraph( nPara );
- if ( pPara && ( pPara->GetDepth() > nDepth ) )
- {
- ImplCalcBulletText( nPara, sal_True, sal_False );
- // Search for next on the this level ...
- while ( pPara && pPara->GetDepth() > nDepth )
- pPara = pParaList->GetParagraph( ++nPara );
- }
-
- if ( pPara && ( pPara->GetDepth() == nDepth ) )
- ImplCalcBulletText( nPara, sal_True, sal_False );
- }
-}
-
-void Outliner::Init( sal_uInt16 nMode )
-{
- nOutlinerMode = nMode;
-
- Clear();
-
- sal_uLong nCtrl = pEditEngine->GetControlWord();
- nCtrl &= ~(EE_CNTRL_OUTLINER|EE_CNTRL_OUTLINER2);
-
- SetMaxDepth( 9 );
-
- switch ( ImplGetOutlinerMode() )
- {
- case OUTLINERMODE_TEXTOBJECT:
- case OUTLINERMODE_TITLEOBJECT:
- break;
-
- case OUTLINERMODE_OUTLINEOBJECT:
- nCtrl |= EE_CNTRL_OUTLINER2;
- break;
- case OUTLINERMODE_OUTLINEVIEW:
- nCtrl |= EE_CNTRL_OUTLINER;
- break;
-
- default: OSL_FAIL( "Outliner::Init - Invalid Mode!" );
- }
-
- pEditEngine->SetControlWord( nCtrl );
-
- ImplInitDepth( 0, GetMinDepth(), sal_False );
-
- GetUndoManager().Clear();
-}
-
-void Outliner::SetMaxDepth( sal_Int16 nDepth, sal_Bool bCheckParagraphs )
-{
- if( nMaxDepth != nDepth )
- {
- nMaxDepth = Min( nDepth, (sal_Int16)(SVX_MAX_NUM-1) );
-
- if( bCheckParagraphs )
- {
- sal_uInt16 nParagraphs = (sal_uInt16)pParaList->GetParagraphCount();
- for ( sal_uInt16 nPara = 0; nPara < nParagraphs; nPara++ )
- {
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if( pPara && pPara->GetDepth() > nMaxDepth )
- {
- SetDepth( pPara, nMaxDepth );
- }
- }
- }
- }
-}
-
-sal_Int16 Outliner::GetDepth( sal_uLong nPara ) const
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- DBG_ASSERT( pPara, "Outliner::GetDepth - Paragraph not found!" );
- return pPara ? pPara->GetDepth() : -1;
-}
-
-void Outliner::SetDepth( Paragraph* pPara, sal_Int16 nNewDepth )
-{
- DBG_CHKTHIS(Outliner,0);
-
- ImplCheckDepth( nNewDepth );
-
- if ( nNewDepth != pPara->GetDepth() )
- {
- nDepthChangedHdlPrevDepth = pPara->GetDepth();
- mnDepthChangeHdlPrevFlags = pPara->nFlags;
- pHdlParagraph = pPara;
-
- sal_uInt16 nPara = (sal_uInt16)GetAbsPos( pPara );
- ImplInitDepth( nPara, nNewDepth, sal_True );
- ImplCalcBulletText( nPara, sal_False, sal_False );
-
- if ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT )
- ImplSetLevelDependendStyleSheet( nPara );
-
- DepthChangedHdl();
- }
-}
-
-sal_Int16 Outliner::GetNumberingStartValue( sal_uInt16 nPara )
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- DBG_ASSERT( pPara, "Outliner::GetNumberingStartValue - Paragraph not found!" );
- return pPara ? pPara->GetNumberingStartValue() : -1;
-}
-
-void Outliner::SetNumberingStartValue( sal_uInt16 nPara, sal_Int16 nNumberingStartValue )
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- DBG_ASSERT( pPara, "Outliner::GetNumberingStartValue - Paragraph not found!" );
- if( pPara && pPara->GetNumberingStartValue() != nNumberingStartValue )
- {
- if( IsUndoEnabled() && !IsInUndo() )
- InsertUndo( new OutlinerUndoChangeParaNumberingRestart( this, nPara,
- pPara->GetNumberingStartValue(), nNumberingStartValue,
- pPara->IsParaIsNumberingRestart(), pPara->IsParaIsNumberingRestart() ) );
-
- pPara->SetNumberingStartValue( nNumberingStartValue );
- // #i100014#
- // It is not a good idea to substract 1 from a count and cast the result
- // to USHORT without check, if the count is 0.
- ImplCheckParagraphs( nPara, (sal_uInt16) (pParaList->GetParagraphCount()) );
- pEditEngine->SetModified();
- }
-}
-
-sal_Bool Outliner::IsParaIsNumberingRestart( sal_uInt16 nPara )
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- DBG_ASSERT( pPara, "Outliner::IsParaIsNumberingRestart - Paragraph not found!" );
- return pPara ? pPara->IsParaIsNumberingRestart() : sal_False;
-}
-
-void Outliner::SetParaIsNumberingRestart( sal_uInt16 nPara, sal_Bool bParaIsNumberingRestart )
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- DBG_ASSERT( pPara, "Outliner::SetParaIsNumberingRestart - Paragraph not found!" );
- if( pPara && (pPara->IsParaIsNumberingRestart() != bParaIsNumberingRestart) )
- {
- if( IsUndoEnabled() && !IsInUndo() )
- InsertUndo( new OutlinerUndoChangeParaNumberingRestart( this, nPara,
- pPara->GetNumberingStartValue(), pPara->GetNumberingStartValue(),
- pPara->IsParaIsNumberingRestart(), bParaIsNumberingRestart ) );
-
- pPara->SetParaIsNumberingRestart( bParaIsNumberingRestart );
- // #i100014#
- // It is not a good idea to substract 1 from a count and cast the result
- // to USHORT without check, if the count is 0.
- ImplCheckParagraphs( nPara, (sal_uInt16) (pParaList->GetParagraphCount()) );
- pEditEngine->SetModified();
- }
-}
-
-OutlinerParaObject* Outliner::CreateParaObject( sal_uInt16 nStartPara, sal_uInt16 nCount ) const
-{
- DBG_CHKTHIS(Outliner,0);
-
- if ( sal::static_int_cast< sal_uLong >( nStartPara + nCount ) >
- pParaList->GetParagraphCount() )
- nCount = sal::static_int_cast< sal_uInt16 >(
- pParaList->GetParagraphCount() - nStartPara );
-
- // When a new OutlinerParaObject is created because a paragraph is just beeing deleted,
- // it can happen that the ParaList is not updated yet...
- if ( ( nStartPara + nCount ) > pEditEngine->GetParagraphCount() )
- nCount = pEditEngine->GetParagraphCount() - nStartPara;
-
- if( !nCount )
- return NULL;
-
- EditTextObject* pText = pEditEngine->CreateTextObject( nStartPara, nCount );
- const bool bIsEditDoc(OUTLINERMODE_TEXTOBJECT == ImplGetOutlinerMode());
- ParagraphDataVector aParagraphDataVector(nCount);
- const sal_uInt16 nLastPara(nStartPara + nCount - 1);
-
- for(sal_uInt16 nPara(nStartPara); nPara <= nLastPara; nPara++)
- {
- aParagraphDataVector[nPara-nStartPara] = *GetParagraph(nPara);
- }
-
- OutlinerParaObject* pPObj = new OutlinerParaObject(*pText, aParagraphDataVector, bIsEditDoc);
- pPObj->SetOutlinerMode(GetMode());
- delete pText;
-
- return pPObj;
-}
-
-void Outliner::SetText( const XubString& rText, Paragraph* pPara )
-{
- DBG_CHKTHIS(Outliner,0);
- DBG_ASSERT(pPara,"SetText:No Para");
-
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
- ImplBlockInsertionCallbacks( sal_True );
-
- sal_uInt16 nPara = (sal_uInt16)pParaList->GetAbsPos( pPara );
-
- if( !rText.Len() )
- {
- pEditEngine->SetText( nPara, rText );
- ImplInitDepth( nPara, pPara->GetDepth(), sal_False );
- }
- else
- {
- XubString aText( rText );
- aText.ConvertLineEnd( LINEEND_LF );
-
- if( aText.GetChar( aText.Len()-1 ) == '\x0A' )
- aText.Erase( aText.Len()-1, 1 ); // Delete the last break
-
- sal_uInt16 nCount = aText.GetTokenCount( '\x0A' );
- sal_uInt16 nPos = 0;
- sal_uInt16 nInsPos = nPara+1;
- while( nCount > nPos )
- {
- XubString aStr = aText.GetToken( nPos, '\x0A' );
-
- sal_Int16 nCurDepth;
- if( nPos )
- {
- pPara = new Paragraph( -1 );
- nCurDepth = -1;
- }
- else
- nCurDepth = pPara->GetDepth();
-
- // In the outliner mode, filter the tabs and set the indentation
- // about a LRSpaceItem. In EditEngine mode intend over old tabs
- if( ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) ||
- ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEVIEW ) )
- {
- // Extract Tabs
- sal_uInt16 nTabs = 0;
- while ( ( nTabs < aStr.Len() ) && ( aStr.GetChar( nTabs ) == '\t' ) )
- nTabs++;
- if ( nTabs )
- aStr.Erase( 0, nTabs );
-
- // Keep depth? (see Outliner::Insert)
- if( !(pPara->nFlags & PARAFLAG_HOLDDEPTH) )
- {
- nCurDepth = nTabs-1;
- ImplCheckDepth( nCurDepth );
- pPara->SetDepth( nCurDepth );
- pPara->nFlags &= (~PARAFLAG_HOLDDEPTH);
- }
- }
- if( nPos ) // not with the first paragraph
- {
- pParaList->Insert( pPara, nInsPos );
- pEditEngine->InsertParagraph( nInsPos, aStr );
- pHdlParagraph = pPara;
- ParagraphInsertedHdl();
- }
- else
- {
- nInsPos--;
- pEditEngine->SetText( nInsPos, aStr );
- }
- ImplInitDepth( nInsPos, nCurDepth, sal_False );
- nInsPos++;
- nPos++;
- }
- }
-
- DBG_ASSERT(pParaList->GetParagraphCount()==pEditEngine->GetParagraphCount(),"SetText failed!");
- bFirstParaIsEmpty = sal_False;
- ImplBlockInsertionCallbacks( sal_False );
- pEditEngine->SetUpdateMode( bUpdate );
-}
-
-// pView == 0 -> Ignore tabs
-
-bool Outliner::ImpConvertEdtToOut( sal_uInt32 nPara,EditView* pView)
-{
- DBG_CHKTHIS(Outliner,0);
-
- bool bConverted = false;
- sal_uInt16 nTabs = 0;
- ESelection aDelSel;
-
-// const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( (sal_uInt16)nPara );
-// bool bAlreadyOutliner = rAttrs.GetItemState( EE_PARA_OUTLLRSPACE ) == SFX_ITEM_ON ? true : false;
-
- XubString aName;
- XubString aHeading_US( RTL_CONSTASCII_USTRINGPARAM( "heading" ) );
- XubString aNumber_US( RTL_CONSTASCII_USTRINGPARAM( "Numbering" ) );
-
- XubString aStr( pEditEngine->GetText( (sal_uInt16)nPara ) );
- xub_Unicode* pPtr = (xub_Unicode*)aStr.GetBuffer();
-
- sal_uInt16 nHeadingNumberStart = 0;
- sal_uInt16 nNumberingNumberStart = 0;
- SfxStyleSheet* pStyle= pEditEngine->GetStyleSheet( (sal_uInt16)nPara );
- if( pStyle )
- {
- aName = pStyle->GetName();
- sal_uInt16 nSearch;
- if ( ( nSearch = aName.Search( aHeading_US ) ) != STRING_NOTFOUND )
- nHeadingNumberStart = nSearch + aHeading_US.Len();
- else if ( ( nSearch = aName.Search( aNumber_US ) ) != STRING_NOTFOUND )
- nNumberingNumberStart = nSearch + aNumber_US.Len();
- }
-
- if ( nHeadingNumberStart || nNumberingNumberStart )
- {
- // PowerPoint import ?
- if( nHeadingNumberStart && ( aStr.Len() >= 2 ) &&
- ( pPtr[0] != '\t' ) && ( pPtr[1] == '\t' ) )
- {
- // Extract Bullet and Tab
- aDelSel = ESelection( (sal_uInt16)nPara, 0, (sal_uInt16)nPara, 2 );
- }
-
- sal_uInt16 nPos = nHeadingNumberStart ? nHeadingNumberStart : nNumberingNumberStart;
- String aLevel = aName.Copy( nPos );
- aLevel.EraseLeadingChars( ' ' );
- nTabs = sal::static_int_cast< sal_uInt16 >(aLevel.ToInt32());
- if( nTabs )
- nTabs--; // Level 0 = "heading 1"
- bConverted = sal_True;
- }
- else
- {
- // filter leading tabs
- while( *pPtr == '\t' )
- {
- pPtr++;
- nTabs++;
- }
- // Remove tabs from the text
- if( nTabs )
- aDelSel = ESelection( (sal_uInt16)nPara, 0, (sal_uInt16)nPara, nTabs );
- }
-
- if ( aDelSel.HasRange() )
- {
- if ( pView )
- {
- pView->SetSelection( aDelSel );
- pView->DeleteSelected();
- }
- else
- pEditEngine->QuickDelete( aDelSel );
- }
-
- const SfxInt16Item& rLevel = (const SfxInt16Item&) pEditEngine->GetParaAttrib( sal::static_int_cast< sal_uInt16 >(nPara), EE_PARA_OUTLLEVEL );
- sal_Int16 nOutlLevel = rLevel.GetValue();
-
- ImplCheckDepth( nOutlLevel );
- ImplInitDepth( sal::static_int_cast< sal_uInt16 >(nPara), nOutlLevel, sal_False );
-
- return bConverted;
-}
-
-void Outliner::SetText( const OutlinerParaObject& rPObj )
-{
- DBG_CHKTHIS(Outliner,0);
-
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
-
- sal_Bool bUndo = pEditEngine->IsUndoEnabled();
- EnableUndo( sal_False );
-
- Init( rPObj.GetOutlinerMode() );
-
- ImplBlockInsertionCallbacks( sal_True );
- pEditEngine->SetText(rPObj.GetTextObject());
- if( rPObj.Count() != pEditEngine->GetParagraphCount() )
- {
- int nop=0;nop++;
- }
-
- bFirstParaIsEmpty = sal_False;
-
- pParaList->Clear( sal_True );
- for( sal_uInt16 nCurPara = 0; nCurPara < rPObj.Count(); nCurPara++ )
- {
- Paragraph* pPara = new Paragraph( rPObj.GetParagraphData(nCurPara));
- ImplCheckDepth( pPara->nDepth );
-
- pParaList->Append(pPara);
- ImplCheckNumBulletItem( nCurPara );
- }
-
- // #i100014#
- // It is not a good idea to substract 1 from a count and cast the result
- // to USHORT without check, if the count is 0.
- ImplCheckParagraphs( 0, (sal_uInt16) (pParaList->GetParagraphCount()) );
-
- EnableUndo( bUndo );
- ImplBlockInsertionCallbacks( sal_False );
- pEditEngine->SetUpdateMode( bUpdate );
-
- DBG_ASSERT( pParaList->GetParagraphCount()==rPObj.Count(),"SetText failed");
- DBG_ASSERT( pEditEngine->GetParagraphCount()==rPObj.Count(),"SetText failed");
-}
-
-void Outliner::AddText( const OutlinerParaObject& rPObj )
-{
- DBG_CHKTHIS(Outliner,0);
- Paragraph* pPara;
-
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
-
- ImplBlockInsertionCallbacks( sal_True );
- sal_uLong nPara;
- if( bFirstParaIsEmpty )
- {
- pParaList->Clear( sal_True );
- pEditEngine->SetText(rPObj.GetTextObject());
- nPara = 0;
- }
- else
- {
- nPara = pParaList->GetParagraphCount();
- pEditEngine->InsertParagraph( EE_PARA_APPEND, rPObj.GetTextObject() );
- }
- bFirstParaIsEmpty = sal_False;
-
- for( sal_uInt16 n = 0; n < rPObj.Count(); n++ )
- {
- pPara = new Paragraph( rPObj.GetParagraphData(n) );
- pParaList->Append(pPara);
- sal_uInt16 nP = sal::static_int_cast< sal_uInt16 >(nPara+n);
- DBG_ASSERT(pParaList->GetAbsPos(pPara)==nP,"AddText:Out of sync");
- ImplInitDepth( nP, pPara->GetDepth(), sal_False );
- }
- DBG_ASSERT( pEditEngine->GetParagraphCount()==pParaList->GetParagraphCount(), "SetText: OutOfSync" );
-
- // #i100014#
- // It is not a good idea to substract 1 from a count and cast the result
- // to USHORT without check, if the count is 0.
- ImplCheckParagraphs( (sal_uInt16)nPara, (sal_uInt16) (pParaList->GetParagraphCount()) );
-
- ImplBlockInsertionCallbacks( sal_False );
- pEditEngine->SetUpdateMode( bUpdate );
-}
-
-void Outliner::FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos )
-{
- DBG_CHKTHIS(Outliner,0);
-
- if ( aFieldClickedHdl.IsSet() )
- {
- EditFieldInfo aFldInfo( this, rField, nPara, nPos );
- aFldInfo.SetSimpleClick( sal_True );
- aFieldClickedHdl.Call( &aFldInfo );
- }
-}
-
-
-void Outliner::FieldSelected( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos )
-{
- DBG_CHKTHIS(Outliner,0);
- if ( !aFieldClickedHdl.IsSet() )
- return;
-
- EditFieldInfo aFldInfo( this, rField, nPara, nPos );
- aFldInfo.SetSimpleClick( sal_False );
- aFieldClickedHdl.Call( &aFldInfo );
-}
-
-
-XubString Outliner::CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor )
-{
- DBG_CHKTHIS(Outliner,0);
- if ( !aCalcFieldValueHdl.IsSet() )
- return String( ' ' );
-
- EditFieldInfo aFldInfo( this, rField, nPara, nPos );
- // The FldColor is preset with COL_LIGHTGRAY.
- if ( rpFldColor )
- aFldInfo.SetFldColor( *rpFldColor );
-
- aCalcFieldValueHdl.Call( &aFldInfo );
- if ( aFldInfo.GetTxtColor() )
- {
- delete rpTxtColor;
- rpTxtColor = new Color( *aFldInfo.GetTxtColor() );
- }
-
- delete rpFldColor;
- rpFldColor = aFldInfo.GetFldColor() ? new Color( *aFldInfo.GetFldColor() ) : 0;
-
- return aFldInfo.GetRepresentation();
-}
-
-void Outliner::SetStyleSheet( sal_uLong nPara, SfxStyleSheet* pStyle )
-{
- DBG_CHKTHIS(Outliner,0);
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (pPara)
- {
- pEditEngine->SetStyleSheet( (sal_uInt16)nPara, pStyle );
- pPara->nFlags |= PARAFLAG_SETBULLETTEXT;
- ImplCheckNumBulletItem( (sal_uInt16) nPara );
- }
-}
-
-void Outliner::SetVisible( Paragraph* pPara, sal_Bool bVisible )
-{
- DBG_CHKTHIS(Outliner,0);
- DBG_ASSERT( pPara, "SetVisible: pPara = NULL" );
-
- if (pPara)
- {
- pPara->bVisible = bVisible;
- sal_uLong nPara = pParaList->GetAbsPos( pPara );
- pEditEngine->ShowParagraph( (sal_uInt16)nPara, bVisible );
- }
-}
-
-void Outliner::ImplCheckNumBulletItem( sal_uInt16 nPara )
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (pPara)
- pPara->aBulSize.Width() = -1;
-}
-
-void Outliner::ImplSetLevelDependendStyleSheet( sal_uInt16 nPara, SfxStyleSheet* pLevelStyle )
-{
- DBG_CHKTHIS(Outliner,0);
-
- DBG_ASSERT( ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) || ( ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEVIEW ), "SetLevelDependendStyleSheet: Wrong Mode!" );
-
- SfxStyleSheet* pStyle = pLevelStyle;
- if ( !pStyle )
- pStyle = GetStyleSheet( nPara );
-
- if ( pStyle )
- {
- sal_Int16 nDepth = GetDepth( nPara );
- if( nDepth < 0 )
- nDepth = 0;
-
- String aNewStyleSheetName( pStyle->GetName() );
- aNewStyleSheetName.Erase( aNewStyleSheetName.Len()-1, 1 );
- aNewStyleSheetName += String::CreateFromInt32( nDepth+1 );
- SfxStyleSheet* pNewStyle = (SfxStyleSheet*)GetStyleSheetPool()->Find( aNewStyleSheetName, pStyle->GetFamily() );
- DBG_ASSERT( pNewStyle, "AutoStyleSheetName - Style not found!" );
- if ( pNewStyle && ( pNewStyle != GetStyleSheet( nPara ) ) )
- {
- SfxItemSet aOldAttrs( GetParaAttribs( nPara ) );
- SetStyleSheet( nPara, pNewStyle );
- if ( aOldAttrs.GetItemState( EE_PARA_NUMBULLET ) == SFX_ITEM_ON )
- {
- SfxItemSet aAttrs( GetParaAttribs( nPara ) );
- aAttrs.Put( aOldAttrs.Get( EE_PARA_NUMBULLET ) );
- SetParaAttribs( nPara, aAttrs );
- }
- }
- }
-}
-
-void Outliner::ImplInitDepth( sal_uInt16 nPara, sal_Int16 nDepth, sal_Bool bCreateUndo, sal_Bool bUndoAction )
-{
- DBG_CHKTHIS(Outliner,0);
-
- DBG_ASSERT( ( nDepth >= nMinDepth ) && ( nDepth <= nMaxDepth ), "ImplInitDepth - Depth is invalid!" );
-
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (!pPara)
- return;
- sal_Int16 nOldDepth = pPara->GetDepth();
- pPara->SetDepth( nDepth );
-
- // For IsInUndo attributes and style do not have to be set, there
- // the old values are restored by the EditEngine.
- if( !IsInUndo() )
- {
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
-
- sal_Bool bUndo = bCreateUndo && IsUndoEnabled();
- if ( bUndo && bUndoAction )
- UndoActionStart( OLUNDO_DEPTH );
-
- SfxItemSet aAttrs( pEditEngine->GetParaAttribs( nPara ) );
- aAttrs.Put( SfxInt16Item( EE_PARA_OUTLLEVEL, nDepth ) );
- pEditEngine->SetParaAttribs( nPara, aAttrs );
- ImplCheckNumBulletItem( nPara );
- ImplCalcBulletText( nPara, sal_False, sal_False );
-
- if ( bUndo )
- {
- InsertUndo( new OutlinerUndoChangeDepth( this, nPara, nOldDepth, nDepth ) );
- if ( bUndoAction )
- UndoActionEnd( OLUNDO_DEPTH );
- }
-
- pEditEngine->SetUpdateMode( bUpdate );
- }
-}
-
-void Outliner::SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet )
-{
- DBG_CHKTHIS(Outliner,0);
-
- pEditEngine->SetParaAttribs( nPara, rSet );
-}
-
-sal_Bool Outliner::Expand( Paragraph* pPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- if ( pParaList->HasHiddenChilds( pPara ) )
- {
- OLUndoExpand* pUndo = 0;
- sal_Bool bUndo = IsUndoEnabled() && !IsInUndo();
- if( bUndo )
- {
- UndoActionStart( OLUNDO_EXPAND );
- pUndo = new OLUndoExpand( this, OLUNDO_EXPAND );
- pUndo->pParas = 0;
- pUndo->nCount = (sal_uInt16)pParaList->GetAbsPos( pPara );
- }
- pHdlParagraph = pPara;
- bIsExpanding = sal_True;
- pParaList->Expand( pPara );
- ExpandHdl();
- InvalidateBullet( pPara, pParaList->GetAbsPos(pPara) );
- if( bUndo )
- {
- InsertUndo( pUndo );
- UndoActionEnd( OLUNDO_EXPAND );
- }
- return sal_True;
- }
- return sal_False;
-}
-
-
-sal_Bool Outliner::Collapse( Paragraph* pPara )
-{
- DBG_CHKTHIS(Outliner,0);
- if ( pParaList->HasVisibleChilds( pPara ) ) // expanded
- {
- OLUndoExpand* pUndo = 0;
- sal_Bool bUndo = sal_False;
-
- if( !IsInUndo() && IsUndoEnabled() )
- bUndo = sal_True;
- if( bUndo )
- {
- UndoActionStart( OLUNDO_COLLAPSE );
- pUndo = new OLUndoExpand( this, OLUNDO_COLLAPSE );
- pUndo->pParas = 0;
- pUndo->nCount = (sal_uInt16)pParaList->GetAbsPos( pPara );
- }
-
- pHdlParagraph = pPara;
- bIsExpanding = sal_False;
- pParaList->Collapse( pPara );
- ExpandHdl();
- InvalidateBullet( pPara, pParaList->GetAbsPos(pPara) );
- if( bUndo )
- {
- InsertUndo( pUndo );
- UndoActionEnd( OLUNDO_COLLAPSE );
- }
- return sal_True;
- }
- return sal_False;
-}
-
-
-Font Outliner::ImpCalcBulletFont( sal_uInt16 nPara ) const
-{
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
- DBG_ASSERT( pFmt && ( pFmt->GetNumberingType() != SVX_NUM_BITMAP ) && ( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ), "ImpCalcBulletFont: Missing or BitmapBullet!" );
-
- Font aStdFont;
- if ( !pEditEngine->IsFlatMode() )
- {
- ESelection aSel( nPara, 0, nPara, 0 );
- aStdFont = EditEngine::CreateFontFromItemSet( pEditEngine->GetAttribs( aSel ), GetScriptType( aSel ) );
- }
- else
- {
- aStdFont = pEditEngine->GetStandardFont( nPara );
- }
-
- Font aBulletFont;
- if ( pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL )
- {
- aBulletFont = *pFmt->GetBulletFont();
- }
- else
- {
- aBulletFont = aStdFont;
- aBulletFont.SetUnderline( UNDERLINE_NONE );
- aBulletFont.SetOverline( UNDERLINE_NONE );
- aBulletFont.SetStrikeout( STRIKEOUT_NONE );
- aBulletFont.SetEmphasisMark( EMPHASISMARK_NONE );
- aBulletFont.SetRelief( RELIEF_NONE );
- }
-
- // Use original scale...
- sal_uInt16 nStretchX, nStretchY;
- const_cast<Outliner*>(this)->GetGlobalCharStretching(nStretchX, nStretchY);
-
- sal_uInt16 nScale = pFmt->GetBulletRelSize() * nStretchY / 100;
- sal_uLong nScaledLineHeight = aStdFont.GetSize().Height();
- nScaledLineHeight *= nScale*10;
- nScaledLineHeight /= 1000;
-
- aBulletFont.SetAlign( ALIGN_BOTTOM );
- aBulletFont.SetSize( Size( 0, nScaledLineHeight ) );
- sal_Bool bVertical = IsVertical();
- aBulletFont.SetVertical( bVertical );
- aBulletFont.SetOrientation( bVertical ? 2700 : 0 );
-
- Color aColor( COL_AUTO );
- if( !pEditEngine->IsFlatMode() && !( pEditEngine->GetControlWord() & EE_CNTRL_NOCOLORS ) )
- {
- aColor = pFmt->GetBulletColor();
- }
-
- if ( ( aColor == COL_AUTO ) || ( IsForceAutoColor() ) )
- aColor = pEditEngine->GetAutoColor();
-
- aBulletFont.SetColor( aColor );
- return aBulletFont;
-}
-
-void Outliner::PaintBullet( sal_uInt16 nPara, const Point& rStartPos,
- const Point& rOrigin, short nOrientation, OutputDevice* pOutDev )
-{
- DBG_CHKTHIS(Outliner,0);
-
- bool bDrawBullet = false;
- if (pEditEngine)
- {
- const SfxBoolItem& rBulletState = (const SfxBoolItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
- bDrawBullet = rBulletState.GetValue() ? true : false;
- }
-
- if ( ImplHasBullet( nPara ) && bDrawBullet)
- {
- sal_Bool bVertical = IsVertical();
-
- sal_Bool bRightToLeftPara = pEditEngine->IsRightToLeft( nPara );
-
- Rectangle aBulletArea( ImpCalcBulletArea( nPara, sal_True, sal_False ) );
- sal_uInt16 nStretchX, nStretchY;
- GetGlobalCharStretching(nStretchX, nStretchY);
- aBulletArea = Rectangle( Point(aBulletArea.Left()*nStretchX/100,
- aBulletArea.Top()),
- Size(aBulletArea.GetWidth()*nStretchX/100,
- aBulletArea.GetHeight()) );
-
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
- if ( pFmt && ( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ) )
- {
- if( pFmt->GetNumberingType() != SVX_NUM_BITMAP )
- {
- Font aBulletFont( ImpCalcBulletFont( nPara ) );
- // Use baseline
- sal_Bool bSymbol = pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL;
- aBulletFont.SetAlign( bSymbol ? ALIGN_BOTTOM : ALIGN_BASELINE );
- Font aOldFont = pOutDev->GetFont();
- pOutDev->SetFont( aBulletFont );
-
- ParagraphInfos aParaInfos = pEditEngine->GetParagraphInfos( nPara );
- Point aTextPos;
- if ( !bVertical )
- {
-// aTextPos.Y() = rStartPos.Y() + aBulletArea.Bottom();
- aTextPos.Y() = rStartPos.Y() + ( bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent );
- if ( !bRightToLeftPara )
- aTextPos.X() = rStartPos.X() + aBulletArea.Left();
- else
- aTextPos.X() = rStartPos.X() + GetPaperSize().Width() - aBulletArea.Left();
- }
- else
- {
-// aTextPos.X() = rStartPos.X() - aBulletArea.Bottom();
- aTextPos.X() = rStartPos.X() - ( bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent );
- aTextPos.Y() = rStartPos.Y() + aBulletArea.Left();
- }
-
- if ( nOrientation )
- {
- // Both TopLeft and bottom left is not quite correct,
- // since in EditEngine baseline ...
- double nRealOrientation = nOrientation*F_PI1800;
- double nCos = cos( nRealOrientation );
- double nSin = sin( nRealOrientation );
- Point aRotatedPos;
- // Translation...
- aTextPos -= rOrigin;
- // Rotation...
- aRotatedPos.X()=(long) (nCos*aTextPos.X() + nSin*aTextPos.Y());
- aRotatedPos.Y()=(long) - (nSin*aTextPos.X() - nCos*aTextPos.Y());
- aTextPos = aRotatedPos;
- // Translation...
- aTextPos += rOrigin;
- Font aRotatedFont( aBulletFont );
- aRotatedFont.SetOrientation( nOrientation );
- pOutDev->SetFont( aRotatedFont );
- }
-
- // VCL will take care of brackets and so on...
- sal_uLong nLayoutMode = pOutDev->GetLayoutMode();
- nLayoutMode &= ~(TEXT_LAYOUT_BIDI_RTL|TEXT_LAYOUT_COMPLEX_DISABLED|TEXT_LAYOUT_BIDI_STRONG);
- if ( bRightToLeftPara )
- nLayoutMode |= TEXT_LAYOUT_BIDI_RTL;
- pOutDev->SetLayoutMode( nLayoutMode );
-
- if(bStrippingPortions)
- {
- const Font aSvxFont(pOutDev->GetFont());
- sal_Int32* pBuf = new sal_Int32[ pPara->GetText().Len() ];
- pOutDev->GetTextArray( pPara->GetText(), pBuf );
-
- if(bSymbol)
- {
- // aTextPos is Bottom, go to Baseline
- FontMetric aMetric(pOutDev->GetFontMetric());
- aTextPos.Y() -= aMetric.GetDescent();
- }
-
- DrawingText(aTextPos, pPara->GetText(), 0, pPara->GetText().Len(), pBuf,
- aSvxFont, nPara, 0xFFFF, 0xFF, 0, 0, false, false, true, 0, Color(), Color());
-
- delete[] pBuf;
- }
- else
- {
- pOutDev->DrawText( aTextPos, pPara->GetText() );
- }
-
- pOutDev->SetFont( aOldFont );
- }
- else
- {
- if ( pFmt->GetBrush()->GetGraphicObject() )
- {
- Point aBulletPos;
- if ( !bVertical )
- {
- aBulletPos.Y() = rStartPos.Y() + aBulletArea.Top();
- if ( !bRightToLeftPara )
- aBulletPos.X() = rStartPos.X() + aBulletArea.Left();
- else
- aBulletPos.X() = rStartPos.X() + GetPaperSize().Width() - aBulletArea.Right();
- }
- else
- {
- aBulletPos.X() = rStartPos.X() - aBulletArea.Bottom();
- aBulletPos.Y() = rStartPos.Y() + aBulletArea.Left();
- }
-
- if(bStrippingPortions)
- {
- if(aDrawBulletHdl.IsSet())
- {
- // call something analog to aDrawPortionHdl (if set) and feed it something
- // analog to DrawPortionInfo...
- // created aDrawBulletHdl, Set/GetDrawBulletHdl.
- // created DrawBulletInfo and added handling to sdrtextdecomposition.cxx
- DrawBulletInfo aDrawBulletInfo(
- *pFmt->GetBrush()->GetGraphicObject(),
- aBulletPos,
- pPara->aBulSize);
-
- aDrawBulletHdl.Call(&aDrawBulletInfo);
- }
- }
- else
- {
- // Remove CAST when KA made the Draw-Method const
- ((GraphicObject*)pFmt->GetBrush()->GetGraphicObject())->Draw( pOutDev, aBulletPos, pPara->aBulSize );
- }
- }
- }
- }
-
- // In case of collapsed subparagraphs paint a line before the text.
- if( pParaList->HasChilds(pPara) && !pParaList->HasVisibleChilds(pPara) &&
- !bStrippingPortions && !nOrientation )
- {
- long nWidth = pOutDev->PixelToLogic( Size( 10, 0 ) ).Width();
-
- Point aStartPos, aEndPos;
- if ( !bVertical )
- {
- aStartPos.Y() = rStartPos.Y() + aBulletArea.Bottom();
- if ( !bRightToLeftPara )
- aStartPos.X() = rStartPos.X() + aBulletArea.Right();
- else
- aStartPos.X() = rStartPos.X() + GetPaperSize().Width() - aBulletArea.Left();
- aEndPos = aStartPos;
- aEndPos.X() += nWidth;
- }
- else
- {
- aStartPos.X() = rStartPos.X() - aBulletArea.Bottom();
- aStartPos.Y() = rStartPos.Y() + aBulletArea.Right();
- aEndPos = aStartPos;
- aEndPos.Y() += nWidth;
- }
-
- const Color& rOldLineColor = pOutDev->GetLineColor();
- pOutDev->SetLineColor( Color( COL_BLACK ) );
- pOutDev->DrawLine( aStartPos, aEndPos );
- pOutDev->SetLineColor( rOldLineColor );
- }
- }
-}
-
-void Outliner::InvalidateBullet( Paragraph* /*pPara*/, sal_uLong nPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- long nLineHeight = (long)pEditEngine->GetLineHeight((sal_uInt16)nPara );
- for ( size_t i = 0, n = aViewList.size(); i < n; ++i )
- {
- OutlinerView* pView = aViewList[ i ];
- Point aPos( pView->pEditView->GetWindowPosTopLeft((sal_uInt16)nPara ) );
- Rectangle aRect( pView->GetOutputArea() );
- aRect.Right() = aPos.X();
- aRect.Top() = aPos.Y();
- aRect.Bottom() = aPos.Y();
- aRect.Bottom() += nLineHeight;
-
- pView->GetWindow()->Invalidate( aRect );
- }
-}
-
-sal_uLong Outliner::Read( SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat, SvKeyValueIterator* pHTTPHeaderAttrs )
-{
- DBG_CHKTHIS(Outliner,0);
-
- sal_Bool bOldUndo = pEditEngine->IsUndoEnabled();
- EnableUndo( sal_False );
-
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
-
- Clear();
-
- ImplBlockInsertionCallbacks( sal_True );
- sal_uLong nRet = pEditEngine->Read( rInput, rBaseURL, (EETextFormat)eFormat, pHTTPHeaderAttrs );
-
- bFirstParaIsEmpty = sal_False;
-
- sal_uInt16 nParas = pEditEngine->GetParagraphCount();
- pParaList->Clear( sal_True );
- sal_uInt16 n;
- for ( n = 0; n < nParas; n++ )
- {
- Paragraph* pPara = new Paragraph( 0 );
- pParaList->Append(pPara);
-
- if ( eFormat == EE_FORMAT_BIN )
- {
- const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( n );
- const SfxInt16Item& rLevel = (const SfxInt16Item&) rAttrs.Get( EE_PARA_OUTLLEVEL );
- sal_Int16 nDepth = rLevel.GetValue();
- ImplInitDepth( n, nDepth, sal_False );
- }
- }
-
- if ( eFormat != EE_FORMAT_BIN )
- {
- ImpFilterIndents( 0, nParas-1 );
- }
-
- ImplBlockInsertionCallbacks( sal_False );
- pEditEngine->SetUpdateMode( bUpdate );
- EnableUndo( bOldUndo );
-
- return nRet;
-}
-
-
-void Outliner::ImpFilterIndents( sal_uLong nFirstPara, sal_uLong nLastPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
-
- Paragraph* pLastConverted = NULL;
- for( sal_uLong nPara = nFirstPara; nPara <= nLastPara; nPara++ )
- {
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (pPara)
- {
- if( ImpConvertEdtToOut( nPara ) )
- {
- pLastConverted = pPara;
- }
- else if ( pLastConverted )
- {
- // Arrange normal paragraphs below the heading ...
- pPara->SetDepth( pLastConverted->GetDepth() );
- }
-
- ImplInitDepth( (sal_uInt16)nPara, pPara->GetDepth(), sal_False );
- }
- }
-
- pEditEngine->SetUpdateMode( bUpdate );
-}
-
-::svl::IUndoManager& Outliner::GetUndoManager()
-{
- DBG_CHKTHIS(Outliner,0);
- return pEditEngine->GetUndoManager();
-}
-
-void Outliner::ImpTextPasted( sal_uLong nStartPara, sal_uInt16 nCount )
-{
- DBG_CHKTHIS(Outliner,0);
-
- sal_Bool bUpdate = pEditEngine->GetUpdateMode();
- pEditEngine->SetUpdateMode( sal_False );
-
- const sal_uLong nStart = nStartPara;
-
- Paragraph* pPara = pParaList->GetParagraph( nStartPara );
-
- while( nCount && pPara )
- {
- if( ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT )
- {
- nDepthChangedHdlPrevDepth = pPara->GetDepth();
- mnDepthChangeHdlPrevFlags = pPara->nFlags;
-
- ImpConvertEdtToOut( nStartPara );
-
- pHdlParagraph = pPara;
-
- if( nStartPara == nStart )
- {
- // the existing paragraph has changed depth or flags
- if( (pPara->GetDepth() != nDepthChangedHdlPrevDepth) || (pPara->nFlags != mnDepthChangeHdlPrevFlags) )
- DepthChangedHdl();
- }
- }
- else // EditEngine mode
- {
- sal_Int16 nDepth = -1;
- const SfxItemSet& rAttrs = pEditEngine->GetParaAttribs( (sal_uInt16)nStartPara );
- if ( rAttrs.GetItemState( EE_PARA_OUTLLEVEL ) == SFX_ITEM_ON )
- {
- const SfxInt16Item& rLevel = (const SfxInt16Item&) rAttrs.Get( EE_PARA_OUTLLEVEL );
- nDepth = rLevel.GetValue();
- }
- if ( nDepth != GetDepth( nStartPara ) )
- ImplInitDepth( (sal_uInt16)nStartPara, nDepth, sal_False );
- }
-
- nCount--;
- nStartPara++;
- pPara = pParaList->GetParagraph( nStartPara );
- }
-
- pEditEngine->SetUpdateMode( bUpdate );
-
- DBG_ASSERT(pParaList->GetParagraphCount()==pEditEngine->GetParagraphCount(),"ImpTextPasted failed");
-}
-
-long Outliner::IndentingPagesHdl( OutlinerView* pView )
-{
- DBG_CHKTHIS(Outliner,0);
- if( !aIndentingPagesHdl.IsSet() )
- return 1;
- return aIndentingPagesHdl.Call( pView );
-}
-
-sal_Bool Outliner::ImpCanIndentSelectedPages( OutlinerView* pCurView )
-{
- DBG_CHKTHIS(Outliner,0);
- // The selected pages must already be set in advance through
- // ImpCalcSelectedPages
-
- // If the first paragraph is on level 0 it can not indented in any case,
- // possible there might be indentations in the following on the 0 level.
- if ( ( mnFirstSelPage == 0 ) && ( ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ) )
- {
- if ( nDepthChangedHdlPrevDepth == 1 ) // is the only page
- return sal_False;
- else
- pCurView->ImpCalcSelectedPages( sal_False ); // without the first
- }
- return (sal_Bool)IndentingPagesHdl( pCurView );
-}
-
-
-sal_Bool Outliner::ImpCanDeleteSelectedPages( OutlinerView* pCurView )
-{
- DBG_CHKTHIS(Outliner,0);
- // The selected pages must already be set in advance through
- // ImpCalcSelectedPages
- return (sal_Bool)RemovingPagesHdl( pCurView );
-}
-
-Outliner::Outliner( SfxItemPool* pPool, sal_uInt16 nMode )
-: nMinDepth( -1 )
-{
- DBG_CTOR( Outliner, 0 );
-
- bStrippingPortions = sal_False;
- bPasting = sal_False;
-
- nFirstPage = 1;
- bBlockInsCallback = sal_False;
-
- nMaxDepth = 9;
-
- pParaList = new ParagraphList;
- pParaList->SetVisibleStateChangedHdl( LINK( this, Outliner, ParaVisibleStateChangedHdl ) );
- Paragraph* pPara = new Paragraph( 0 );
- pParaList->Append(pPara);
- bFirstParaIsEmpty = sal_True;
-
- pEditEngine = new OutlinerEditEng( this, pPool );
- pEditEngine->SetBeginMovingParagraphsHdl( LINK( this, Outliner, BeginMovingParagraphsHdl ) );
- pEditEngine->SetEndMovingParagraphsHdl( LINK( this, Outliner, EndMovingParagraphsHdl ) );
- pEditEngine->SetBeginPasteOrDropHdl( LINK( this, Outliner, BeginPasteOrDropHdl ) );
- pEditEngine->SetEndPasteOrDropHdl( LINK( this, Outliner, EndPasteOrDropHdl ) );
-
- Init( nMode );
-}
-
-Outliner::~Outliner()
-{
- DBG_DTOR(Outliner,0);
-
- pParaList->Clear( sal_True );
- delete pParaList;
- delete pEditEngine;
-}
-
-size_t Outliner::InsertView( OutlinerView* pView, size_t nIndex )
-{
- DBG_CHKTHIS(Outliner,0);
- size_t ActualIndex;
-
- if ( nIndex >= aViewList.size() )
- {
- aViewList.push_back( pView );
- ActualIndex = aViewList.size() - 1;
- }
- else
- {
- ViewList::iterator it = aViewList.begin();
- advance( it, nIndex );
- ActualIndex = nIndex;
- }
- pEditEngine->InsertView( pView->pEditView, (sal_uInt16)nIndex );
- return ActualIndex;
-}
-
-OutlinerView* Outliner::RemoveView( OutlinerView* pView )
-{
- DBG_CHKTHIS(Outliner,0);
-
- for ( ViewList::iterator it = aViewList.begin(); it < aViewList.end(); ++it )
- {
- if ( *it == pView )
- {
- pView->pEditView->HideCursor(); // HACK
- pEditEngine->RemoveView( pView->pEditView );
- aViewList.erase( it );
- break;
- }
- }
- return NULL; // return superfluous
-}
-
-OutlinerView* Outliner::RemoveView( size_t nIndex )
-{
- DBG_CHKTHIS(Outliner,0);
-
- EditView* pEditView = pEditEngine->GetView( (sal_uInt16)nIndex );
- pEditView->HideCursor(); // HACK
-
- pEditEngine->RemoveView( (sal_uInt16)nIndex );
-
- {
- ViewList::iterator it = aViewList.begin();
- advance( it, nIndex );
- aViewList.erase( it );
- }
-
- return NULL; // return superfluous
-}
-
-
-OutlinerView* Outliner::GetView( size_t nIndex ) const
-{
- DBG_CHKTHIS(Outliner,0);
- return ( nIndex >= aViewList.size() ) ? NULL : aViewList[ nIndex ];
-}
-
-size_t Outliner::GetViewCount() const
-{
- DBG_CHKTHIS(Outliner,0);
- return aViewList.size();
-}
-
-void Outliner::ParagraphInsertedHdl()
-{
- DBG_CHKTHIS(Outliner,0);
- if( !IsInUndo() )
- aParaInsertedHdl.Call( this );
-}
-
-
-void Outliner::ParagraphRemovingHdl()
-{
- DBG_CHKTHIS(Outliner,0);
- if( !IsInUndo() )
- aParaRemovingHdl.Call( this );
-}
-
-
-void Outliner::DepthChangedHdl()
-{
- DBG_CHKTHIS(Outliner,0);
- if( !IsInUndo() )
- aDepthChangedHdl.Call( this );
-}
-
-
-sal_uLong Outliner::GetAbsPos( Paragraph* pPara )
-{
- DBG_CHKTHIS(Outliner,0);
- DBG_ASSERT(pPara,"GetAbsPos:No Para");
- return pParaList->GetAbsPos( pPara );
-}
-
-sal_uLong Outliner::GetParagraphCount() const
-{
- DBG_CHKTHIS(Outliner,0);
- return pParaList->GetParagraphCount();
-}
-
-Paragraph* Outliner::GetParagraph( sal_uLong nAbsPos ) const
-{
- DBG_CHKTHIS(Outliner,0);
- return pParaList->GetParagraph( nAbsPos );
-}
-
-sal_Bool Outliner::HasChilds( Paragraph* pParagraph ) const
-{
- DBG_CHKTHIS(Outliner,0);
- return pParaList->HasChilds( pParagraph );
-}
-
-sal_Bool Outliner::ImplHasBullet( sal_uInt16 nPara ) const
-{
- return GetNumberFormat(nPara) != 0;
-}
-
-const SvxNumberFormat* Outliner::GetNumberFormat( sal_uInt16 nPara ) const
-{
- const SvxNumberFormat* pFmt = NULL;
-
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (pPara == NULL)
- return NULL;
-
- sal_Int16 nDepth = pPara? pPara->GetDepth() : -1;
-
- if( nDepth >= 0 )
- {
- const SvxNumBulletItem& rNumBullet = (const SvxNumBulletItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_NUMBULLET );
- if ( rNumBullet.GetNumRule()->GetLevelCount() > nDepth )
- pFmt = rNumBullet.GetNumRule()->Get( nDepth );
- }
-
- return pFmt;
-}
-
-Size Outliner::ImplGetBulletSize( sal_uInt16 nPara )
-{
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (!pPara)
- return Size();
-
- if( pPara->aBulSize.Width() == -1 )
- {
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
- DBG_ASSERT( pFmt, "ImplGetBulletSize - no Bullet!" );
-
- if ( pFmt->GetNumberingType() == SVX_NUM_NUMBER_NONE )
- {
- pPara->aBulSize = Size( 0, 0 );
- }
- else if( pFmt->GetNumberingType() != SVX_NUM_BITMAP )
- {
- String aBulletText = ImplGetBulletText( nPara );
- OutputDevice* pRefDev = pEditEngine->GetRefDevice();
- Font aBulletFont( ImpCalcBulletFont( nPara ) );
- Font aRefFont( pRefDev->GetFont());
- pRefDev->SetFont( aBulletFont );
- pPara->aBulSize.Width() = pRefDev->GetTextWidth( aBulletText );
- pPara->aBulSize.Height() = pRefDev->GetTextHeight();
- pRefDev->SetFont( aRefFont );
- }
- else
- {
- pPara->aBulSize = OutputDevice::LogicToLogic( pFmt->GetGraphicSize(), MAP_100TH_MM, pEditEngine->GetRefDevice()->GetMapMode() );
- }
- }
-
- return pPara->aBulSize;
-}
-
-void Outliner::ImplCheckParagraphs( sal_uInt16 nStart, sal_uInt16 nEnd )
-{
- DBG_CHKTHIS( Outliner, 0 );
-
- // i100014#
- // assure that the following for-loop does not loop forever
- for ( sal_uInt16 n = nStart; n < nEnd; n++ )
- {
- Paragraph* pPara = pParaList->GetParagraph( n );
- if (pPara)
- {
- pPara->Invalidate();
- ImplCalcBulletText( n, sal_False, sal_False );
- }
- }
-}
-
-void Outliner::SetRefDevice( OutputDevice* pRefDev )
-{
- DBG_CHKTHIS(Outliner,0);
- pEditEngine->SetRefDevice( pRefDev );
- for ( sal_uInt16 n = (sal_uInt16) pParaList->GetParagraphCount(); n; )
- {
- Paragraph* pPara = pParaList->GetParagraph( --n );
- pPara->Invalidate();
- }
-}
-
-void Outliner::ParaAttribsChanged( sal_uInt16 nPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- // The Outliner does not have an undo of its own, when paragraphs are
- // separated/merged. When ParagraphInserted the attribute EE_PARA_OUTLLEVEL
- // may not be set, this is however needed when the depth of the paragraph
- // is to be determined.
- if( pEditEngine->IsInUndo() )
- {
- if ( pParaList->GetParagraphCount() == pEditEngine->GetParagraphCount() )
- {
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- const SfxInt16Item& rLevel = (const SfxInt16Item&) pEditEngine->GetParaAttrib( nPara, EE_PARA_OUTLLEVEL );
- if ( pPara && pPara->GetDepth() != rLevel.GetValue() )
- {
- pPara->SetDepth( rLevel.GetValue() );
- ImplCalcBulletText( nPara, sal_True, sal_True );
- }
- }
- }
-}
-
-void Outliner::StyleSheetChanged( SfxStyleSheet* pStyle )
-{
- DBG_CHKTHIS(Outliner,0);
-
- // The EditEngine calls StyleSheetChanged also for derived styles.
- // Here all the paragraphs, which had the said template, used to be
- // hunted by a ImpRecalcParaAttribs, why?
- // => only the Bullet-representation can really change...
- sal_uInt16 nParas = (sal_uInt16)pParaList->GetParagraphCount();
- for( sal_uInt16 nPara = 0; nPara < nParas; nPara++ )
- {
- if ( pEditEngine->GetStyleSheet( nPara ) == pStyle )
- {
- ImplCheckNumBulletItem( nPara );
- ImplCalcBulletText( nPara, sal_False, sal_False );
- // EditEngine formats changed paragraphs before calling this method,
- // so they are not reformatted now and use wrong bullet indent
- pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) );
- }
- }
-}
-
-Rectangle Outliner::ImpCalcBulletArea( sal_uInt16 nPara, sal_Bool bAdjust, sal_Bool bReturnPaperPos )
-{
- // Bullet area within the paragraph ...
- Rectangle aBulletArea;
-
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
- if ( pFmt )
- {
- Point aTopLeft;
- Size aBulletSize( ImplGetBulletSize( nPara ) );
-
- sal_Bool bOutlineMode = ( pEditEngine->GetControlWord() & EE_CNTRL_OUTLINER ) != 0;
-
- // the ODF attribut text:space-before which holds the spacing to add to the left of the label
- const short nSpaceBefore = pFmt->GetAbsLSpace() + pFmt->GetFirstLineOffset();
-
- const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&) pEditEngine->GetParaAttrib( nPara, bOutlineMode ? EE_PARA_OUTLLRSPACE : EE_PARA_LRSPACE );
- aTopLeft.X() = rLR.GetTxtLeft() + rLR.GetTxtFirstLineOfst() + nSpaceBefore;
-
- long nBulletWidth = Max( (long) -rLR.GetTxtFirstLineOfst(), (long) ((-pFmt->GetFirstLineOffset()) + pFmt->GetCharTextDistance()) );
- if ( nBulletWidth < aBulletSize.Width() ) // The Bullet creates its space
- nBulletWidth = aBulletSize.Width();
-
- if ( bAdjust && !bOutlineMode )
- {
- // Adjust when centered or align right
- const SvxAdjustItem& rItem = (const SvxAdjustItem&)pEditEngine->GetParaAttrib( nPara, EE_PARA_JUST );
- if ( ( !pEditEngine->IsRightToLeft( nPara ) && ( rItem.GetAdjust() != SVX_ADJUST_LEFT ) ) ||
- ( pEditEngine->IsRightToLeft( nPara ) && ( rItem.GetAdjust() != SVX_ADJUST_RIGHT ) ) )
- {
- aTopLeft.X() = pEditEngine->GetFirstLineStartX( nPara ) - nBulletWidth;
- }
- }
-
- // Vertical:
- ParagraphInfos aInfos = pEditEngine->GetParagraphInfos( nPara );
- if ( aInfos.bValid )
- {
- aTopLeft.Y() = /* aInfos.nFirstLineOffset + */ // nFirstLineOffset is already added to the StartPos (PaintBullet) from the EditEngine
- aInfos.nFirstLineHeight - aInfos.nFirstLineTextHeight
- + aInfos.nFirstLineTextHeight / 2
- - aBulletSize.Height() / 2;
- // may prefer to print out on the baseline ...
- if( ( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ) && ( pFmt->GetNumberingType() != SVX_NUM_BITMAP ) && ( pFmt->GetNumberingType() != SVX_NUM_CHAR_SPECIAL ) )
- {
- Font aBulletFont( ImpCalcBulletFont( nPara ) );
- if ( aBulletFont.GetCharSet() != RTL_TEXTENCODING_SYMBOL )
- {
- OutputDevice* pRefDev = pEditEngine->GetRefDevice();
- Font aOldFont = pRefDev->GetFont();
- pRefDev->SetFont( aBulletFont );
- FontMetric aMetric( pRefDev->GetFontMetric() );
- // Leading on the first line ...
- aTopLeft.Y() = /* aInfos.nFirstLineOffset + */ aInfos.nFirstLineMaxAscent;
- aTopLeft.Y() -= aMetric.GetAscent();
- pRefDev->SetFont( aOldFont );
- }
- }
- }
-
- // Horizontal:
- if( pFmt->GetNumAdjust() == SVX_ADJUST_RIGHT )
- {
- aTopLeft.X() += nBulletWidth - aBulletSize.Width();
- }
- else if( pFmt->GetNumAdjust() == SVX_ADJUST_CENTER )
- {
- aTopLeft.X() += ( nBulletWidth - aBulletSize.Width() ) / 2;
- }
-
- if ( aTopLeft.X() < 0 ) // then push
- aTopLeft.X() = 0;
-
- aBulletArea = Rectangle( aTopLeft, aBulletSize );
- }
- if ( bReturnPaperPos )
- {
- Size aBulletSize( aBulletArea.GetSize() );
- Point aBulletDocPos( aBulletArea.TopLeft() );
- aBulletDocPos.Y() += pEditEngine->GetDocPosTopLeft( nPara ).Y();
- Point aBulletPos( aBulletDocPos );
-
- if ( IsVertical() )
- {
- aBulletPos.Y() = aBulletDocPos.X();
- aBulletPos.X() = GetPaperSize().Width() - aBulletDocPos.Y();
- // Rotate:
- aBulletPos.X() -= aBulletSize.Height();
- Size aSz( aBulletSize );
- aBulletSize.Width() = aSz.Height();
- aBulletSize.Height() = aSz.Width();
- }
- else if ( pEditEngine->IsRightToLeft( nPara ) )
- {
- aBulletPos.X() = GetPaperSize().Width() - aBulletDocPos.X() - aBulletSize.Width();
- }
-
- aBulletArea = Rectangle( aBulletPos, aBulletSize );
- }
- return aBulletArea;
-}
-
-void Outliner::ExpandHdl()
-{
- DBG_CHKTHIS(Outliner,0);
- aExpandHdl.Call( this );
-}
-
-EBulletInfo Outliner::GetBulletInfo( sal_uInt16 nPara )
-{
- EBulletInfo aInfo;
-
- aInfo.nParagraph = nPara;
- aInfo.bVisible = ImplHasBullet( nPara );
-
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
- aInfo.nType = pFmt ? pFmt->GetNumberingType() : 0;
-
- if( pFmt )
- {
- if( pFmt->GetNumberingType() != SVX_NUM_BITMAP )
- {
- aInfo.aText = ImplGetBulletText( nPara );
-
- if( pFmt->GetBulletFont() )
- aInfo.aFont = *pFmt->GetBulletFont();
- }
- else if ( pFmt->GetBrush()->GetGraphicObject() )
- {
- aInfo.aGraphic = pFmt->GetBrush()->GetGraphicObject()->GetGraphic();
- }
- }
-
- if ( aInfo.bVisible )
- {
- aInfo.aBounds = ImpCalcBulletArea( nPara, sal_True, sal_True );
- }
-
- return aInfo;
-}
-
-XubString Outliner::GetText( Paragraph* pParagraph, sal_uLong nCount ) const
-{
- DBG_CHKTHIS(Outliner,0);
-
- XubString aText;
- sal_uInt16 nStartPara = (sal_uInt16) pParaList->GetAbsPos( pParagraph );
- for ( sal_uInt16 n = 0; n < nCount; n++ )
- {
- aText += pEditEngine->GetText( nStartPara + n );
- if ( (n+1) < (sal_uInt16)nCount )
- aText += '\n';
- }
- return aText;
-}
-
-void Outliner::Remove( Paragraph* pPara, sal_uLong nParaCount )
-{
- DBG_CHKTHIS(Outliner,0);
-
- sal_uLong nPos = pParaList->GetAbsPos( pPara );
- if( !nPos && ( nParaCount >= pParaList->GetParagraphCount() ) )
- {
- Clear();
- }
- else
- {
- for( sal_uInt16 n = 0; n < (sal_uInt16)nParaCount; n++ )
- pEditEngine->RemoveParagraph( (sal_uInt16) nPos );
- }
-}
-
-void Outliner::StripPortions()
-{
- DBG_CHKTHIS(Outliner,0);
- bStrippingPortions = sal_True;
- pEditEngine->StripPortions();
- bStrippingPortions = sal_False;
-}
-
-void Outliner::DrawingText( const Point& rStartPos, const XubString& rText, sal_uInt16 nTextStart, sal_uInt16 nTextLen, const sal_Int32* pDXArray,const SvxFont& rFont,
- sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt8 nRightToLeft,
- const EEngineData::WrongSpellVector* pWrongSpellVector,
- const SvxFieldData* pFieldData,
- bool bEndOfLine,
- bool bEndOfParagraph,
- bool bEndOfBullet,
- const ::com::sun::star::lang::Locale* pLocale,
- const Color& rOverlineColor,
- const Color& rTextLineColor)
-{
- DBG_CHKTHIS(Outliner,0);
-
- if(aDrawPortionHdl.IsSet())
- {
- DrawPortionInfo aInfo( rStartPos, rText, nTextStart, nTextLen, rFont, nPara, nIndex, pDXArray, pWrongSpellVector,
- pFieldData, pLocale, rOverlineColor, rTextLineColor, nRightToLeft, false, 0, bEndOfLine, bEndOfParagraph, bEndOfBullet);
-
- aDrawPortionHdl.Call( &aInfo );
- }
-}
-
-void Outliner::DrawingTab( const Point& rStartPos, long nWidth, const String& rChar, const SvxFont& rFont,
- sal_uInt16 nPara, xub_StrLen nIndex, sal_uInt8 nRightToLeft, bool bEndOfLine, bool bEndOfParagraph,
- const Color& rOverlineColor, const Color& rTextLineColor)
-{
- if(aDrawPortionHdl.IsSet())
- {
- DrawPortionInfo aInfo( rStartPos, rChar, 0, rChar.Len(), rFont, nPara, nIndex, NULL, NULL,
- NULL, NULL, rOverlineColor, rTextLineColor, nRightToLeft, true, nWidth, bEndOfLine, bEndOfParagraph, false);
-
- aDrawPortionHdl.Call( &aInfo );
- }
-}
-
-long Outliner::RemovingPagesHdl( OutlinerView* pView )
-{
- DBG_CHKTHIS(Outliner,0);
- return aRemovingPagesHdl.IsSet() ? aRemovingPagesHdl.Call( pView ) : sal_True;
-}
-
-sal_Bool Outliner::ImpCanDeleteSelectedPages( OutlinerView* pCurView, sal_uInt16 _nFirstPage, sal_uInt16 nPages )
-{
- DBG_CHKTHIS(Outliner,0);
-
- nDepthChangedHdlPrevDepth = nPages;
- mnFirstSelPage = _nFirstPage;
- pHdlParagraph = 0;
- return (sal_Bool)RemovingPagesHdl( pCurView );
-}
-
-SfxItemSet Outliner::GetParaAttribs( sal_uInt16 nPara )
-{
- DBG_CHKTHIS(Outliner,0);
- return pEditEngine->GetParaAttribs( nPara );
-}
-
-IMPL_LINK( Outliner, ParaVisibleStateChangedHdl, Paragraph*, pPara )
-{
- DBG_CHKTHIS(Outliner,0);
-
- sal_uLong nPara = pParaList->GetAbsPos( pPara );
- pEditEngine->ShowParagraph( (sal_uInt16)nPara, pPara->IsVisible() );
-
- return 0;
-}
-
-IMPL_LINK( Outliner, BeginMovingParagraphsHdl, MoveParagraphsInfo*, EMPTYARG )
-{
- DBG_CHKTHIS(Outliner,0);
-
- if( !IsInUndo() )
- GetBeginMovingHdl().Call( this );
-
- return 0;
-}
-
-IMPL_LINK( Outliner, BeginPasteOrDropHdl, PasteOrDropInfos*, pInfos )
-{
- UndoActionStart( EDITUNDO_DRAGANDDROP );
- maBeginPasteOrDropHdl.Call(pInfos);
- return 0;
-}
-
-IMPL_LINK( Outliner, EndPasteOrDropHdl, PasteOrDropInfos*, pInfos )
-{
- bPasting = sal_False;
- ImpTextPasted( pInfos->nStartPara, pInfos->nEndPara - pInfos->nStartPara + 1 );
- maEndPasteOrDropHdl.Call( pInfos );
- UndoActionEnd( EDITUNDO_DRAGANDDROP );
- return 0;
-}
-
-IMPL_LINK( Outliner, EndMovingParagraphsHdl, MoveParagraphsInfo*, pInfos )
-{
- DBG_CHKTHIS(Outliner,0);
-
- pParaList->MoveParagraphs( pInfos->nStartPara, pInfos->nDestPara, pInfos->nEndPara - pInfos->nStartPara + 1 );
- sal_uInt16 nChangesStart = Min( pInfos->nStartPara, pInfos->nDestPara );
- sal_uInt16 nParas = (sal_uInt16)pParaList->GetParagraphCount();
- for ( sal_uInt16 n = nChangesStart; n < nParas; n++ )
- ImplCalcBulletText( n, sal_False, sal_False );
-
- if( !IsInUndo() )
- aEndMovingHdl.Call( this );
-
- return 0;
-}
-
-static bool isSameNumbering( const SvxNumberFormat& rN1, const SvxNumberFormat& rN2 )
-{
- if( rN1.GetNumberingType() != rN2.GetNumberingType() )
- return false;
-
- if( rN1.GetNumStr(1) != rN2.GetNumStr(1) )
- return false;
-
- if( (rN1.GetPrefix() != rN2.GetPrefix()) || (rN1.GetSuffix() != rN2.GetSuffix()) )
- return false;
-
- return true;
-}
-
-sal_uInt16 Outliner::ImplGetNumbering( sal_uInt16 nPara, const SvxNumberFormat* pParaFmt )
-{
- sal_uInt16 nNumber = pParaFmt->GetStart() - 1;
-
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- const sal_Int16 nParaDepth = pPara->GetDepth();
-
- do
- {
- pPara = pParaList->GetParagraph( nPara );
- const sal_Int16 nDepth = pPara->GetDepth();
-
- // ignore paragraphs that are below our paragraph or have no numbering
- if( (nDepth > nParaDepth) || (nDepth == -1) )
- continue;
-
- // stop on paragraphs that are above our paragraph
- if( nDepth < nParaDepth )
- break;
-
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
-
- if( pFmt == 0 )
- continue; // ignore paragraphs without bullets
-
- // check if numbering is the same
- if( !isSameNumbering( *pFmt, *pParaFmt ) )
- break;
-
- const SfxBoolItem& rBulletState = (const SfxBoolItem&) pEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE );
-
- if( rBulletState.GetValue() )
- nNumber += 1;
-
- // same depth, same number format, check for restart
- const sal_Int16 nNumberingStartValue = pPara->GetNumberingStartValue();
- if( (nNumberingStartValue != -1) || pPara->IsParaIsNumberingRestart() )
- {
- if( nNumberingStartValue != -1 )
- nNumber += nNumberingStartValue - 1;
- break;
- }
- }
- while( nPara-- );
-
- return nNumber;
-}
-
-void Outliner::ImplCalcBulletText( sal_uInt16 nPara, sal_Bool bRecalcLevel, sal_Bool bRecalcChilds )
-{
- DBG_CHKTHIS(Outliner,0);
-
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- sal_uInt16 nRelPos = 0xFFFF;
-
- while ( pPara )
- {
- XubString aBulletText;
- const SvxNumberFormat* pFmt = GetNumberFormat( nPara );
- if( pFmt && ( pFmt->GetNumberingType() != SVX_NUM_BITMAP ) )
- {
- aBulletText += pFmt->GetPrefix();
- if( pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL )
- {
- aBulletText += pFmt->GetBulletChar();
- }
- else if( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE )
- {
- aBulletText += pFmt->GetNumStr( ImplGetNumbering( nPara, pFmt ) );
- }
- aBulletText += pFmt->GetSuffix();
- }
-
- if( aBulletText != pPara->GetText() )
- pPara->SetText( aBulletText );
-
- pPara->nFlags &= (~PARAFLAG_SETBULLETTEXT);
-
- if ( bRecalcLevel )
- {
- if ( nRelPos != 0xFFFF )
- nRelPos++;
-
- sal_Int16 nDepth = pPara->GetDepth();
- pPara = pParaList->GetParagraph( ++nPara );
- if ( !bRecalcChilds )
- {
- while ( pPara && ( pPara->GetDepth() > nDepth ) )
- pPara = pParaList->GetParagraph( ++nPara );
- }
-
- if ( pPara && ( pPara->GetDepth() < nDepth ) )
- pPara = NULL;
- }
- else
- {
- pPara = NULL;
- }
- }
-}
-
-void Outliner::Clear()
-{
- DBG_CHKTHIS(Outliner,0);
-
- if( !bFirstParaIsEmpty )
- {
- ImplBlockInsertionCallbacks( sal_True );
- pEditEngine->Clear();
- pParaList->Clear( sal_True );
- pParaList->Append( new Paragraph( nMinDepth ));
- bFirstParaIsEmpty = sal_True;
- ImplBlockInsertionCallbacks( sal_False );
- }
- else
- {
- Paragraph* pPara = pParaList->GetParagraph( 0 );
- if(pPara)
- pPara->SetDepth( nMinDepth );
- }
-}
-
-void Outliner::SetFlatMode( sal_Bool bFlat )
-{
- DBG_CHKTHIS(Outliner,0);
-
- if( bFlat != pEditEngine->IsFlatMode() )
- {
- for ( sal_uInt16 nPara = (sal_uInt16)pParaList->GetParagraphCount(); nPara; )
- pParaList->GetParagraph( --nPara )->aBulSize.Width() = -1;
-
- pEditEngine->SetFlatMode( bFlat );
- }
-}
-
-String Outliner::ImplGetBulletText( sal_uInt16 nPara )
-{
- String aRes;
- Paragraph* pPara = pParaList->GetParagraph( nPara );
- if (pPara)
- {
- // Enable optimization again ...
-// if( pPara->nFlags & PARAFLAG_SETBULLETTEXT )
- ImplCalcBulletText( nPara, sal_False, sal_False );
- aRes = pPara->GetText();
- }
- return aRes;
-}
-
-// this is needed for StarOffice Api
-void Outliner::SetLevelDependendStyleSheet( sal_uInt16 nPara )
-{
- SfxItemSet aOldAttrs( pEditEngine->GetParaAttribs( nPara ) );
- ImplSetLevelDependendStyleSheet( nPara );
- pEditEngine->SetParaAttribs( nPara, aOldAttrs );
-}
-
-SV_IMPL_PTRARR( NotifyList, EENotifyPtr );
-
-void Outliner::ImplBlockInsertionCallbacks( sal_Bool b )
-{
- if ( b )
- {
- bBlockInsCallback++;
- }
- else
- {
- DBG_ASSERT( bBlockInsCallback, "ImplBlockInsertionCallbacks ?!" );
- bBlockInsCallback--;
- if ( !bBlockInsCallback )
- {
- // Call blocked notify events...
- while ( pEditEngine->aNotifyCache.Count() )
- {
- EENotify* pNotify = pEditEngine->aNotifyCache[0];
- // Remove from list before calling, maybe we enter LeaveBlockNotifications while calling the handler...
- pEditEngine->aNotifyCache.Remove( 0 );
- pEditEngine->aOutlinerNotifyHdl.Call( pNotify );
- delete pNotify;
- }
- }
- }
-}
-
-IMPL_LINK( Outliner, EditEngineNotifyHdl, EENotify*, pNotify )
-{
- if ( !bBlockInsCallback )
- {
- pEditEngine->aOutlinerNotifyHdl.Call( pNotify );
- }
- else
- {
- EENotify* pNewNotify = new EENotify( *pNotify );
- pEditEngine->aNotifyCache.Insert( pNewNotify, pEditEngine->aNotifyCache.Count() );
- }
-
- return 0;
-}
-
-/** sets a link that is called at the beginning of a drag operation at an edit view */
-void Outliner::SetBeginDropHdl( const Link& rLink )
-{
- pEditEngine->SetBeginDropHdl( rLink );
-}
-
-Link Outliner::GetBeginDropHdl() const
-{
- return pEditEngine->GetBeginDropHdl();
-}
-
-/** sets a link that is called at the end of a drag operation at an edit view */
-void Outliner::SetEndDropHdl( const Link& rLink )
-{
- pEditEngine->SetEndDropHdl( rLink );
-}
-
-Link Outliner::GetEndDropHdl() const
-{
- return pEditEngine->GetEndDropHdl();
-}
-
-/** sets a link that is called before a drop or paste operation. */
-void Outliner::SetBeginPasteOrDropHdl( const Link& rLink )
-{
- maBeginPasteOrDropHdl = rLink;
-}
-
-/** sets a link that is called after a drop or paste operation. */
-void Outliner::SetEndPasteOrDropHdl( const Link& rLink )
-{
- maEndPasteOrDropHdl = rLink;
-}
-
-void Outliner::SetParaFlag( Paragraph* pPara, sal_uInt16 nFlag )
-{
- if( pPara && !pPara->HasFlag( nFlag ) )
- {
- if( IsUndoEnabled() && !IsInUndo() )
- InsertUndo( new OutlinerUndoChangeParaFlags( this, (sal_uInt16)GetAbsPos( pPara ), pPara->nFlags, pPara->nFlags|nFlag ) );
-
- pPara->SetFlag( nFlag );
- }
-}
-
-void Outliner::RemoveParaFlag( Paragraph* pPara, sal_uInt16 nFlag )
-{
- if( pPara && pPara->HasFlag( nFlag ) )
- {
- if( IsUndoEnabled() && !IsInUndo() )
- InsertUndo( new OutlinerUndoChangeParaFlags( this, (sal_uInt16)GetAbsPos( pPara ), pPara->nFlags, pPara->nFlags & ~nFlag ) );
-
- pPara->RemoveFlag( nFlag );
- }
-}
-
-bool Outliner::HasParaFlag( const Paragraph* pPara, sal_uInt16 nFlag ) const
-{
- return pPara && pPara->HasFlag( nFlag );
-}
-
-
-sal_Bool DrawPortionInfo::IsRTL() const
-{
- if(0xFF == mnBiDiLevel)
- {
- // Use Bidi functions from icu 2.0 to calculate if this portion
- // is RTL or not.
- UErrorCode nError(U_ZERO_ERROR);
- UBiDi* pBidi = ubidi_openSized(mrText.Len(), 0, &nError);
- nError = U_ZERO_ERROR;
-
- // I do not have this info here. Is it necessary? I'll have to ask MT.
- const sal_uInt8 nDefaultDir = UBIDI_LTR; //IsRightToLeft( nPara ) ? UBIDI_RTL : UBIDI_LTR;
-
- ubidi_setPara(pBidi, reinterpret_cast<const UChar *>(mrText.GetBuffer()), mrText.Len(), nDefaultDir, NULL, &nError); // UChar != sal_Unicode in MinGW
- nError = U_ZERO_ERROR;
-
- int32_t nStart(0);
- int32_t nEnd;
- UBiDiLevel nCurrDir;
-
- ubidi_getLogicalRun(pBidi, nStart, &nEnd, &nCurrDir);
-
- ubidi_close(pBidi);
-
- // remember on-demand calculated state
- ((DrawPortionInfo*)this)->mnBiDiLevel = nCurrDir;
- }
-
- return (1 == (mnBiDiLevel % 2));
-}
-
-// eof
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */