diff options
author | Zolnai Tamás <zolniatamas@caesar.elte.hu> | 2012-08-06 20:52:37 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-08-07 10:50:23 +0200 |
commit | 2854d8b17cb873a5d61e06f9570ac344f054d666 (patch) | |
tree | 2d48cc3b620c25c4d894716d4470b4eefc8a86dd /svtools | |
parent | 13b9c0513319623fd56a5a0ead5bdddecf90a10f (diff) |
fdo#46193 MessBox was made copyable
Part of MultiLineEdit was moved down from stvools to vcl
with name VCLMultiLineEdit. MessBox uses it to display the
message in read-only mode. Some of svtools' classes - which
are necessary to implement VCLMultiLineEdit - were moved to
vcl as a whole, and their includes are rewrite.
Note: ExtTextView and ExtTextEngine classes would be leaved in svtools
if VCLMultiLineEdit is a template class, but two macros: IMPL_LINK
end IMPL_LINK_NOARG make it impossible to use template syntax.
Change-Id: I26543868d8081c225c7125404d23369de3c3afcd
Diffstat (limited to 'svtools')
26 files changed, 21 insertions, 10822 deletions
diff --git a/svtools/Library_svt.mk b/svtools/Library_svt.mk index 3a0e7d0105ef..c265afb8eab0 100644 --- a/svtools/Library_svt.mk +++ b/svtools/Library_svt.mk @@ -148,14 +148,7 @@ $(eval $(call gb_Library_add_exception_objects,svt,\ svtools/source/edit/svmedit \ svtools/source/edit/svmedit2 \ svtools/source/edit/syntaxhighlight \ - svtools/source/edit/textdata \ - svtools/source/edit/textdoc \ - svtools/source/edit/texteng \ - svtools/source/edit/textundo \ - svtools/source/edit/textview \ svtools/source/edit/textwindowpeer \ - svtools/source/edit/txtattr \ - svtools/source/edit/xtextedt \ svtools/source/filter/FilterConfigCache \ svtools/source/filter/FilterConfigItem \ svtools/source/filter/SvFilterOptionsDialog \ diff --git a/svtools/Package_inc.mk b/svtools/Package_inc.mk index b0525ea255ec..a970653dabd0 100644 --- a/svtools/Package_inc.mk +++ b/svtools/Package_inc.mk @@ -158,9 +158,6 @@ $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/table/tabletypes.hxx,s $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/table/tablesort.hxx,svtools/table/tablesort.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/templatefoldercache.hxx,svtools/templatefoldercache.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/templdlg.hxx,svtools/templdlg.hxx)) -$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/textdata.hxx,svtools/textdata.hxx)) -$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/texteng.hxx,svtools/texteng.hxx)) -$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/textview.hxx,svtools/textview.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/textwindowpeer.hxx,svtools/textwindowpeer.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/toolbarmenu.hxx,svtools/toolbarmenu.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/toolboxcontroller.hxx,svtools/toolboxcontroller.hxx)) @@ -175,7 +172,6 @@ $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/toolpanel/toolpanel.hx $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/toolpanel/toolpaneldeck.hxx,svtools/toolpanel/toolpaneldeck.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/transfer.hxx,svtools/transfer.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/treelist.hxx,svtools/treelist.hxx)) -$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/txtattr.hxx,svtools/txtattr.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/txtcmp.hxx,svtools/txtcmp.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/unitconv.hxx,svtools/unitconv.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/unoevent.hxx,svtools/unoevent.hxx)) @@ -186,7 +182,6 @@ $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/wallitem.hxx,svtools/w $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/wizardmachine.hxx,svtools/wizardmachine.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/wizdlg.hxx,svtools/wizdlg.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/wmf.hxx,svtools/wmf.hxx)) -$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/xtextedt.hxx,svtools/xtextedt.hxx)) $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/xwindowitem.hxx,svtools/xwindowitem.hxx)) # vim: set noet sw=4 ts=4: diff --git a/svtools/inc/svtools/svmedit.hxx b/svtools/inc/svtools/svmedit.hxx index f0d30d16dc4b..90853492d2c0 100644 --- a/svtools/inc/svtools/svmedit.hxx +++ b/svtools/inc/svtools/svmedit.hxx @@ -29,127 +29,27 @@ #ifndef _SVEDIT_HXX #define _SVEDIT_HXX -#include <tools/wintypes.hxx> -#include <vcl/edit.hxx> +#include <vcl/vclmedit.hxx> #include <svtools/syntaxhighlight.hxx> #include <svtools/svtdllapi.h> #include <svtools/colorcfg.hxx> -class ImpSvMEdit; -class Timer; -class ExtTextEngine; -class ExtTextView; -class SVT_DLLPUBLIC MultiLineEdit : public Edit -{ -private: - ImpSvMEdit* pImpSvMEdit; - - XubString aSaveValue; - Link aModifyHdlLink; - - Timer* pUpdateDataTimer; - Link aUpdateDataHdlLink; - -protected: - - DECL_LINK( ImpUpdateDataHdl, void* ); - void StateChanged( StateChangedType nType ); - void DataChanged( const DataChangedEvent& rDCEvt ); - virtual long PreNotify( NotifyEvent& rNEvt ); - long Notify( NotifyEvent& rNEvt ); - using Control::ImplInitSettings; - void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); - WinBits ImplInitStyle( WinBits nStyle ); - - ExtTextEngine* GetTextEngine() const; - ExtTextView* GetTextView() const; - ScrollBar* GetVScrollBar() const; +class SVT_DLLPUBLIC MultiLineEdit : public VCLMultiLineEdit +{ public: MultiLineEdit( Window* pParent, WinBits nWinStyle = WB_LEFT | WB_BORDER ); MultiLineEdit( Window* pParent, const ResId& rResId ); - ~MultiLineEdit(); - - - virtual void Modify(); - virtual void UpdateData(); - - virtual void SetModifyFlag(); - virtual void ClearModifyFlag(); - virtual sal_Bool IsModified() const; - - virtual void EnableUpdateData( sal_uLong nTimeout = EDIT_UPDATEDATA_TIMEOUT ); - virtual void DisableUpdateData() { delete pUpdateDataTimer; pUpdateDataTimer = NULL; } - virtual sal_uLong IsUpdateDataEnabled() const; - - virtual void SetReadOnly( sal_Bool bReadOnly = sal_True ); - virtual sal_Bool IsReadOnly() const; - - void EnableFocusSelectionHide( sal_Bool bHide ); - - virtual void SetMaxTextLen( xub_StrLen nMaxLen = 0 ); - virtual xub_StrLen GetMaxTextLen() const; - - virtual void SetSelection( const Selection& rSelection ); - virtual const Selection& GetSelection() const; - - virtual void ReplaceSelected( const XubString& rStr ); - virtual void DeleteSelected(); - virtual XubString GetSelected() const; - virtual XubString GetSelected( LineEnd aSeparator ) const; - - virtual void Cut(); - virtual void Copy(); - virtual void Paste(); - - virtual void SetText( const XubString& rStr ); - virtual void SetText( const XubString& rStr, const Selection& rNewSelection ) - { SetText( rStr ); SetSelection( rNewSelection ); } - String GetText() const; - String GetText( LineEnd aSeparator ) const; - String GetTextLines( LineEnd aSeparator ) const; - - void SetRightToLeft( sal_Bool bRightToLeft ); - sal_Bool IsRightToLeft() const; - - void SaveValue() { aSaveValue = GetText(); } - const XubString& GetSavedValue() const { return aSaveValue; } - - void SetModifyHdl( const Link& rLink ) { aModifyHdlLink = rLink; } - const Link& GetModifyHdl() const { return aModifyHdlLink; } - - void SetUpdateDataHdl( const Link& rLink ) { aUpdateDataHdlLink = rLink; } - const Link& GetUpdateDataHdl() const { return aUpdateDataHdlLink; } - - virtual void Resize(); - virtual void GetFocus(); - - Size CalcMinimumSize() const; - Size CalcAdjustedSize( const Size& rPrefSize ) const; - using Edit::CalcSize; - Size CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const; - void GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const; - - void Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ); - - void SetLeftMargin( sal_uInt16 n ); + ~MultiLineEdit(){}; virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > GetComponentInterface(sal_Bool bCreate = sal_True); - - void DisableSelectionOnFocus(); - - void SetTextSelectable( sal_Bool bTextSelectable ); }; -inline sal_uLong MultiLineEdit::IsUpdateDataEnabled() const -{ - return pUpdateDataTimer ? pUpdateDataTimer->GetTimeout() : 0; -} -#endif +#endif //_SVEDIT_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/inc/svtools/textdata.hxx b/svtools/inc/svtools/textdata.hxx deleted file mode 100644 index 29d97e6e51e4..000000000000 --- a/svtools/inc/svtools/textdata.hxx +++ /dev/null @@ -1,172 +0,0 @@ -/* -*- 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 . - */ - -#ifndef _TEXTDATA_HXX -#define _TEXTDATA_HXX - -#include "svtools/svtdllapi.h" -#include <svl/brdcst.hxx> -#include <svl/smplhint.hxx> -#include <tools/string.hxx> - -// Fuer Notify, wenn alle Absaetze geloescht wurden... -#define TEXT_PARA_ALL 0xFFFFFFFF - -class TextPaM -{ -private: - sal_uLong mnPara; - sal_uInt16 mnIndex; - -public: - TextPaM() { mnPara = 0, mnIndex = 0; } - TextPaM( sal_uLong nPara, sal_uInt16 nIndex ) { mnPara = nPara, mnIndex = nIndex; } - - sal_uLong GetPara() const { return mnPara; } - sal_uLong& GetPara() { return mnPara; } - - sal_uInt16 GetIndex() const { return mnIndex; } - sal_uInt16& GetIndex() { return mnIndex; } - - inline sal_Bool operator == ( const TextPaM& rPaM ) const; - inline sal_Bool operator != ( const TextPaM& rPaM ) const; - inline sal_Bool operator < ( const TextPaM& rPaM ) const; - inline sal_Bool operator > ( const TextPaM& rPaM ) const; -}; - -inline sal_Bool TextPaM::operator == ( const TextPaM& rPaM ) const -{ - return ( ( mnPara == rPaM.mnPara ) && ( mnIndex == rPaM.mnIndex ) ) ? sal_True : sal_False; -} - -inline sal_Bool TextPaM::operator != ( const TextPaM& rPaM ) const -{ - return !( *this == rPaM ); -} - -inline sal_Bool TextPaM::operator < ( const TextPaM& rPaM ) const -{ - return ( ( mnPara < rPaM.mnPara ) || - ( ( mnPara == rPaM.mnPara ) && mnIndex < rPaM.mnIndex ) ) ? sal_True : sal_False; -} - -inline sal_Bool TextPaM::operator > ( const TextPaM& rPaM ) const -{ - return ( ( mnPara > rPaM.mnPara ) || - ( ( mnPara == rPaM.mnPara ) && mnIndex > rPaM.mnIndex ) ) ? sal_True : sal_False; -} - -class SVT_DLLPUBLIC TextSelection -{ -private: - TextPaM maStartPaM; - TextPaM maEndPaM; - -public: - TextSelection(); - TextSelection( const TextPaM& rPaM ); - TextSelection( const TextPaM& rStart, const TextPaM& rEnd ); - - const TextPaM& GetStart() const { return maStartPaM; } - TextPaM& GetStart() { return maStartPaM; } - - const TextPaM& GetEnd() const { return maEndPaM; } - TextPaM& GetEnd() { return maEndPaM; } - - void Justify(); - - sal_Bool HasRange() const { return maStartPaM != maEndPaM; } - - inline sal_Bool operator == ( const TextSelection& rSel ) const; - inline sal_Bool operator != ( const TextSelection& rSel ) const; -}; - -inline sal_Bool TextSelection::operator == ( const TextSelection& rSel ) const -{ - return ( ( maStartPaM == rSel.maStartPaM ) && ( maEndPaM == rSel.maEndPaM ) ); -} - -inline sal_Bool TextSelection::operator != ( const TextSelection& rSel ) const -{ - return !( *this == rSel ); -} - -#define TEXT_HINT_PARAINSERTED 1 -#define TEXT_HINT_PARAREMOVED 2 -#define TEXT_HINT_PARACONTENTCHANGED 3 -#define TEXT_HINT_TEXTHEIGHTCHANGED 4 -#define TEXT_HINT_FORMATPARA 5 -#define TEXT_HINT_TEXTFORMATTED 6 -#define TEXT_HINT_MODIFIED 7 -#define TEXT_HINT_BLOCKNOTIFICATION_START 8 -#define TEXT_HINT_BLOCKNOTIFICATION_END 9 -#define TEXT_HINT_INPUT_START 10 -#define TEXT_HINT_INPUT_END 11 - -#define TEXT_HINT_VIEWSCROLLED 100 -#define TEXT_HINT_VIEWSELECTIONCHANGED 101 - -class SVT_DLLPUBLIC TextHint : public SfxSimpleHint -{ -private: - sal_uLong mnValue; - -public: - TYPEINFO(); - TextHint( sal_uLong nId ); - TextHint( sal_uLong nId, sal_uLong nValue ); - - sal_uLong GetValue() const { return mnValue; } - void SetValue( sal_uLong n ) { mnValue = n; } -}; - -struct TEIMEInfos -{ - String aOldTextAfterStartPos; - sal_uInt16* pAttribs; - TextPaM aPos; - sal_uInt16 nLen; - sal_Bool bCursor; - sal_Bool bWasCursorOverwrite; - - TEIMEInfos( const TextPaM& rPos, const String& rOldTextAfterStartPos ); - ~TEIMEInfos(); - - void CopyAttribs( const sal_uInt16* pA, sal_uInt16 nL ); - void DestroyAttribs(); -}; - -// ----------------- Wrapper for old Tools List ------------------- - -#include <vector> -#include <algorithm> - -template <class T> class ToolsList : public ::std::vector< T > -{ -public: - sal_uLong Count() const { return static_cast<sal_uLong>(::std::vector< T >::size()); } - sal_uLong GetPos( T pObject ) const { return ( ::std::find( this->begin(), this->end(), pObject ) ) - this->begin(); } - T GetObject( sal_uLong nIndex ) const { return (*this)[nIndex]; } - void Insert( T pObject, sal_uLong nPos ) { ::std::vector< T >::insert( this->begin()+nPos, pObject ); } - void Remove( sal_uLong nPos ) { ::std::vector< T >::erase( this->begin()+nPos ); } -}; - -#endif // _TEXTDATA_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/inc/svtools/texteng.hxx b/svtools/inc/svtools/texteng.hxx deleted file mode 100644 index b20a01bdb9d7..000000000000 --- a/svtools/inc/svtools/texteng.hxx +++ /dev/null @@ -1,332 +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. - * - ************************************************************************/ -#ifndef _TEXTENG_HXX -#define _TEXTENG_HXX - -#include "svtools/svtdllapi.h" - -class TextDoc; -class TextView; -class TextPaM; -class TextSelection; -class TEParaPortions; -class TextAttrib; -class TextCharAttrib; -class TextUndo; -class TextUndoManager; -class EditSelFunctionSet; -class EditSelEngine; -class IdleFormatter; -class TextNode; -class OutputDevice; -class SfxUndoAction; -class KeyEvent; -class Timer; - -namespace svl -{ - class IUndoManager; -} - -class TextLine; -class TETextPortion; -#include <svl/brdcst.hxx> -#include <tools/link.hxx> -#include <vcl/font.hxx> -#include <tools/string.hxx> -#include <tools/gen.hxx> - -#include <com/sun/star/lang/Locale.hpp> -#include <com/sun/star/uno/Reference.hxx> - -struct TEIMEInfos; -class SvtCTLOptions; - -namespace com { -namespace sun { -namespace star { -namespace i18n { - class XBreakIterator; - class XExtendedInputSequenceChecker; -}}}} - -class LocaleDataWrapper; - -enum TxtAlign { TXTALIGN_LEFT, TXTALIGN_CENTER, TXTALIGN_RIGHT }; - -typedef std::vector<TextView*> TextViews; - -class SVT_DLLPUBLIC TextEngine : public SfxBroadcaster -{ - friend class TextView; - friend class TextSelFunctionSet; - friend class ExtTextEngine; - friend class ExtTextView; - - friend class TextUndo; - friend class TextUndoManager; - friend class TextUndoDelPara; - friend class TextUndoConnectParas; - friend class TextUndoSplitPara; - friend class TextUndoInsertChars; - friend class TextUndoRemoveChars; - friend class TextUndoSetAttribs; - -private: - TextDoc* mpDoc; - TEParaPortions* mpTEParaPortions; - OutputDevice* mpRefDev; - - TextViews* mpViews; - TextView* mpActiveView; - - TextUndoManager* mpUndoManager; - - IdleFormatter* mpIdleFormatter; - - TEIMEInfos* mpIMEInfos; - - ::com::sun::star::lang::Locale maLocale; - ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator > mxBreakIterator; - - Rectangle maInvalidRec; - Range maInvalidRange; - - LocaleDataWrapper* mpLocaleDataWrapper; - - Font maFont; - Color maTextColor; - sal_uInt16 mnCharHeight; - sal_uInt16 mnFixCharWidth100; - - sal_uLong mnMaxTextLen; - sal_uLong mnMaxTextWidth; - sal_uLong mnCurTextWidth; - sal_uLong mnCurTextHeight; - sal_uLong mnDefTab; - - TxtAlign meAlign; - - sal_Bool mbIsFormatting : 1; // Semaphore wegen der Hook's - sal_Bool mbFormatted : 1; - sal_Bool mbUpdate : 1; - sal_Bool mbModified : 1; - sal_Bool mbUndoEnabled : 1; - sal_Bool mbIsInUndo : 1; - sal_Bool mbDowning : 1; - sal_Bool mbRightToLeft : 1; - sal_Bool mbHasMultiLineParas : 1; - - TextEngine( const TextEngine& ) : SfxBroadcaster() {} - TextEngine& operator=( const TextEngine& ) { return *this; } - -protected: - - void CursorMoved( sal_uLong nNode ); - void TextModified(); - - void ImpInitDoc(); - void ImpRemoveText(); - TextPaM ImpDeleteText( const TextSelection& rSel ); - TextPaM ImpInsertText( const TextSelection& rSel, sal_Unicode c, sal_Bool bOverwrite = sal_False ); - TextPaM ImpInsertText( const TextSelection& rSel, const String& rText ); - TextPaM ImpInsertParaBreak( const TextSelection& rTextSelection, sal_Bool bKeepEndingAttribs = sal_True ); - TextPaM ImpInsertParaBreak( const TextPaM& rPaM, sal_Bool bKeepEndingAttribs = sal_True ); - void ImpRemoveChars( const TextPaM& rPaM, sal_uInt16 nChars, SfxUndoAction* pCurUndo = 0 ); - TextPaM ImpConnectParagraphs( sal_uLong nLeft, sal_uLong nRight ); - void ImpRemoveParagraph( sal_uLong nPara ); - void ImpInitWritingDirections( sal_uLong nPara ); - LocaleDataWrapper* ImpGetLocaleDataWrapper(); - - // to remain compatible in the minor release we copy the above ImpInsertText - // function and add the extra parameter we need but make sure this function - // gets not exported. First and seconf parameter swapped to have a different signatur. - SAL_DLLPRIVATE TextPaM ImpInsertText( sal_Unicode c, const TextSelection& rSel, sal_Bool bOverwrite = sal_False, sal_Bool bIsUserInput = sal_False ); - // some other new functions needed that must not be exported to remain compatible - SAL_DLLPRIVATE ::com::sun::star::uno::Reference < ::com::sun::star::i18n::XExtendedInputSequenceChecker > GetInputSequenceChecker() const; - SAL_DLLPRIVATE sal_Bool IsInputSequenceCheckingRequired( sal_Unicode c, const TextSelection& rCurSel ) const; - - // Broadcasten bzw. Selektionen anpassen: - void ImpParagraphInserted( sal_uLong nPara ); - void ImpParagraphRemoved( sal_uLong nPara ); - void ImpCharsRemoved( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16 nChars ); - void ImpCharsInserted( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16 nChars ); - void ImpFormattingParagraph( sal_uLong nPara ); - void ImpTextHeightChanged(); - void ImpTextFormatted(); - - DECL_LINK( IdleFormatHdl, void * ); - void CheckIdleFormatter(); - void IdleFormatAndUpdate( TextView* pCurView = 0, sal_uInt16 nMaxTimerRestarts = 5 ); - - sal_Bool CreateLines( sal_uLong nPara ); - void CreateAndInsertEmptyLine( sal_uLong nPara ); - void ImpBreakLine( sal_uLong nPara, TextLine* pLine, TETextPortion* pPortion, sal_uInt16 nPortionStart, long nRemainingWidth ); - sal_uInt16 SplitTextPortion( sal_uLong nPara, sal_uInt16 nPos ); - void CreateTextPortions( sal_uLong nPara, sal_uInt16 nStartPos ); - void RecalcTextPortion( sal_uLong nPara, sal_uInt16 nStartPos, short nNewChars ); - void SeekCursor( sal_uLong nNode, sal_uInt16 nPos, Font& rFont, OutputDevice* pOutDev ); - - void FormatDoc(); - void FormatFullDoc(); - void FormatAndUpdate( TextView* pCurView = 0 ); - sal_Bool IsFormatting() const { return mbIsFormatting; } - void UpdateViews( TextView* pCurView = 0 ); - - void ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange = 0, TextSelection const* pSelection = 0 ); - - void UpdateSelections(); - - sal_Bool IsFormatted() const { return mbFormatted; } - - sal_uInt16 GetCharPos( sal_uLong nPara, sal_uInt16 nLine, long nDocPosX, sal_Bool bSmart = sal_False ); - Rectangle GetEditCursor( const TextPaM& rPaM, sal_Bool bSpecial, sal_Bool bPreferPortionStart = sal_False ); - sal_uInt16 ImpFindIndex( sal_uLong nPortion, const Point& rPosInPara, sal_Bool bSmart ); - long ImpGetPortionXOffset( sal_uLong nPara, TextLine* pLine, sal_uInt16 nTextPortion ); - long ImpGetXPos( sal_uLong nPara, TextLine* pLine, sal_uInt16 nIndex, sal_Bool bPreferPortionStart = sal_False ); - long ImpGetOutputOffset( sal_uLong nPara, TextLine* pLine, sal_uInt16 nIndex, sal_uInt16 nIndex2 ); - sal_uInt8 ImpGetRightToLeft( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16* pStart = NULL, sal_uInt16* pEnd = NULL ); - void ImpInitLayoutMode( OutputDevice* pOutDev, sal_Bool bDrawingR2LPortion = sal_False ); - TxtAlign ImpGetAlign() const; - - sal_uLong CalcTextHeight(); - sal_uLong CalcParaHeight( sal_uLong nParagraph ) const; - sal_uLong CalcTextWidth( sal_uLong nPara ); - sal_uLong CalcTextWidth( sal_uLong nPara, sal_uInt16 nPortionStart, sal_uInt16 nPortionLen, const Font* pFont = 0 ); - Range GetInvalidYOffsets( sal_uLong nPortion ); - - // Fuer Undo/Redo - void InsertContent( TextNode* pNode, sal_uLong nPara ); - TextPaM SplitContent( sal_uLong nNode, sal_uInt16 nSepPos ); - TextPaM ConnectContents( sal_uLong nLeftNode ); - - // Ans API uebergebene PaM's und Selektionen auf einen gueltigen Bereich einstellen - void ValidateSelection( TextSelection& rSel ) const; - void ValidatePaM( TextPaM& rPaM ) const; - -public: - TextEngine(); - ~TextEngine(); - - void SetText( const String& rStr ); - String GetText( LineEnd aSeparator = LINEEND_LF ) const; - String GetText( const TextSelection& rSel, LineEnd aSeparator = LINEEND_LF ) const; - String GetTextLines( LineEnd aSeparator = LINEEND_LF ) const; - void ReplaceText(const TextSelection& rSel, const String& rText); - - sal_uLong GetTextLen( LineEnd aSeparator = LINEEND_LF ) const; - sal_uLong GetTextLen( const TextSelection& rSel, LineEnd aSeparator = LINEEND_LF ) const; - - void SetFont( const Font& rFont ); - const Font& GetFont() const { return maFont; } - - sal_uInt16 GetDefTab() const; - - void SetLeftMargin( sal_uInt16 n ); - sal_uInt16 GetLeftMargin() const; - - void SetUpdateMode( sal_Bool bUpdate ); - sal_Bool GetUpdateMode() const { return mbUpdate; } - - sal_uInt16 GetViewCount() const; - TextView* GetView( sal_uInt16 nView ) const; - void InsertView( TextView* pTextView ); - void RemoveView( TextView* pTextView ); - TextView* GetActiveView() const; - void SetActiveView( TextView* pView ); - - void SetMaxTextLen( sal_uLong nLen ); - sal_uLong GetMaxTextLen() const { return mnMaxTextLen; } - - void SetMaxTextWidth( sal_uLong nWidth ); - sal_uLong GetMaxTextWidth() const { return mnMaxTextWidth; } - - sal_uLong GetTextHeight() const; - sal_uLong CalcTextWidth(); - sal_uInt16 GetCharHeight() const { return mnCharHeight; } - - sal_uLong GetParagraphCount() const; - String GetText( sal_uLong nParagraph ) const; - sal_uInt16 GetTextLen( sal_uLong nParagraph ) const; - sal_uLong GetTextHeight( sal_uLong nParagraph ) const; - - sal_uInt16 GetLineCount( sal_uLong nParagraph ) const; - sal_uInt16 GetLineLen( sal_uLong nParagraph, sal_uInt16 nLine ) const; - - void SetRightToLeft( sal_Bool bR2L ); - sal_Bool IsRightToLeft() const { return mbRightToLeft; } - - sal_Bool HasUndoManager() const { return mpUndoManager ? sal_True : sal_False; } - ::svl::IUndoManager& - GetUndoManager(); - void UndoActionStart( sal_uInt16 nId = 0 ); - void UndoActionEnd(); - void InsertUndo( TextUndo* pUndo, sal_Bool bTryMerge = sal_False ); - sal_Bool IsInUndo() { return mbIsInUndo; } - void SetIsInUndo( sal_Bool bInUndo ) { mbIsInUndo = bInUndo; } - void ResetUndo(); - - void EnableUndo( sal_Bool bEnable ); - sal_Bool IsUndoEnabled() { return mbUndoEnabled; } - - void SetModified( sal_Bool bModified ) { mbModified = bModified; } - sal_Bool IsModified() const { return mbModified; } - - sal_Bool Read( SvStream& rInput, const TextSelection* pSel = NULL ); - - sal_Bool Write( SvStream& rOutput, const TextSelection* pSel = NULL, sal_Bool bHTML = sal_False ); - - TextPaM GetPaM( const Point& rDocPos, sal_Bool bSmart = sal_True ); - Rectangle PaMtoEditCursor( const TextPaM& rPaM, sal_Bool bSpecial = sal_False ); - String GetWord( const TextPaM& rCursorPos, TextPaM* pStartOfWord = 0 ); - - sal_Bool HasAttrib( sal_uInt16 nWhich ) const; - const TextAttrib* FindAttrib( const TextPaM& rPaM, sal_uInt16 nWhich ) const; - const TextCharAttrib* FindCharAttrib( const TextPaM& rPaM, sal_uInt16 nWhich ) const; - - void RemoveAttribs( sal_uLong nPara, sal_uInt16 nWhich, sal_Bool bIdleFormatAndUpdate ); - void RemoveAttrib( sal_uLong nPara, const TextCharAttrib& rAttrib ); - void RemoveAttribs( sal_uLong nPara, sal_Bool bIdleFormatAndUpdate = sal_True ); - void SetAttrib( const TextAttrib& rAttr, sal_uLong nPara, sal_uInt16 nStart, sal_uInt16 nEnd, sal_Bool bIdleFormatAndUpdate = sal_True ); - - TxtAlign GetTextAlign() const { return meAlign; } - void SetTextAlign( TxtAlign eAlign ); - - void Draw( OutputDevice* pDev, const Point& rPos ); - - void SetLocale( const ::com::sun::star::lang::Locale& rLocale ); - ::com::sun::star::lang::Locale GetLocale(); - ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator > GetBreakIterator(); - - static sal_Bool DoesKeyChangeText( const KeyEvent& rKeyEvent ); - static sal_Bool IsSimpleCharInput( const KeyEvent& rKeyEvent ); -}; - -#endif // _TEXTENG_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/inc/svtools/textview.hxx b/svtools/inc/svtools/textview.hxx deleted file mode 100644 index ebf7a4f6f2eb..000000000000 --- a/svtools/inc/svtools/textview.hxx +++ /dev/null @@ -1,217 +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. - * - ************************************************************************/ - -#ifndef _TEXTVIEW_HXX -#define _TEXTVIEW_HXX - -#include "svtools/svtdllapi.h" -#include <svtools/textdata.hxx> -#include <tools/gen.hxx> -#include <vcl/dndhelp.hxx> - -class TextEngine; -class OutputDevice; -class Window; -class Cursor; -class KeyEvent; -class MouseEvent; -class CommandEvent; -class TextSelFunctionSet; -class SelectionEngine; -class VirtualDevice; -struct TextDDInfo; - -namespace com { -namespace sun { -namespace star { -namespace datatransfer { -namespace clipboard { - class XClipboard; -}}}}} - -struct ImpTextView; - -class SVT_DLLPUBLIC TextView : public vcl::unohelper::DragAndDropClient -{ - friend class TextEngine; - friend class TextUndo; - friend class TextUndoManager; - friend class TextSelFunctionSet; - friend class ExtTextView; - -private: - ImpTextView* mpImpl; - - TextView( const TextView& ) : vcl::unohelper::DragAndDropClient() {} - TextView& operator=( const TextView& ) { return *this; } - -protected: - void ShowSelection(); - void HideSelection(); - void ShowSelection( const TextSelection& rSel ); - void ImpShowHideSelection( sal_Bool bShow, const TextSelection* pRange = NULL ); - - TextSelection ImpMoveCursor( const KeyEvent& rKeyEvent ); - TextPaM ImpDelete( sal_uInt8 nMode, sal_uInt8 nDelMode ); - void ImpSetSelection( const TextSelection& rNewSel, sal_Bool bUI ); - sal_Bool IsInSelection( const TextPaM& rPaM ); - - void ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange = 0, TextSelection const* pSelection = 0 ); - void ImpPaint( const Rectangle& rRect, sal_Bool bUseVirtDev ); - void ImpShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor, sal_Bool bEndKey ); - void ImpHighlight( const TextSelection& rSel ); - void ImpSetSelection( const TextSelection& rSelection ); - Point ImpGetOutputStartPos( const Point& rStartDocPos ) const; - - void ImpHideDDCursor(); - void ImpShowDDCursor(); - - bool ImplTruncateNewText( rtl::OUString& rNewText ) const; - sal_Bool ImplCheckTextLen( const String& rNewText ); - - VirtualDevice* GetVirtualDevice(); - - // DragAndDropClient - virtual void dragGestureRecognized( const ::com::sun::star::datatransfer::dnd::DragGestureEvent& dge ) throw (::com::sun::star::uno::RuntimeException); - virtual void dragDropEnd( const ::com::sun::star::datatransfer::dnd::DragSourceDropEvent& dsde ) throw (::com::sun::star::uno::RuntimeException); - virtual void drop( const ::com::sun::star::datatransfer::dnd::DropTargetDropEvent& dtde ) throw (::com::sun::star::uno::RuntimeException); - virtual void dragEnter( const ::com::sun::star::datatransfer::dnd::DropTargetDragEnterEvent& dtdee ) throw (::com::sun::star::uno::RuntimeException); - virtual void dragExit( const ::com::sun::star::datatransfer::dnd::DropTargetEvent& dte ) throw (::com::sun::star::uno::RuntimeException); - virtual void dragOver( const ::com::sun::star::datatransfer::dnd::DropTargetDragEvent& dtde ) throw (::com::sun::star::uno::RuntimeException); - - using DragAndDropClient::dragEnter; - using DragAndDropClient::dragExit; - using DragAndDropClient::dragOver; - -public: - TextView( TextEngine* pEng, Window* pWindow ); - virtual ~TextView(); - - TextEngine* GetTextEngine() const; - Window* GetWindow() const; - - void Invalidate(); - void Scroll( long nHorzScroll, long nVertScroll ); - - void ShowCursor( sal_Bool bGotoCursor = sal_True, sal_Bool bForceVisCursor = sal_True ); - void HideCursor(); - - void EnableCursor( sal_Bool bEnable ); - sal_Bool IsCursorEnabled() const; - - const TextSelection& GetSelection() const; - TextSelection& GetSelection(); - void SetSelection( const TextSelection& rNewSel ); - void SetSelection( const TextSelection& rNewSel, sal_Bool bGotoCursor ); - sal_Bool HasSelection() const; - - String GetSelected(); - String GetSelected( LineEnd aSeparator ); - void DeleteSelected(); - - void InsertNewText( const rtl::OUString& rNew, sal_Bool bSelect = sal_False ); - // deprecated: use InsertNewText instead - void InsertText( const String& rNew, sal_Bool bSelect = sal_False ); - - sal_Bool KeyInput( const KeyEvent& rKeyEvent ); - void Paint( const Rectangle& rRect ); - void MouseButtonUp( const MouseEvent& rMouseEvent ); - void MouseButtonDown( const MouseEvent& rMouseEvent ); - void MouseMove( const MouseEvent& rMouseEvent ); - void Command( const CommandEvent& rCEvt ); - - void Cut(); - void Copy(); - void Paste(); - - void Copy( ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard >& rxClipboard ); - void Paste( ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard >& rxClipboard ); - - void Undo(); - void Redo(); - - sal_Bool Read( SvStream& rInput ); - - void SetStartDocPos( const Point& rPos ); - const Point& GetStartDocPos() const; - - Point GetDocPos( const Point& rWindowPos ) const; - Point GetWindowPos( const Point& rDocPos ) const; - - void SetInsertMode( sal_Bool bInsert ); - sal_Bool IsInsertMode() const; - - void SetAutoIndentMode( sal_Bool bAutoIndent ); - - void SetReadOnly( sal_Bool bReadOnly ); - sal_Bool IsReadOnly() const; - - void SetAutoScroll( sal_Bool bAutoScroll ); - sal_Bool IsAutoScroll() const; - - sal_Bool SetCursorAtPoint( const Point& rPointPixel ); - sal_Bool IsSelectionAtPoint( const Point& rPointPixel ); - - void SetPaintSelection( sal_Bool bPaint); - - void EraseVirtualDevice(); - - // aus dem protected Teil hierher verschoben - // F�r 'SvtXECTextCursor' (TL). Mu� ggf nochmal anders gel�st werden. - TextPaM PageUp( const TextPaM& rPaM ); - TextPaM PageDown( const TextPaM& rPaM ); - TextPaM CursorUp( const TextPaM& rPaM ); - TextPaM CursorDown( const TextPaM& rPaM ); - TextPaM CursorLeft( const TextPaM& rPaM, sal_uInt16 nCharacterIteratorMode ); - TextPaM CursorRight( const TextPaM& rPaM, sal_uInt16 nCharacterIteratorMode ); - TextPaM CursorWordLeft( const TextPaM& rPaM ); - TextPaM CursorWordRight( const TextPaM& rPaM ); - TextPaM CursorStartOfLine( const TextPaM& rPaM ); - TextPaM CursorEndOfLine( const TextPaM& rPaM ); - TextPaM CursorStartOfParagraph( const TextPaM& rPaM ); - TextPaM CursorEndOfParagraph( const TextPaM& rPaM ); - TextPaM CursorStartOfDoc(); - TextPaM CursorEndOfDoc(); - - /** - Drag and Drop, deleting and selection regards all text that has an attribute - TEXTATTR_PROTECTED set as one entitity. Drag and dropped text is automatically - attibuted as protected. - */ - void SupportProtectAttribute(sal_Bool bSupport); - - /** - Returns the number in paragraph of the line in which the cursor is blinking - if enabled, -1 otherwise. - */ - sal_Int32 GetLineNumberOfCursorInSelection() const; -}; - -#endif // _TEXTVIEW_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/inc/svtools/txtattr.hxx b/svtools/inc/svtools/txtattr.hxx deleted file mode 100644 index bf4c8e38b007..000000000000 --- a/svtools/inc/svtools/txtattr.hxx +++ /dev/null @@ -1,236 +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. - * - ************************************************************************/ - -#ifndef _TXTATTR_HXX -#define _TXTATTR_HXX - -#include "svtools/svtdllapi.h" -#include <tools/color.hxx> -#include <vcl/vclenum.hxx> -#include <tools/string.hxx> -#include <tools/debug.hxx> - -class Font; - -#define TEXTATTR_INVALID 0 -#define TEXTATTR_FONTCOLOR 1 -#define TEXTATTR_HYPERLINK 2 -#define TEXTATTR_FONTWEIGHT 3 - -#define TEXTATTR_USER_START 1000 //start id for user defined text attributes -#define TEXTATTR_PROTECTED 4 - - -class SVT_DLLPUBLIC TextAttrib -{ -private: - sal_uInt16 mnWhich; - -protected: - TextAttrib( sal_uInt16 nWhich ) { mnWhich = nWhich; } - TextAttrib( const TextAttrib& rAttr ) { mnWhich = rAttr.mnWhich; } - -public: - - virtual ~TextAttrib(); - - sal_uInt16 Which() const { return mnWhich; } - virtual void SetFont( Font& rFont ) const = 0; - virtual TextAttrib* Clone() const = 0; - - virtual int operator==( const TextAttrib& rAttr ) const = 0; - int operator!=( const TextAttrib& rAttr ) const - { return !(*this == rAttr ); } -}; - - - -class SVT_DLLPUBLIC TextAttribFontColor : public TextAttrib -{ -private: - Color maColor; - -public: - TextAttribFontColor( const Color& rColor ); - TextAttribFontColor( const TextAttribFontColor& rAttr ); - ~TextAttribFontColor(); - - const Color& GetColor() const { return maColor; } - - virtual void SetFont( Font& rFont ) const; - virtual TextAttrib* Clone() const; - virtual int operator==( const TextAttrib& rAttr ) const; - -}; - -class SVT_DLLPUBLIC TextAttribFontWeight : public TextAttrib -{ -private: - FontWeight meWeight; - -public: - TextAttribFontWeight( FontWeight eWeight ); - TextAttribFontWeight( const TextAttribFontWeight& rAttr ); - ~TextAttribFontWeight(); - - virtual void SetFont( Font& rFont ) const; - virtual TextAttrib* Clone() const; - virtual int operator==( const TextAttrib& rAttr ) const; - - inline FontWeight getFontWeight() const { return meWeight; } -}; - - -class TextAttribHyperLink : public TextAttrib -{ -private: - XubString maURL; - XubString maDescription; - Color maColor; - -public: - TextAttribHyperLink( const TextAttribHyperLink& rAttr ); - ~TextAttribHyperLink(); - - void SetURL( const XubString& rURL ) { maURL = rURL; } - const XubString& GetURL() const { return maURL; } - - void SetDescription( const XubString& rDescr ) { maDescription = rDescr; } - const XubString& GetDescription() const { return maDescription; } - - void SetColor( const Color& rColor ) { maColor = rColor; } - const Color& GetColor() const { return maColor; } - - virtual void SetFont( Font& rFont ) const; - virtual TextAttrib* Clone() const; - virtual int operator==( const TextAttrib& rAttr ) const; -}; - -class SVT_DLLPUBLIC TextAttribProtect : public TextAttrib -{ -public: - TextAttribProtect(); - TextAttribProtect( const TextAttribProtect& rAttr ); - ~TextAttribProtect(); - - virtual void SetFont( Font& rFont ) const; - virtual TextAttrib* Clone() const; - virtual int operator==( const TextAttrib& rAttr ) const; - -}; - - -class TextCharAttrib -{ -private: - TextAttrib* mpAttr; - sal_uInt16 mnStart; - sal_uInt16 mnEnd; - -protected: - -public: - - TextCharAttrib( const TextAttrib& rAttr, sal_uInt16 nStart, sal_uInt16 nEnd ); - TextCharAttrib( const TextCharAttrib& rTextCharAttrib ); - ~TextCharAttrib(); - - const TextAttrib& GetAttr() const { return *mpAttr; } - - sal_uInt16 Which() const { return mpAttr->Which(); } - - sal_uInt16 GetStart() const { return mnStart; } - sal_uInt16& GetStart() { return mnStart; } - - sal_uInt16 GetEnd() const { return mnEnd; } - sal_uInt16& GetEnd() { return mnEnd; } - - inline sal_uInt16 GetLen() const; - - inline void MoveForward( sal_uInt16 nDiff ); - inline void MoveBackward( sal_uInt16 nDiff ); - - inline void Expand( sal_uInt16 nDiff ); - inline void Collaps( sal_uInt16 nDiff ); - - inline sal_Bool IsIn( sal_uInt16 nIndex ); - inline sal_Bool IsInside( sal_uInt16 nIndex ); - inline sal_Bool IsEmpty(); - -}; - -inline sal_uInt16 TextCharAttrib::GetLen() const -{ - DBG_ASSERT( mnEnd >= mnStart, "TextCharAttrib: nEnd < nStart!" ); - return mnEnd-mnStart; -} - -inline void TextCharAttrib::MoveForward( sal_uInt16 nDiff ) -{ - DBG_ASSERT( ((long)mnEnd + nDiff) <= 0xFFFF, "TextCharAttrib: MoveForward?!" ); - mnStart = mnStart + nDiff; - mnEnd = mnEnd + nDiff; -} - -inline void TextCharAttrib::MoveBackward( sal_uInt16 nDiff ) -{ - DBG_ASSERT( ((long)mnStart - nDiff) >= 0, "TextCharAttrib: MoveBackward?!" ); - mnStart = mnStart - nDiff; - mnEnd = mnEnd - nDiff; -} - -inline void TextCharAttrib::Expand( sal_uInt16 nDiff ) -{ - DBG_ASSERT( ( ((long)mnEnd + nDiff) <= (long)0xFFFF ), "TextCharAttrib: Expand?!" ); - mnEnd = mnEnd + nDiff; -} - -inline void TextCharAttrib::Collaps( sal_uInt16 nDiff ) -{ - DBG_ASSERT( (long)mnEnd - nDiff >= (long)mnStart, "TextCharAttrib: Collaps?!" ); - mnEnd = mnEnd - nDiff; -} - -inline sal_Bool TextCharAttrib::IsIn( sal_uInt16 nIndex ) -{ - return ( ( mnStart <= nIndex ) && ( mnEnd >= nIndex ) ); -} - -inline sal_Bool TextCharAttrib::IsInside( sal_uInt16 nIndex ) -{ - return ( ( mnStart < nIndex ) && ( mnEnd > nIndex ) ); -} - -inline sal_Bool TextCharAttrib::IsEmpty() -{ - return mnStart == mnEnd; -} - -#endif // _TXTATTR_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/inc/svtools/xtextedt.hxx b/svtools/inc/svtools/xtextedt.hxx deleted file mode 100644 index b0b09b0aafa5..000000000000 --- a/svtools/inc/svtools/xtextedt.hxx +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- 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 . - */ -#ifndef _XTEXTEDT_HXX -#define _XTEXTEDT_HXX - -#include "svtools/svtdllapi.h" -#include <svtools/texteng.hxx> -#include <svtools/textview.hxx> - -namespace com { -namespace sun { -namespace star { -namespace util { - struct SearchOptions; -}}}} - -class SVT_DLLPUBLIC ExtTextEngine : public TextEngine -{ -private: - String maGroupChars; - -public: - ExtTextEngine(); - ~ExtTextEngine(); - - const String& GetGroupChars() const { return maGroupChars; } - void SetGroupChars( const String& r ) { maGroupChars = r; } - TextSelection MatchGroup( const TextPaM& rCursor ) const; - - sal_Bool Search( TextSelection& rSel, const ::com::sun::star::util::SearchOptions& rSearchOptions, sal_Bool bForward = sal_True ); -}; - -class SVT_DLLPUBLIC ExtTextView : public TextView -{ -protected: - sal_Bool ImpIndentBlock( sal_Bool bRight ); - -public: - ExtTextView( ExtTextEngine* pEng, Window* pWindow ); - ~ExtTextView(); - - sal_Bool MatchGroup(); - - sal_Bool Search( const ::com::sun::star::util::SearchOptions& rSearchOptions, sal_Bool bForward ); - sal_uInt16 Replace( const ::com::sun::star::util::SearchOptions& rSearchOptions, sal_Bool bAll, sal_Bool bForward ); - - sal_Bool IndentBlock(); - sal_Bool UnindentBlock(); -}; - -#endif // _XTEXTEDT_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx index fd607f2a9c17..9031ea6d49ce 100644 --- a/svtools/source/brwbox/ebbcontrols.cxx +++ b/svtools/source/brwbox/ebbcontrols.cxx @@ -29,7 +29,7 @@ #include <svtools/editbrowsebox.hxx> #include <vcl/decoview.hxx> #include <svtools/fmtfield.hxx> -#include <svtools/xtextedt.hxx> +#include <vcl/xtextedt.hxx> #include <algorithm> diff --git a/svtools/source/contnr/DocumentInfoPreview.cxx b/svtools/source/contnr/DocumentInfoPreview.cxx index b27df1739a91..3f3f15a8cce9 100644 --- a/svtools/source/contnr/DocumentInfoPreview.cxx +++ b/svtools/source/contnr/DocumentInfoPreview.cxx @@ -38,7 +38,7 @@ #include "svl/inettype.hxx" #include "svtools/DocumentInfoPreview.hxx" #include "svtools/imagemgr.hxx" -#include "svtools/txtattr.hxx" +#include "vcl/txtattr.hxx" #include "tools/datetime.hxx" #include "tools/urlobj.hxx" #include "unotools/pathoptions.hxx" diff --git a/svtools/source/contnr/templwin.cxx b/svtools/source/contnr/templwin.cxx index 937236f785b0..301967a7d1a5 100644 --- a/svtools/source/contnr/templwin.cxx +++ b/svtools/source/contnr/templwin.cxx @@ -33,13 +33,13 @@ #include <unotools/pathoptions.hxx> #include <unotools/dynamicmenuoptions.hxx> #include <unotools/extendedsecurityoptions.hxx> -#include <svtools/xtextedt.hxx> +#include <vcl/xtextedt.hxx> #include <svl/inettype.hxx> #include <svtools/imagemgr.hxx> #include <svtools/miscopt.hxx> #include <svtools/templatefoldercache.hxx> #include <svtools/imgdef.hxx> -#include <svtools/txtattr.hxx> +#include <vcl/txtattr.hxx> #include <svtools/svtools.hrc> #include "templwin.hrc" #include <svtools/helpid.hrc> diff --git a/svtools/source/edit/editsyntaxhighlighter.cxx b/svtools/source/edit/editsyntaxhighlighter.cxx index 20749db44fc9..18361d33d9ed 100644 --- a/svtools/source/edit/editsyntaxhighlighter.cxx +++ b/svtools/source/edit/editsyntaxhighlighter.cxx @@ -28,9 +28,9 @@ #include <svtools/svmedit.hxx> -#include <svtools/xtextedt.hxx> +#include <vcl/xtextedt.hxx> #include <svtools/editsyntaxhighlighter.hxx> -#include <svtools/txtattr.hxx> +#include <vcl/txtattr.hxx> MultiLineEditSyntaxHighlight::MultiLineEditSyntaxHighlight( Window* pParent, WinBits nWinStyle, diff --git a/svtools/source/edit/svmedit.cxx b/svtools/source/edit/svmedit.cxx index 4fff9e02d1e4..24e97ec5707b 100644 --- a/svtools/source/edit/svmedit.cxx +++ b/svtools/source/edit/svmedit.cxx @@ -26,1593 +26,38 @@ * ************************************************************************/ -#include <memory> -#include "unoiface.hxx" - -#include <tools/rc.h> - -#include <vcl/decoview.hxx> -#include <vcl/svapp.hxx> -#include <svtools/svmedit.hxx> -#include <svtools/xtextedt.hxx> -#include <svl/brdcst.hxx> -#include <svl/undo.hxx> +#include "unoiface.hxx" #include <svtools/textwindowpeer.hxx> -#include <svl/lstner.hxx> -#include <svl/smplhint.hxx> - - -// IDs erstmal aus VCL geklaut, muss mal richtig delivert werden... -#define SV_MENU_EDIT_UNDO 1 -#define SV_MENU_EDIT_CUT 2 -#define SV_MENU_EDIT_COPY 3 -#define SV_MENU_EDIT_PASTE 4 -#define SV_MENU_EDIT_DELETE 5 -#define SV_MENU_EDIT_SELECTALL 6 -#define SV_MENU_EDIT_INSERTSYMBOL 7 -#include <vcl/scrbar.hxx> - -namespace css = ::com::sun::star; - -class TextWindow : public Window -{ -private: - ExtTextEngine* mpExtTextEngine; - ExtTextView* mpExtTextView; - - sal_Bool mbInMBDown; - sal_Bool mbFocusSelectionHide; - sal_Bool mbIgnoreTab; - sal_Bool mbActivePopup; - sal_Bool mbSelectOnTab; - sal_Bool mbTextSelectable; - -public: - TextWindow( Window* pParent ); - ~TextWindow(); - - ExtTextEngine* GetTextEngine() const { return mpExtTextEngine; } - ExtTextView* GetTextView() const { return mpExtTextView; } - - virtual void MouseMove( const MouseEvent& rMEvt ); - virtual void MouseButtonDown( const MouseEvent& rMEvt ); - virtual void MouseButtonUp( const MouseEvent& rMEvt ); - virtual void KeyInput( const KeyEvent& rKEvent ); - - virtual void Command( const CommandEvent& rCEvt ); - - virtual void Paint( const Rectangle& rRect ); - virtual void Resize(); - - virtual void GetFocus(); - virtual void LoseFocus(); - - sal_Bool IsAutoFocusHide() const { return mbFocusSelectionHide; } - void SetAutoFocusHide( sal_Bool bAutoHide ) { mbFocusSelectionHide = bAutoHide; } - - sal_Bool IsIgnoreTab() const { return mbIgnoreTab; } - void SetIgnoreTab( sal_Bool bIgnore ) { mbIgnoreTab = bIgnore; } - - void DisableSelectionOnFocus() { mbSelectOnTab = sal_False; } - - void SetTextSelectable( sal_Bool bTextSelectable ) { mbTextSelectable = bTextSelectable; } - - virtual - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > - GetComponentInterface(sal_Bool bCreate = sal_True); -}; - - -class ImpSvMEdit : public SfxListener -{ -private: - MultiLineEdit* pSvMultiLineEdit; - - TextWindow* mpTextWindow; - ScrollBar* mpHScrollBar; - ScrollBar* mpVScrollBar; - ScrollBarBox* mpScrollBox; - - Point maTextWindowOffset; - xub_StrLen mnTextWidth; - mutable Selection maSelection; - -protected: - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); - void ImpUpdateSrollBarVis( WinBits nWinStyle ); - void ImpInitScrollBars(); - void ImpSetScrollBarRanges(); - void ImpSetHScrollBarThumbPos(); - DECL_LINK( ScrollHdl, ScrollBar* ); - -public: - ImpSvMEdit( MultiLineEdit* pSvMultiLineEdit, WinBits nWinStyle ); - ~ImpSvMEdit(); - - void SetModified( sal_Bool bMod ); - sal_Bool IsModified() const; - - void SetReadOnly( sal_Bool bRdOnly ); - sal_Bool IsReadOnly() const; - - void SetMaxTextLen( xub_StrLen nLen ); - xub_StrLen GetMaxTextLen() const; - - sal_Bool IsInsertMode() const; - - void InsertText( const String& rStr ); - String GetSelected() const; - String GetSelected( LineEnd aSeparator ) const; - - void SetSelection( const Selection& rSelection ); - const Selection& GetSelection() const; - - void Cut(); - void Copy(); - void Paste(); - - void SetText( const String& rStr ); - String GetText() const; - String GetText( LineEnd aSeparator ) const; - String GetTextLines( LineEnd aSeparator ) const; - - void Resize(); - void GetFocus(); - - sal_Bool HandleCommand( const CommandEvent& rCEvt ); - - void Enable( sal_Bool bEnable ); - - Size CalcMinimumSize() const; - Size CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const; - void GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const; - - void SetAlign( WinBits nWinStyle ); - - void InitFromStyle( WinBits nWinStyle ); - - TextWindow* GetTextWindow() { return mpTextWindow; } - ScrollBar* GetHScrollBar() { return mpHScrollBar; } - ScrollBar* GetVScrollBar() { return mpVScrollBar; } -}; - -ImpSvMEdit::ImpSvMEdit( MultiLineEdit* pEdt, WinBits nWinStyle ) - :mpHScrollBar(NULL) - ,mpVScrollBar(NULL) - ,mpScrollBox(NULL) -{ - pSvMultiLineEdit = pEdt; - mnTextWidth = 0; - mpTextWindow = new TextWindow( pEdt ); - mpTextWindow->Show(); - InitFromStyle( nWinStyle ); - StartListening( *mpTextWindow->GetTextEngine() ); -} - -void ImpSvMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) -{ - const sal_Bool bHaveVScroll = (NULL != mpVScrollBar); - const sal_Bool bHaveHScroll = (NULL != mpHScrollBar); - const sal_Bool bHaveScrollBox = (NULL != mpScrollBox); - - sal_Bool bNeedVScroll = ( nWinStyle & WB_VSCROLL ) == WB_VSCROLL; - const sal_Bool bNeedHScroll = ( nWinStyle & WB_HSCROLL ) == WB_HSCROLL; - - const sal_Bool bAutoVScroll = ( nWinStyle & WB_AUTOVSCROLL ) == WB_AUTOVSCROLL; - if ( !bNeedVScroll && bAutoVScroll ) - { - TextEngine& rEngine( *mpTextWindow->GetTextEngine() ); - sal_uLong nOverallTextHeight(0); - for ( sal_uLong i=0; i<rEngine.GetParagraphCount(); ++i ) - nOverallTextHeight += rEngine.GetTextHeight( i ); - if ( nOverallTextHeight > (sal_uLong)mpTextWindow->GetOutputSizePixel().Height() ) - bNeedVScroll = true; - } - - const sal_Bool bNeedScrollBox = bNeedVScroll && bNeedHScroll; - - sal_Bool bScrollbarsChanged = false; - if ( bHaveVScroll != bNeedVScroll ) - { - delete mpVScrollBar; - mpVScrollBar = bNeedVScroll ? new ScrollBar( pSvMultiLineEdit, WB_VSCROLL|WB_DRAG ) : NULL; - - if ( bNeedVScroll ) - { - mpVScrollBar->Show(); - mpVScrollBar->SetScrollHdl( LINK( this, ImpSvMEdit, ScrollHdl ) ); - } - - bScrollbarsChanged = sal_True; - } - - if ( bHaveHScroll != bNeedHScroll ) - { - delete mpHScrollBar; - mpHScrollBar = bNeedHScroll ? new ScrollBar( pSvMultiLineEdit, WB_HSCROLL|WB_DRAG ) : NULL; - - if ( bNeedHScroll ) - { - mpHScrollBar->Show(); - mpHScrollBar->SetScrollHdl( LINK( this, ImpSvMEdit, ScrollHdl ) ); - } - - bScrollbarsChanged = sal_True; - } - - if ( bHaveScrollBox != bNeedScrollBox ) - { - delete mpScrollBox; - mpScrollBox = bNeedScrollBox ? new ScrollBarBox( pSvMultiLineEdit, WB_SIZEABLE ) : NULL; - - if ( bNeedScrollBox ) - mpScrollBox->Show(); - } - - if ( bScrollbarsChanged ) - { - ImpInitScrollBars(); - Resize(); - } -} - -void ImpSvMEdit::InitFromStyle( WinBits nWinStyle ) -{ - ImpUpdateSrollBarVis( nWinStyle ); - SetAlign( nWinStyle ); - - if ( nWinStyle & WB_NOHIDESELECTION ) - mpTextWindow->SetAutoFocusHide( sal_False ); - else - mpTextWindow->SetAutoFocusHide( sal_True ); - - if ( nWinStyle & WB_READONLY ) - mpTextWindow->GetTextView()->SetReadOnly( sal_True ); - else - mpTextWindow->GetTextView()->SetReadOnly( sal_False ); - - if ( nWinStyle & WB_IGNORETAB ) - { - mpTextWindow->SetIgnoreTab( sal_True ); - } - else - { - mpTextWindow->SetIgnoreTab( sal_False ); - // #103667# MultiLineEdit has the flag, but focusable window also needs this flag - WinBits nStyle = mpTextWindow->GetStyle(); - nStyle |= WINDOW_DLGCTRL_MOD1TAB; - mpTextWindow->SetStyle( nStyle ); - } -} - -ImpSvMEdit::~ImpSvMEdit() -{ - EndListening( *mpTextWindow->GetTextEngine() ); - delete mpTextWindow; - delete mpHScrollBar; - delete mpVScrollBar; - delete mpScrollBox; -} - -void ImpSvMEdit::ImpSetScrollBarRanges() -{ - if ( mpVScrollBar ) - { - sal_uLong nTextHeight = mpTextWindow->GetTextEngine()->GetTextHeight(); - mpVScrollBar->SetRange( Range( 0, (long)nTextHeight-1 ) ); - } - if ( mpHScrollBar ) - { -// sal_uLong nTextWidth = mpTextWindow->GetTextEngine()->CalcTextWidth(); - // Es gibt kein Notify bei Breiten-Aenderung... -// sal_uLong nW = Max( (sal_uLong)mpTextWindow->GetOutputSizePixel().Width()*5, (sal_uLong)nTextWidth ); -// mpHScrollBar->SetRange( Range( 0, (long)nW ) ); - mpHScrollBar->SetRange( Range( 0, (long)mnTextWidth-1 ) ); - } -} - -void ImpSvMEdit::ImpInitScrollBars() -{ - static const sal_Unicode sampleChar = { 'x' }; - if ( mpHScrollBar || mpVScrollBar ) - { - ImpSetScrollBarRanges(); - Size aCharBox; - aCharBox.Width() = mpTextWindow->GetTextWidth( rtl::OUString(sampleChar) ); - aCharBox.Height() = mpTextWindow->GetTextHeight(); - Size aOutSz = mpTextWindow->GetOutputSizePixel(); - if ( mpHScrollBar ) - { - mpHScrollBar->SetVisibleSize( aOutSz.Width() ); - mpHScrollBar->SetPageSize( aOutSz.Width() * 8 / 10 ); - mpHScrollBar->SetLineSize( aCharBox.Width()*10 ); - ImpSetHScrollBarThumbPos(); - } - if ( mpVScrollBar ) - { - mpVScrollBar->SetVisibleSize( aOutSz.Height() ); - mpVScrollBar->SetPageSize( aOutSz.Height() * 8 / 10 ); - mpVScrollBar->SetLineSize( aCharBox.Height() ); - mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); - } - } -} - -void ImpSvMEdit::ImpSetHScrollBarThumbPos() -{ - long nX = mpTextWindow->GetTextView()->GetStartDocPos().X(); - if ( !mpTextWindow->GetTextEngine()->IsRightToLeft() ) - mpHScrollBar->SetThumbPos( nX ); - else - mpHScrollBar->SetThumbPos( mnTextWidth - mpHScrollBar->GetVisibleSize() - nX ); - -} - -IMPL_LINK( ImpSvMEdit, ScrollHdl, ScrollBar*, pCurScrollBar ) -{ - long nDiffX = 0, nDiffY = 0; - - if ( pCurScrollBar == mpVScrollBar ) - nDiffY = mpTextWindow->GetTextView()->GetStartDocPos().Y() - pCurScrollBar->GetThumbPos(); - else if ( pCurScrollBar == mpHScrollBar ) - nDiffX = mpTextWindow->GetTextView()->GetStartDocPos().X() - pCurScrollBar->GetThumbPos(); - - mpTextWindow->GetTextView()->Scroll( nDiffX, nDiffY ); - // mpTextWindow->GetTextView()->ShowCursor( sal_False, sal_True ); - - return 0; -} - - -// void ImpSvMEdit::ImpModified() -// { -// // Wann wird das gerufen ????????????????????? -// pSvMultiLineEdit->Modify(); -// } - -void ImpSvMEdit::SetAlign( WinBits nWinStyle ) -{ - sal_Bool bRTL = Application::GetSettings().GetLayoutRTL(); - mpTextWindow->GetTextEngine()->SetRightToLeft( bRTL ); - - if ( nWinStyle & WB_CENTER ) - mpTextWindow->GetTextEngine()->SetTextAlign( TXTALIGN_CENTER ); - else if ( nWinStyle & WB_RIGHT ) - mpTextWindow->GetTextEngine()->SetTextAlign( !bRTL ? TXTALIGN_RIGHT : TXTALIGN_LEFT ); - else if ( nWinStyle & WB_LEFT ) - mpTextWindow->GetTextEngine()->SetTextAlign( !bRTL ? TXTALIGN_LEFT : TXTALIGN_RIGHT ); -} - -void ImpSvMEdit::SetModified( sal_Bool bMod ) -{ - mpTextWindow->GetTextEngine()->SetModified( bMod ); -} - -sal_Bool ImpSvMEdit::IsModified() const -{ - return mpTextWindow->GetTextEngine()->IsModified(); -} - -void ImpSvMEdit::SetReadOnly( sal_Bool bRdOnly ) -{ - mpTextWindow->GetTextView()->SetReadOnly( bRdOnly ); - // Farbe anpassen ??????????????????????????? -} - -sal_Bool ImpSvMEdit::IsReadOnly() const -{ - return mpTextWindow->GetTextView()->IsReadOnly(); -} - -void ImpSvMEdit::SetMaxTextLen( xub_StrLen nLen ) -{ - mpTextWindow->GetTextEngine()->SetMaxTextLen( nLen ); -} - -xub_StrLen ImpSvMEdit::GetMaxTextLen() const -{ - return sal::static_int_cast< xub_StrLen >( - mpTextWindow->GetTextEngine()->GetMaxTextLen()); -} - -void ImpSvMEdit::InsertText( const String& rStr ) -{ - mpTextWindow->GetTextView()->InsertText( rStr ); -} - -String ImpSvMEdit::GetSelected() const -{ - return mpTextWindow->GetTextView()->GetSelected(); -} - -String ImpSvMEdit::GetSelected( LineEnd aSeparator ) const -{ - return mpTextWindow->GetTextView()->GetSelected( aSeparator ); -} - -void ImpSvMEdit::Resize() -{ - size_t nIteration = 1; - do - { - WinBits nWinStyle( pSvMultiLineEdit->GetStyle() ); - if ( ( nWinStyle & WB_AUTOVSCROLL ) == WB_AUTOVSCROLL ) - ImpUpdateSrollBarVis( nWinStyle ); - - Size aSz = pSvMultiLineEdit->GetOutputSizePixel(); - Size aEditSize = aSz; - long nSBWidth = pSvMultiLineEdit->GetSettings().GetStyleSettings().GetScrollBarSize(); - nSBWidth = pSvMultiLineEdit->CalcZoom( nSBWidth ); - - if ( mpHScrollBar ) - aSz.Height() -= nSBWidth+1; - if ( mpVScrollBar ) - aSz.Width() -= nSBWidth+1; - - if ( !mpHScrollBar ) - mpTextWindow->GetTextEngine()->SetMaxTextWidth( aSz.Width() ); - else - mpHScrollBar->SetPosSizePixel( 0, aEditSize.Height()-nSBWidth, aSz.Width(), nSBWidth ); - Point aTextWindowPos( maTextWindowOffset ); - if ( mpVScrollBar ) - { - if( Application::GetSettings().GetLayoutRTL() ) - { - mpVScrollBar->SetPosSizePixel( 0, 0, nSBWidth, aSz.Height() ); - aTextWindowPos.X() += nSBWidth; - } - else - mpVScrollBar->SetPosSizePixel( aEditSize.Width()-nSBWidth, 0, nSBWidth, aSz.Height() ); - } - - if ( mpScrollBox ) - mpScrollBox->SetPosSizePixel( aSz.Width(), aSz.Height(), nSBWidth, nSBWidth ); - - Size aTextWindowSize( aSz ); - aTextWindowSize.Width() -= maTextWindowOffset.X(); - aTextWindowSize.Height() -= maTextWindowOffset.Y(); - if ( aTextWindowSize.Width() < 0 ) - aTextWindowSize.Width() = 0; - if ( aTextWindowSize.Height() < 0 ) - aTextWindowSize.Height() = 0; - - Size aOldTextWindowSize( mpTextWindow->GetSizePixel() ); - mpTextWindow->SetPosSizePixel( aTextWindowPos, aTextWindowSize ); - if ( aOldTextWindowSize == aTextWindowSize ) - break; - - // Changing the text window size might effectively have changed the need for - // scrollbars, so do another iteration. - ++nIteration; - OSL_ENSURE( nIteration < 3, "ImpSvMEdit::Resize: isn't this expected to terminate with the second iteration?" ); - - } while ( nIteration <= 3 ); // artificial break after four iterations - - ImpInitScrollBars(); -} - -void ImpSvMEdit::GetFocus() -{ - mpTextWindow->GrabFocus(); -} - -void ImpSvMEdit::Cut() -{ - if ( !mpTextWindow->GetTextView()->IsReadOnly() ) - mpTextWindow->GetTextView()->Cut(); -} - -void ImpSvMEdit::Copy() -{ - mpTextWindow->GetTextView()->Copy(); -} -void ImpSvMEdit::Paste() -{ - if ( !mpTextWindow->GetTextView()->IsReadOnly() ) - mpTextWindow->GetTextView()->Paste(); -} - -void ImpSvMEdit::SetText( const String& rStr ) -{ - sal_Bool bWasModified = mpTextWindow->GetTextEngine()->IsModified(); - mpTextWindow->GetTextEngine()->SetText( rStr ); - if ( !bWasModified ) - mpTextWindow->GetTextEngine()->SetModified( sal_False ); - - mpTextWindow->GetTextView()->SetSelection( TextSelection() ); - - WinBits nWinStyle( pSvMultiLineEdit->GetStyle() ); - if ( ( nWinStyle & WB_AUTOVSCROLL ) == WB_AUTOVSCROLL ) - ImpUpdateSrollBarVis( nWinStyle ); -} - -String ImpSvMEdit::GetText() const -{ - return mpTextWindow->GetTextEngine()->GetText(); -} - -String ImpSvMEdit::GetText( LineEnd aSeparator ) const -{ - return mpTextWindow->GetTextEngine()->GetText( aSeparator ); -} - -String ImpSvMEdit::GetTextLines( LineEnd aSeparator ) const -{ - return mpTextWindow->GetTextEngine()->GetTextLines( aSeparator ); -} - -void ImpSvMEdit::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( TextHint ) ) - { - const TextHint& rTextHint = (const TextHint&)rHint; - if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED ) - { - if ( mpHScrollBar ) - ImpSetHScrollBarThumbPos(); - if ( mpVScrollBar ) - mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); - } - else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED ) - { - if ( mpTextWindow->GetTextView()->GetStartDocPos().Y() ) - { - long nOutHeight = mpTextWindow->GetOutputSizePixel().Height(); - long nTextHeight = mpTextWindow->GetTextEngine()->GetTextHeight(); - if ( nTextHeight < nOutHeight ) - mpTextWindow->GetTextView()->Scroll( 0, mpTextWindow->GetTextView()->GetStartDocPos().Y() ); - } - - ImpSetScrollBarRanges(); - } - else if( rTextHint.GetId() == TEXT_HINT_TEXTFORMATTED ) - { - if ( mpHScrollBar ) - { - sal_uLong nWidth = mpTextWindow->GetTextEngine()->CalcTextWidth(); - if ( nWidth != mnTextWidth ) - { - mnTextWidth = sal::static_int_cast< xub_StrLen >(nWidth); - mpHScrollBar->SetRange( Range( 0, (long)mnTextWidth-1 ) ); - ImpSetHScrollBarThumbPos(); - } - } - } - else if( rTextHint.GetId() == TEXT_HINT_MODIFIED ) - { - pSvMultiLineEdit->Modify(); - } - } -} - -void ImpSvMEdit::SetSelection( const Selection& rSelection ) -{ - String aText = mpTextWindow->GetTextEngine()->GetText(); - - Selection aNewSelection( rSelection ); - if ( aNewSelection.Min() < 0 ) - aNewSelection.Min() = 0; - else if ( aNewSelection.Min() > aText.Len() ) - aNewSelection.Min() = aText.Len(); - if ( aNewSelection.Max() < 0 ) - aNewSelection.Max() = 0; - else if ( aNewSelection.Max() > aText.Len() ) - aNewSelection.Max() = aText.Len(); - - long nEnd = Max( aNewSelection.Min(), aNewSelection.Max() ); - TextSelection aTextSel; - sal_uLong nPara = 0; - sal_uInt16 nChar = 0; - sal_uInt16 x = 0; - while ( x <= nEnd ) - { - if ( x == aNewSelection.Min() ) - aTextSel.GetStart() = TextPaM( nPara, nChar ); - if ( x == aNewSelection.Max() ) - aTextSel.GetEnd() = TextPaM( nPara, nChar ); - - if ( ( x < aText.Len() ) && ( aText.GetChar( x ) == '\n' ) ) - { - nPara++; - nChar = 0; - } - else - nChar++; - x++; - } - mpTextWindow->GetTextView()->SetSelection( aTextSel ); -} - -const Selection& ImpSvMEdit::GetSelection() const -{ - maSelection = Selection(); - TextSelection aTextSel( mpTextWindow->GetTextView()->GetSelection() ); - aTextSel.Justify(); - // Selektion flachklopfen => jeder Umbruch ein Zeichen... - - ExtTextEngine* pExtTextEngine = mpTextWindow->GetTextEngine(); - // Absaetze davor: - sal_uLong n; - for ( n = 0; n < aTextSel.GetStart().GetPara(); n++ ) - { - maSelection.Min() += pExtTextEngine->GetTextLen( n ); - maSelection.Min()++; - } - - // Erster Absatz mit Selektion: - maSelection.Max() = maSelection.Min(); - maSelection.Min() += aTextSel.GetStart().GetIndex(); - - for ( n = aTextSel.GetStart().GetPara(); n < aTextSel.GetEnd().GetPara(); n++ ) - { - maSelection.Max() += pExtTextEngine->GetTextLen( n ); - maSelection.Max()++; - } - - maSelection.Max() += aTextSel.GetEnd().GetIndex(); - - return maSelection; -} - -Size ImpSvMEdit::CalcMinimumSize() const -{ - Size aSz( mpTextWindow->GetTextEngine()->CalcTextWidth(), - mpTextWindow->GetTextEngine()->GetTextHeight() ); - - if ( mpHScrollBar ) - aSz.Height() += mpHScrollBar->GetSizePixel().Height(); - if ( mpVScrollBar ) - aSz.Width() += mpVScrollBar->GetSizePixel().Width(); - - return aSz; -} - -Size ImpSvMEdit::CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const -{ - static const sal_Unicode sampleChar = 'X'; - - Size aSz; - Size aCharSz; - aCharSz.Width() = mpTextWindow->GetTextWidth( rtl::OUString(sampleChar) ); - aCharSz.Height() = mpTextWindow->GetTextHeight(); - - if ( nLines ) - aSz.Height() = nLines*aCharSz.Height(); - else - aSz.Height() = mpTextWindow->GetTextEngine()->GetTextHeight(); - - if ( nColumns ) - aSz.Width() = nColumns*aCharSz.Width(); - else - aSz.Width() = mpTextWindow->GetTextEngine()->CalcTextWidth(); - - if ( mpHScrollBar ) - aSz.Height() += mpHScrollBar->GetSizePixel().Height(); - if ( mpVScrollBar ) - aSz.Width() += mpVScrollBar->GetSizePixel().Width(); - - return aSz; -} - -void ImpSvMEdit::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const -{ - static const sal_Unicode sampleChar = { 'x' }; - Size aOutSz = mpTextWindow->GetOutputSizePixel(); - Size aCharSz( mpTextWindow->GetTextWidth( rtl::OUString(sampleChar) ), mpTextWindow->GetTextHeight() ); - rnCols = (sal_uInt16) (aOutSz.Width()/aCharSz.Width()); - rnLines = (sal_uInt16) (aOutSz.Height()/aCharSz.Height()); -} - -void ImpSvMEdit::Enable( sal_Bool bEnable ) -{ - mpTextWindow->Enable( bEnable ); - if ( mpHScrollBar ) - mpHScrollBar->Enable( bEnable ); - if ( mpVScrollBar ) - mpVScrollBar->Enable( bEnable ); -} - -sal_Bool ImpSvMEdit::HandleCommand( const CommandEvent& rCEvt ) -{ - sal_Bool bDone = sal_False; - if ( ( rCEvt.GetCommand() == COMMAND_WHEEL ) || - ( rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL ) || - ( rCEvt.GetCommand() == COMMAND_AUTOSCROLL ) ) - { - mpTextWindow->HandleScrollCommand( rCEvt, mpHScrollBar, mpVScrollBar ); - bDone = sal_True; - } - return bDone; -} - - -TextWindow::TextWindow( Window* pParent ) : Window( pParent ) -{ - mbInMBDown = sal_False; - mbSelectOnTab = sal_True; - mbFocusSelectionHide = sal_False; - mbIgnoreTab = sal_False; - mbActivePopup = sal_False; - mbSelectOnTab = sal_True; - mbTextSelectable = sal_True; - - SetPointer( Pointer( POINTER_TEXT ) ); - - mpExtTextEngine = new ExtTextEngine; - mpExtTextEngine->SetMaxTextLen( STRING_MAXLEN ); - if( pParent->GetStyle() & WB_BORDER ) - mpExtTextEngine->SetLeftMargin( 2 ); - mpExtTextEngine->SetLocale( GetSettings().GetLocale() ); - mpExtTextView = new ExtTextView( mpExtTextEngine, this ); - mpExtTextEngine->InsertView( mpExtTextView ); - mpExtTextEngine->EnableUndo( sal_True ); - mpExtTextView->ShowCursor(); - - Color aBackgroundColor = GetSettings().GetStyleSettings().GetWorkspaceColor(); - SetBackground( aBackgroundColor ); - pParent->SetBackground( aBackgroundColor ); -} - -TextWindow::~TextWindow() -{ - delete mpExtTextView; - delete mpExtTextEngine; -} - -void TextWindow::MouseMove( const MouseEvent& rMEvt ) -{ - mpExtTextView->MouseMove( rMEvt ); - Window::MouseMove( rMEvt ); -} - -void TextWindow::MouseButtonDown( const MouseEvent& rMEvt ) -{ - if ( !mbTextSelectable ) - return; - - mbInMBDown = sal_True; // Dann im GetFocus nicht alles selektieren wird - mpExtTextView->MouseButtonDown( rMEvt ); - Window::MouseButtonDown( rMEvt ); - GrabFocus(); - mbInMBDown = sal_False; -} - -void TextWindow::MouseButtonUp( const MouseEvent& rMEvt ) -{ - mpExtTextView->MouseButtonUp( rMEvt ); - Window::MouseButtonUp( rMEvt ); -} - -void TextWindow::KeyInput( const KeyEvent& rKEvent ) -{ - sal_Bool bDone = sal_False; - sal_uInt16 nCode = rKEvent.GetKeyCode().GetCode(); - if ( nCode == com::sun::star::awt::Key::SELECT_ALL || - ( (nCode == KEY_A) && rKEvent.GetKeyCode().IsMod1() && !rKEvent.GetKeyCode().IsMod2() ) - ) - { - mpExtTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFF, 0xFFFF ) ) ); - bDone = sal_True; - } - else if ( (nCode == KEY_S) && rKEvent.GetKeyCode().IsShift() && rKEvent.GetKeyCode().IsMod1() ) - { - if ( Edit::GetGetSpecialCharsFunction() ) - { - // Damit die Selektion erhalten bleibt - mbActivePopup = sal_True; - rtl::OUString aChars = Edit::GetGetSpecialCharsFunction()( this, GetFont() ); - if (!aChars.isEmpty()) - { - mpExtTextView->InsertText( aChars ); - mpExtTextView->GetTextEngine()->SetModified( sal_True ); - } - mbActivePopup = sal_False; - bDone = sal_True; - } - } - else if ( nCode == KEY_TAB ) - { - if ( !mbIgnoreTab || rKEvent.GetKeyCode().IsMod1() ) - bDone = mpExtTextView->KeyInput( rKEvent ); - } - else - { - bDone = mpExtTextView->KeyInput( rKEvent ); - } - - if ( !bDone ) - Window::KeyInput( rKEvent ); -} - -void TextWindow::Paint( const Rectangle& rRect ) -{ - mpExtTextView->Paint( rRect ); -} - -void TextWindow::Resize() -{ -} - -void TextWindow::Command( const CommandEvent& rCEvt ) -{ - if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) - { - PopupMenu* pPopup = Edit::CreatePopupMenu(); - if ( !mpExtTextView->HasSelection() ) - { - pPopup->EnableItem( SV_MENU_EDIT_CUT, sal_False ); - pPopup->EnableItem( SV_MENU_EDIT_COPY, sal_False ); - pPopup->EnableItem( SV_MENU_EDIT_DELETE, sal_False ); - } - if ( mpExtTextView->IsReadOnly() ) - { - pPopup->EnableItem( SV_MENU_EDIT_CUT, sal_False ); - pPopup->EnableItem( SV_MENU_EDIT_PASTE, sal_False ); - pPopup->EnableItem( SV_MENU_EDIT_DELETE, sal_False ); - pPopup->EnableItem( SV_MENU_EDIT_INSERTSYMBOL, sal_False ); - } - if ( !mpExtTextView->GetTextEngine()->HasUndoManager() || !mpExtTextView->GetTextEngine()->GetUndoManager().GetUndoActionCount() ) - { - pPopup->EnableItem( SV_MENU_EDIT_UNDO, sal_False ); - } -// if ( ( maSelection.Min() == 0 ) && ( maSelection.Max() == maText.Len() ) ) -// { -// pPopup->EnableItem( SV_MENU_EDIT_SELECTALL, sal_False ); -// } - if ( !Edit::GetGetSpecialCharsFunction() ) - { - sal_uInt16 nPos = pPopup->GetItemPos( SV_MENU_EDIT_INSERTSYMBOL ); - pPopup->RemoveItem( nPos ); - pPopup->RemoveItem( nPos-1 ); - } - - mbActivePopup = sal_True; - Point aPos = rCEvt.GetMousePosPixel(); - if ( !rCEvt.IsMouseEvent() ) - { - // !!! Irgendwann einmal Menu zentriert in der Selektion anzeigen !!! - Size aSize = GetOutputSizePixel(); - aPos = Point( aSize.Width()/2, aSize.Height()/2 ); - } -// pPopup->RemoveDisabledEntries(); - sal_uInt16 n = pPopup->Execute( this, aPos ); - Edit::DeletePopupMenu( pPopup ); - switch ( n ) - { - case SV_MENU_EDIT_UNDO: mpExtTextView->Undo(); - mpExtTextEngine->SetModified( sal_True ); - mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - break; - case SV_MENU_EDIT_CUT: mpExtTextView->Cut(); - mpExtTextEngine->SetModified( sal_True ); - mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - break; - case SV_MENU_EDIT_COPY: mpExtTextView->Copy(); - break; - case SV_MENU_EDIT_PASTE: mpExtTextView->Paste(); - mpExtTextEngine->SetModified( sal_True ); - mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - break; - case SV_MENU_EDIT_DELETE: mpExtTextView->DeleteSelected(); - mpExtTextEngine->SetModified( sal_True ); - mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - break; - case SV_MENU_EDIT_SELECTALL: mpExtTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) ); - break; - case SV_MENU_EDIT_INSERTSYMBOL: - { - rtl::OUString aChars = Edit::GetGetSpecialCharsFunction()( this, GetFont() ); - if (!aChars.isEmpty()) - { - mpExtTextView->InsertText( aChars ); - mpExtTextEngine->SetModified( sal_True ); - mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - } - } - break; - } - mbActivePopup = sal_False; - } - else - { - mpExtTextView->Command( rCEvt ); - } - Window::Command( rCEvt ); -} - -void TextWindow::GetFocus() -{ - Window::GetFocus(); - if ( !mbActivePopup ) - { - sal_Bool bGotoCursor = !mpExtTextView->IsReadOnly(); - if ( mbFocusSelectionHide && IsReallyVisible() && !mpExtTextView->IsReadOnly() - && ( mbSelectOnTab && - (!mbInMBDown || ( GetSettings().GetStyleSettings().GetSelectionOptions() & SELECTION_OPTION_FOCUS ) )) ) - { - // Alles selektieren, aber nicht scrollen - sal_Bool bAutoScroll = mpExtTextView->IsAutoScroll(); - mpExtTextView->SetAutoScroll( sal_False ); - mpExtTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFF, 0xFFFF ) ) ); - mpExtTextView->SetAutoScroll( bAutoScroll ); - bGotoCursor = sal_False; - } - mpExtTextView->SetPaintSelection( sal_True ); - mpExtTextView->ShowCursor( bGotoCursor ); - } -} - -void TextWindow::LoseFocus() -{ - Window::LoseFocus(); - - if ( mbFocusSelectionHide && !mbActivePopup ) - mpExtTextView->SetPaintSelection( sal_False ); -} - -// virtual -::css::uno::Reference< ::css::awt::XWindowPeer > -TextWindow::GetComponentInterface(sal_Bool bCreate) -{ - ::css::uno::Reference< ::css::awt::XWindowPeer > xPeer( - Window::GetComponentInterface(false)); - if (!xPeer.is() && bCreate) - { - xPeer = new ::svt::TextWindowPeer(*GetTextView(), true); - SetComponentInterface(xPeer); - } - return xPeer; -} MultiLineEdit::MultiLineEdit( Window* pParent, WinBits nWinStyle ) - : Edit( pParent, nWinStyle ) + : VCLMultiLineEdit( pParent,nWinStyle ) { - SetType( WINDOW_MULTILINEEDIT ); - pImpSvMEdit = new ImpSvMEdit( this, nWinStyle ); - ImplInitSettings( sal_True, sal_True, sal_True ); - pUpdateDataTimer = 0; - - SetCompoundControl( sal_True ); - SetStyle( ImplInitStyle( nWinStyle ) ); } - MultiLineEdit::MultiLineEdit( Window* pParent, const ResId& rResId ) - : Edit( pParent, rResId.SetRT( RSC_MULTILINEEDIT ) ) -{ - SetType( WINDOW_MULTILINEEDIT ); - WinBits nWinStyle = rResId.GetWinBits(); - pImpSvMEdit = new ImpSvMEdit( this, nWinStyle ); - ImplInitSettings( sal_True, sal_True, sal_True ); - pUpdateDataTimer = 0; - - sal_uInt16 nMaxLen = Edit::GetMaxTextLen(); - if ( nMaxLen ) - SetMaxTextLen( nMaxLen ); - - SetText( Edit::GetText() ); - - if ( IsVisible() ) - pImpSvMEdit->Resize(); - - SetCompoundControl( sal_True ); - SetStyle( ImplInitStyle( nWinStyle ) ); - - // Base Edit ctor could call Show already, but that would cause problems - // with accessibility, as Show might (indirectly) trigger a call to virtual - // GetComponentInterface, which is the Edit's base version instead of the - // MultiLineEdit's version while in the base Edit ctor: - if ((GetStyle() & WB_HIDE) == 0) - Show(); - -} - -MultiLineEdit::~MultiLineEdit() -{ - { - ::std::auto_ptr< ImpSvMEdit > pDelete( pImpSvMEdit ); - pImpSvMEdit = NULL; - } - delete pUpdateDataTimer; -} - -WinBits MultiLineEdit::ImplInitStyle( WinBits nStyle ) -{ - if ( !(nStyle & WB_NOTABSTOP) ) - nStyle |= WB_TABSTOP; - - if ( !(nStyle & WB_NOGROUP) ) - nStyle |= WB_GROUP; - - if ( !(nStyle & WB_IGNORETAB )) - nStyle |= WINDOW_DLGCTRL_MOD1TAB; - - return nStyle; -} - - -void MultiLineEdit::ImplInitSettings( sal_Bool /*bFont*/, sal_Bool /*bForeground*/, sal_Bool bBackground ) + : VCLMultiLineEdit( pParent,rResId ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - // Der Font muss immer mit manipuliert werden, weil die TextEngine - // sich nicht um TextColor/Background kuemmert - - Color aTextColor = rStyleSettings.GetFieldTextColor(); - if ( IsControlForeground() ) - aTextColor = GetControlForeground(); - if ( !IsEnabled() ) - aTextColor = rStyleSettings.GetDisableColor(); - - Font aFont = rStyleSettings.GetFieldFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - aFont.SetTransparent( IsPaintTransparent() ); - SetZoomedPointFont( aFont ); - Font TheFont = GetFont(); - TheFont.SetColor( aTextColor ); - if( IsPaintTransparent() ) - TheFont.SetFillColor( Color( COL_TRANSPARENT ) ); - else - TheFont.SetFillColor( IsControlBackground() ? GetControlBackground() : rStyleSettings.GetFieldColor() ); - pImpSvMEdit->GetTextWindow()->SetFont( TheFont ); - pImpSvMEdit->GetTextWindow()->GetTextEngine()->SetFont( TheFont ); - pImpSvMEdit->GetTextWindow()->SetTextColor( aTextColor ); - - if ( bBackground ) - { - if( IsPaintTransparent() ) - { - pImpSvMEdit->GetTextWindow()->SetPaintTransparent( sal_True ); - pImpSvMEdit->GetTextWindow()->SetBackground(); - pImpSvMEdit->GetTextWindow()->SetControlBackground(); - SetBackground(); - SetControlBackground(); - } - else - { - if( IsControlBackground() ) - pImpSvMEdit->GetTextWindow()->SetBackground( GetControlBackground() ); - else - pImpSvMEdit->GetTextWindow()->SetBackground( rStyleSettings.GetFieldColor() ); - // Auch am MultiLineEdit einstellen, weil die TextComponent - // ggf. die Scrollbars hidet. - SetBackground( pImpSvMEdit->GetTextWindow()->GetBackground() ); - } - } } -void MultiLineEdit::Modify() -{ - aModifyHdlLink.Call( this ); - - CallEventListeners( VCLEVENT_EDIT_MODIFY ); - - if ( pUpdateDataTimer ) - pUpdateDataTimer->Start(); -} - -IMPL_LINK_NOARG(MultiLineEdit, ImpUpdateDataHdl) -{ - UpdateData(); - return 0; -} - -void MultiLineEdit::UpdateData() -{ - aUpdateDataHdlLink.Call( this ); -} - -void MultiLineEdit::SetModifyFlag() -{ - pImpSvMEdit->SetModified( sal_True ); -} - -void MultiLineEdit::ClearModifyFlag() -{ - pImpSvMEdit->SetModified( sal_False ); -} - -sal_Bool MultiLineEdit::IsModified() const -{ - return pImpSvMEdit->IsModified(); -} - -void MultiLineEdit::EnableUpdateData( sal_uLong nTimeout ) -{ - if ( !nTimeout ) - DisableUpdateData(); - else - { - if ( !pUpdateDataTimer ) - { - pUpdateDataTimer = new Timer; - pUpdateDataTimer->SetTimeoutHdl( LINK( this, MultiLineEdit, ImpUpdateDataHdl ) ); - } - pUpdateDataTimer->SetTimeout( nTimeout ); - } -} - -void MultiLineEdit::SetReadOnly( sal_Bool bReadOnly ) -{ - pImpSvMEdit->SetReadOnly( bReadOnly ); - Edit::SetReadOnly( bReadOnly ); - - // #94921# ReadOnly can be overwritten in InitFromStyle() when WB not set. - WinBits nStyle = GetStyle(); - if ( bReadOnly ) - nStyle |= WB_READONLY; - else - nStyle &= ~WB_READONLY; - SetStyle( nStyle ); -} - -sal_Bool MultiLineEdit::IsReadOnly() const -{ - return pImpSvMEdit->IsReadOnly(); -} - -void MultiLineEdit::SetMaxTextLen( xub_StrLen nMaxLen ) -{ - pImpSvMEdit->SetMaxTextLen( nMaxLen ); -} - -xub_StrLen MultiLineEdit::GetMaxTextLen() const -{ - return pImpSvMEdit->GetMaxTextLen(); -} - -void MultiLineEdit::ReplaceSelected( const String& rStr ) -{ - pImpSvMEdit->InsertText( rStr ); -} - -void MultiLineEdit::DeleteSelected() -{ - pImpSvMEdit->InsertText( String() ); -} - -String MultiLineEdit::GetSelected() const -{ - return pImpSvMEdit->GetSelected(); -} - -String MultiLineEdit::GetSelected( LineEnd aSeparator ) const -{ - return pImpSvMEdit->GetSelected( aSeparator ); -} - -void MultiLineEdit::Cut() -{ - pImpSvMEdit->Cut(); -} - -void MultiLineEdit::Copy() -{ - pImpSvMEdit->Copy(); -} - -void MultiLineEdit::Paste() -{ - pImpSvMEdit->Paste(); -} - -void MultiLineEdit::SetText( const String& rStr ) -{ - pImpSvMEdit->SetText( rStr ); -} - -String MultiLineEdit::GetText() const -{ - return pImpSvMEdit->GetText(); -} - -String MultiLineEdit::GetText( LineEnd aSeparator ) const -{ - return pImpSvMEdit->GetText( aSeparator ); -} - -String MultiLineEdit::GetTextLines( LineEnd aSeparator ) const -{ - return pImpSvMEdit->GetTextLines( aSeparator ); -} - -void MultiLineEdit::Resize() -{ - pImpSvMEdit->Resize(); -} - -void MultiLineEdit::GetFocus() -{ - if ( !pImpSvMEdit ) // might be called from within the dtor, when pImpSvMEdit == NULL is a valid state - return; - - Edit::GetFocus(); - pImpSvMEdit->GetFocus(); -} - -void MultiLineEdit::SetSelection( const Selection& rSelection ) -{ - pImpSvMEdit->SetSelection( rSelection ); -} - -const Selection& MultiLineEdit::GetSelection() const -{ - return pImpSvMEdit->GetSelection(); -} - -Size MultiLineEdit::CalcMinimumSize() const -{ - Size aSz = pImpSvMEdit->CalcMinimumSize(); - - sal_Int32 nLeft, nTop, nRight, nBottom; - ((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom ); - aSz.Width() += nLeft+nRight; - aSz.Height() += nTop+nBottom; - - return aSz; -} - -Size MultiLineEdit::CalcAdjustedSize( const Size& rPrefSize ) const -{ - Size aSz = rPrefSize; - sal_Int32 nLeft, nTop, nRight, nBottom; - ((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom ); - - // In der Hoehe auf ganze Zeilen justieren - - long nHeight = aSz.Height() - nTop - nBottom; - long nLineHeight = pImpSvMEdit->CalcSize( 1, 1 ).Height(); - long nLines = nHeight / nLineHeight; - if ( nLines < 1 ) - nLines = 1; - - aSz.Height() = nLines * nLineHeight; - aSz.Height() += nTop+nBottom; - - return aSz; -} - -Size MultiLineEdit::CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const -{ - Size aSz = pImpSvMEdit->CalcSize( nColumns, nLines ); - - sal_Int32 nLeft, nTop, nRight, nBottom; - ((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom ); - aSz.Width() += nLeft+nRight; - aSz.Height() += nTop+nBottom; - return aSz; -} - -void MultiLineEdit::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const -{ - pImpSvMEdit->GetMaxVisColumnsAndLines( rnCols, rnLines ); -} - -void MultiLineEdit::StateChanged( StateChangedType nType ) -{ - if( nType == STATE_CHANGE_ENABLE ) - { - pImpSvMEdit->Enable( IsEnabled() ); - ImplInitSettings( sal_True, sal_False, sal_False ); - } - else if( nType == STATE_CHANGE_READONLY ) - { - pImpSvMEdit->SetReadOnly( IsReadOnly() ); - } - else if ( nType == STATE_CHANGE_ZOOM ) - { - pImpSvMEdit->GetTextWindow()->SetZoom( GetZoom() ); - ImplInitSettings( sal_True, sal_False, sal_False ); - Resize(); - } - else if ( nType == STATE_CHANGE_CONTROLFONT ) - { - ImplInitSettings( sal_True, sal_False, sal_False ); - Resize(); - Invalidate(); - } - else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) - { - ImplInitSettings( sal_False, sal_True, sal_False ); - Invalidate(); - } - else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) - { - ImplInitSettings( sal_False, sal_False, sal_True ); - Invalidate(); - } - else if ( nType == STATE_CHANGE_STYLE ) - { - pImpSvMEdit->InitFromStyle( GetStyle() ); - SetStyle( ImplInitStyle( GetStyle() ) ); - } - else if ( nType == STATE_CHANGE_INITSHOW ) - { - if( IsPaintTransparent() ) - { - pImpSvMEdit->GetTextWindow()->SetPaintTransparent( sal_True ); - pImpSvMEdit->GetTextWindow()->SetBackground(); - pImpSvMEdit->GetTextWindow()->SetControlBackground(); - SetBackground(); - SetControlBackground(); - } - } - - Control::StateChanged( nType ); -} - -void MultiLineEdit::DataChanged( const DataChangedEvent& rDCEvt ) -{ - if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && - (rDCEvt.GetFlags() & SETTINGS_STYLE) ) - { - ImplInitSettings( sal_True, sal_True, sal_True ); - Resize(); - Invalidate(); - } - else - Control::DataChanged( rDCEvt ); -} - -void MultiLineEdit::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) -{ - ImplInitSettings( sal_True, sal_True, sal_True ); - - Point aPos = pDev->LogicToPixel( rPos ); - Size aSize = pDev->LogicToPixel( rSize ); - Font aFont = pImpSvMEdit->GetTextWindow()->GetDrawPixelFont( pDev ); - aFont.SetTransparent( sal_True ); - OutDevType eOutDevType = pDev->GetOutDevType(); - - pDev->Push(); - pDev->SetMapMode(); - pDev->SetFont( aFont ); - pDev->SetTextFillColor(); - - // Border/Background - pDev->SetLineColor(); - pDev->SetFillColor(); - sal_Bool bBorder = !(nFlags & WINDOW_DRAW_NOBORDER ) && (GetStyle() & WB_BORDER); - sal_Bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && IsControlBackground(); - if ( bBorder || bBackground ) - { - Rectangle aRect( aPos, aSize ); - if ( bBorder ) - { - DecorationView aDecoView( pDev ); - aRect = aDecoView.DrawFrame( aRect, FRAME_DRAW_DOUBLEIN ); - } - if ( bBackground ) - { - pDev->SetFillColor( GetControlBackground() ); - pDev->DrawRect( aRect ); - } - } - - // Inhalt - if ( ( nFlags & WINDOW_DRAW_MONO ) || ( eOutDevType == OUTDEV_PRINTER ) ) - pDev->SetTextColor( Color( COL_BLACK ) ); - else - { - if ( !(nFlags & WINDOW_DRAW_NODISABLE ) && !IsEnabled() ) - { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - pDev->SetTextColor( rStyleSettings.GetDisableColor() ); - } - else - { - pDev->SetTextColor( GetTextColor() ); - } - } - - rtl::OUString aText = GetText(); - Size aTextSz( pDev->GetTextWidth( aText ), pDev->GetTextHeight() ); - sal_uLong nLines = (sal_uLong) (aSize.Height() / aTextSz.Height()); - if ( !nLines ) - nLines = 1; - aTextSz.Height() = nLines*aTextSz.Height(); - long nOnePixel = GetDrawPixel( pDev, 1 ); - long nOffX = 3*nOnePixel; - long nOffY = 2*nOnePixel; - - // Clipping? - if ( ( nOffY < 0 ) || ( (nOffY+aTextSz.Height()) > aSize.Height() ) || ( (nOffX+aTextSz.Width()) > aSize.Width() ) ) - { - Rectangle aClip( aPos, aSize ); - if ( aTextSz.Height() > aSize.Height() ) - aClip.Bottom() += aTextSz.Height() - aSize.Height() + 1; // Damit HP-Drucker nicht 'weg-optimieren' - pDev->IntersectClipRegion( aClip ); - } - - TextEngine aTE; - aTE.SetText( GetText() ); - aTE.SetMaxTextWidth( aSize.Width() ); - aTE.SetFont( aFont ); - aTE.SetTextAlign( pImpSvMEdit->GetTextWindow()->GetTextEngine()->GetTextAlign() ); - aTE.Draw( pDev, Point( aPos.X() + nOffX, aPos.Y() + nOffY ) ); - - pDev->Pop(); -} - -long MultiLineEdit::Notify( NotifyEvent& rNEvt ) -{ - long nDone = 0; - if( rNEvt.GetType() == EVENT_COMMAND ) - { - nDone = pImpSvMEdit->HandleCommand( *rNEvt.GetCommandEvent() ); - } - return nDone ? nDone : Edit::Notify( rNEvt ); -} - -long MultiLineEdit::PreNotify( NotifyEvent& rNEvt ) -{ - long nDone = 0; - -#if (OSL_DEBUG_LEVEL > 1) && defined(DBG_UTIL) - if( rNEvt.GetType() == EVENT_KEYINPUT ) - { - const KeyEvent& rKEvent = *rNEvt.GetKeyEvent(); - if ( ( rKEvent.GetKeyCode().GetCode() == KEY_W ) && rKEvent.GetKeyCode().IsMod1() && rKEvent.GetKeyCode().IsMod2() ) - { - SetRightToLeft( !IsRightToLeft() ); - } - } -#endif - - if( ( rNEvt.GetType() == EVENT_KEYINPUT ) && ( !GetTextView()->IsCursorEnabled() ) ) - { - const KeyEvent& rKEvent = *rNEvt.GetKeyEvent(); - if ( !rKEvent.GetKeyCode().IsShift() && ( rKEvent.GetKeyCode().GetGroup() == KEYGROUP_CURSOR ) ) - { - nDone = 1; - TextSelection aSel = pImpSvMEdit->GetTextWindow()->GetTextView()->GetSelection(); - if ( aSel.HasRange() ) - { - aSel.GetStart() = aSel.GetEnd(); - pImpSvMEdit->GetTextWindow()->GetTextView()->SetSelection( aSel ); - } - else - { - switch ( rKEvent.GetKeyCode().GetCode() ) - { - case KEY_UP: - { - if ( pImpSvMEdit->GetVScrollBar() ) - pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_LINEUP ); - } - break; - case KEY_DOWN: - { - if ( pImpSvMEdit->GetVScrollBar() ) - pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_LINEDOWN ); - } - break; - case KEY_PAGEUP : - { - if ( pImpSvMEdit->GetVScrollBar() ) - pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_PAGEUP ); - } - break; - case KEY_PAGEDOWN: - { - if ( pImpSvMEdit->GetVScrollBar() ) - pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_PAGEDOWN ); - } - break; - case KEY_LEFT: - { - if ( pImpSvMEdit->GetHScrollBar() ) - pImpSvMEdit->GetHScrollBar()->DoScrollAction( SCROLL_LINEUP ); - } - break; - case KEY_RIGHT: - { - if ( pImpSvMEdit->GetHScrollBar() ) - pImpSvMEdit->GetHScrollBar()->DoScrollAction( SCROLL_LINEDOWN ); - } - break; - case KEY_HOME: - { - if ( rKEvent.GetKeyCode().IsMod1() ) - pImpSvMEdit->GetTextWindow()->GetTextView()-> - SetSelection( TextSelection( TextPaM( 0, 0 ) ) ); - } - break; - case KEY_END: - { - if ( rKEvent.GetKeyCode().IsMod1() ) - pImpSvMEdit->GetTextWindow()->GetTextView()-> - SetSelection( TextSelection( TextPaM( 0xFFFF, 0xFFFF ) ) ); - } - break; - default: - { - nDone = 0; - } - } - } - } - } - - return nDone ? nDone : Edit::PreNotify( rNEvt ); -} - -// -// Internas fuer abgeleitete Klassen, z.B. TextComponent - -ExtTextEngine* MultiLineEdit::GetTextEngine() const -{ - return pImpSvMEdit->GetTextWindow()->GetTextEngine(); -} - -ExtTextView* MultiLineEdit::GetTextView() const -{ - return pImpSvMEdit->GetTextWindow()->GetTextView(); -} - -ScrollBar* MultiLineEdit::GetVScrollBar() const -{ - return pImpSvMEdit->GetVScrollBar(); -} - -void MultiLineEdit::EnableFocusSelectionHide( sal_Bool bHide ) -{ - pImpSvMEdit->GetTextWindow()->SetAutoFocusHide( bHide ); -} - -void MultiLineEdit::SetLeftMargin( sal_uInt16 n ) -{ - if ( GetTextEngine() ) - GetTextEngine()->SetLeftMargin( n ); -} - -void MultiLineEdit::SetRightToLeft( sal_Bool bRightToLeft ) -{ - if ( GetTextEngine() ) - { - GetTextEngine()->SetRightToLeft( bRightToLeft ); - GetTextView()->ShowCursor(); - } -} - -sal_Bool MultiLineEdit::IsRightToLeft() const -{ - sal_Bool bRightToLeft = sal_False; - - if ( GetTextEngine() ) - bRightToLeft = GetTextEngine()->IsRightToLeft(); - - return bRightToLeft; -} +namespace css = ::com::sun::star; // virtual ::css::uno::Reference< ::css::awt::XWindowPeer > MultiLineEdit::GetComponentInterface(sal_Bool bCreate) { ::css::uno::Reference< ::css::awt::XWindowPeer > xPeer( - Edit::GetComponentInterface(false)); + VCLMultiLineEdit::GetComponentInterface(false)); if (!xPeer.is() && bCreate) { - ::std::auto_ptr< VCLXMultiLineEdit > xEdit(new VCLXMultiLineEdit()); - xEdit->SetWindow(this); - xPeer = xEdit.release(); + ::std::auto_ptr< VCLXMultiLineEdit > xVCLMEdit(new VCLXMultiLineEdit()); + xVCLMEdit->SetWindow(this); + xPeer = xVCLMEdit.release(); SetComponentInterface(xPeer); } return xPeer; } -void MultiLineEdit::DisableSelectionOnFocus() -{ - pImpSvMEdit->GetTextWindow()->DisableSelectionOnFocus(); -} - -void MultiLineEdit::SetTextSelectable( sal_Bool bTextSelectable ) -{ - pImpSvMEdit->GetTextWindow()->SetTextSelectable( bTextSelectable ); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/svmedit2.cxx b/svtools/source/edit/svmedit2.cxx index abd2fcf1b3a7..8d530b2ab65a 100644 --- a/svtools/source/edit/svmedit2.cxx +++ b/svtools/source/edit/svmedit2.cxx @@ -19,7 +19,7 @@ #include <svtools/svmedit2.hxx> -#include <svtools/xtextedt.hxx> +#include <vcl/xtextedt.hxx> ExtMultiLineEdit::ExtMultiLineEdit( Window* pParent, WinBits nWinStyle ) : diff --git a/svtools/source/edit/textdat2.hxx b/svtools/source/edit/textdat2.hxx deleted file mode 100644 index c52d33e7fef1..000000000000 --- a/svtools/source/edit/textdat2.hxx +++ /dev/null @@ -1,312 +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. - * - ************************************************************************/ - - -#ifndef _TEXTDAT2_HXX -#define _TEXTDAT2_HXX - -#include <vcl/seleng.hxx> -#include <vcl/virdev.hxx> -#include <vcl/cursor.hxx> - -#include <vector> - -class TextNode; -class TextView; - -#define PORTIONKIND_TEXT 0 -#define PORTIONKIND_TAB 1 - -#define DELMODE_SIMPLE 0 -#define DELMODE_RESTOFWORD 1 -#define DELMODE_RESTOFCONTENT 2 - -#define DEL_LEFT 1 -#define DEL_RIGHT 2 -#define TRAVEL_X_DONTKNOW 0xFFFF -#define MAXCHARSINPARA 0x3FFF-CHARPOSGROW - -#define LINE_SEP 0x0A - - -class TETextPortion -{ -private: - sal_uInt16 nLen; - long nWidth; - sal_uInt8 nKind; - sal_uInt8 nRightToLeft; - - TETextPortion() { nLen = 0; nKind = PORTIONKIND_TEXT; nWidth = -1; nRightToLeft = 0;} - -public: - TETextPortion( sal_uInt16 nL ) { - nLen = nL; - nKind = PORTIONKIND_TEXT; - nWidth= -1; - nRightToLeft = 0; - } - - sal_uInt16 GetLen() const { return nLen; } - sal_uInt16& GetLen() { return nLen; } - - long GetWidth()const { return nWidth; } - long& GetWidth() { return nWidth; } - - sal_uInt8 GetKind() const { return nKind; } - sal_uInt8& GetKind() { return nKind; } - - sal_uInt8 GetRightToLeft() const { return nRightToLeft; } - sal_uInt8& GetRightToLeft() { return nRightToLeft; } - sal_Bool IsRightToLeft() const { return (nRightToLeft&1); } - - sal_Bool HasValidSize() const { return nWidth != (-1); } -}; - - - -typedef std::vector<TETextPortion*> TextPortionArray; - -class TETextPortionList : public TextPortionArray -{ -public: - TETextPortionList(); - ~TETextPortionList(); - - void Reset(); - sal_uInt16 FindPortion( sal_uInt16 nCharPos, sal_uInt16& rPortionStart, sal_Bool bPreferStartingPortion = sal_False ); - sal_uInt16 GetPortionStartIndex( sal_uInt16 nPortion ); - void DeleteFromPortion( sal_uInt16 nDelFrom ); -}; - -struct TEWritingDirectionInfo -{ - sal_uInt8 nType; - sal_uInt16 nStartPos; - sal_uInt16 nEndPos; - TEWritingDirectionInfo( sal_uInt8 _Type, sal_uInt16 _Start, sal_uInt16 _End ) - { - nType = _Type; - nStartPos = _Start; - nEndPos = _End; - } -}; - -class TextLine -{ -private: - sal_uInt16 mnStart; - sal_uInt16 mnEnd; - sal_uInt16 mnStartPortion; - sal_uInt16 mnEndPortion; - - short mnStartX; - - sal_Bool mbInvalid; // fuer geschickte Formatierung/Ausgabe - -public: - TextLine() { - mnStart = mnEnd = 0; - mnStartPortion = mnEndPortion = 0; - mnStartX = 0; - mbInvalid = sal_True; - } - - sal_Bool IsIn( sal_uInt16 nIndex ) const - { return ( (nIndex >= mnStart ) && ( nIndex < mnEnd ) ); } - - sal_Bool IsIn( sal_uInt16 nIndex, sal_Bool bInclEnd ) const - { return ( ( nIndex >= mnStart ) && ( bInclEnd ? ( nIndex <= mnEnd ) : ( nIndex < mnEnd ) ) ); } - - void SetStart( sal_uInt16 n ) { mnStart = n; } - sal_uInt16 GetStart() const { return mnStart; } - sal_uInt16& GetStart() { return mnStart; } - - void SetEnd( sal_uInt16 n ) { mnEnd = n; } - sal_uInt16 GetEnd() const { return mnEnd; } - sal_uInt16& GetEnd() { return mnEnd; } - - void SetStartPortion( sal_uInt16 n ) { mnStartPortion = n; } - sal_uInt16 GetStartPortion() const { return mnStartPortion; } - sal_uInt16& GetStartPortion() { return mnStartPortion; } - - void SetEndPortion( sal_uInt16 n ) { mnEndPortion = n; } - sal_uInt16 GetEndPortion() const { return mnEndPortion; } - sal_uInt16& GetEndPortion() { return mnEndPortion; } - - sal_uInt16 GetLen() const { return mnEnd - mnStart; } - - sal_Bool IsInvalid() const { return mbInvalid; } - sal_Bool IsValid() const { return !mbInvalid; } - void SetInvalid() { mbInvalid = sal_True; } - void SetValid() { mbInvalid = sal_False; } - - sal_Bool IsEmpty() const { return (mnEnd > mnStart) ? sal_False : sal_True; } - - short GetStartX() const { return mnStartX; } - void SetStartX( short n ) { mnStartX = n; } - - inline sal_Bool operator == ( const TextLine& rLine ) const; - inline sal_Bool operator != ( const TextLine& rLine ) const; -}; - -class TextLines : public std::vector<TextLine*> { -public: - ~TextLines() - { - for( iterator it = begin(); it != end(); ++it ) - delete *it; - } -}; - -inline sal_Bool TextLine::operator == ( const TextLine& rLine ) const -{ - return ( ( mnStart == rLine.mnStart ) && - ( mnEnd == rLine.mnEnd ) && - ( mnStartPortion == rLine.mnStartPortion ) && - ( mnEndPortion == rLine.mnEndPortion ) ); -} - -inline sal_Bool TextLine::operator != ( const TextLine& rLine ) const -{ - return !( *this == rLine ); -} - - - -class TEParaPortion -{ -private: - TextNode* mpNode; - - TextLines maLines; - TETextPortionList maTextPortions; - std::vector<TEWritingDirectionInfo> maWritingDirectionInfos; - - - sal_uInt16 mnInvalidPosStart; - short mnInvalidDiff; - - sal_Bool mbInvalid; - sal_Bool mbSimple; // nur lineares Tippen - - - TEParaPortion( const TEParaPortion& ) {;} - -public: - TEParaPortion( TextNode* pNode ); - ~TEParaPortion(); - - - sal_Bool IsInvalid() const { return mbInvalid; } - sal_Bool IsSimpleInvalid() const { return mbSimple; } - void SetNotSimpleInvalid() { mbSimple = sal_False; } - void SetValid() { mbInvalid = sal_False; mbSimple = sal_True;} - - void MarkInvalid( sal_uInt16 nStart, short nDiff); - void MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 nEnd ); - - sal_uInt16 GetInvalidPosStart() const { return mnInvalidPosStart; } - short GetInvalidDiff() const { return mnInvalidDiff; } - - TextNode* GetNode() const { return mpNode; } - TextLines& GetLines() { return maLines; } - TETextPortionList& GetTextPortions() { return maTextPortions; } - std::vector<TEWritingDirectionInfo>& GetWritingDirectionInfos() { return maWritingDirectionInfos; } - - - sal_uInt16 GetLineNumber( sal_uInt16 nIndex, sal_Bool bInclEnd ); - void CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine ); -}; - - -class TEParaPortions : public ToolsList<TEParaPortion*> -{ -public: - TEParaPortions(); - ~TEParaPortions(); - void Reset(); -}; - - -class TextSelFunctionSet: public FunctionSet -{ -private: - TextView* mpView; - -public: - TextSelFunctionSet( TextView* pView ); - - virtual void BeginDrag(); - - virtual void CreateAnchor(); - - virtual sal_Bool SetCursorAtPoint( const Point& rPointPixel, sal_Bool bDontSelectAtCursor = sal_False ); - - virtual sal_Bool IsSelectionAtPoint( const Point& rPointPixel ); - virtual void DeselectAll(); - - virtual void DeselectAtPoint( const Point& ); - virtual void DestroyAnchor(); -}; - - -class IdleFormatter : public Timer -{ -private: - TextView* mpView; - sal_uInt16 mnRestarts; - -public: - IdleFormatter(); - ~IdleFormatter(); - - void DoIdleFormat( TextView* pV, sal_uInt16 nMaxRestarts ); - void ForceTimeout(); - TextView* GetView() { return mpView; } -}; - -struct TextDDInfo -{ - Cursor maCursor; - TextPaM maDropPos; - - sal_Bool mbStarterOfDD; - sal_Bool mbVisCursor; - - TextDDInfo() - { - maCursor.SetStyle( CURSOR_SHADOW ); - mbStarterOfDD = sal_False; - mbVisCursor = sal_False; - } -}; - -#endif // _TEXTDAT2_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textdata.cxx b/svtools/source/edit/textdata.cxx deleted file mode 100644 index 7d55ee13cc6a..000000000000 --- a/svtools/source/edit/textdata.cxx +++ /dev/null @@ -1,345 +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. - * - ************************************************************************/ - - -#include <svtools/textdata.hxx> -#include <textdat2.hxx> - -#include <tools/debug.hxx> - - -// ------------------------------------------------------------------------- -// (+) class TextSelection -// ------------------------------------------------------------------------- - -TextSelection::TextSelection() -{ -} - -TextSelection::TextSelection( const TextPaM& rPaM ) : - maStartPaM( rPaM ), maEndPaM( rPaM ) -{ -} - -TextSelection::TextSelection( const TextPaM& rStart, const TextPaM& rEnd ) : - maStartPaM( rStart ), maEndPaM( rEnd ) -{ -} - -void TextSelection::Justify() -{ - if ( maEndPaM < maStartPaM ) - { - TextPaM aTemp( maStartPaM ); - maStartPaM = maEndPaM; - maEndPaM = aTemp; - } -} - - -// ------------------------------------------------------------------------- -// (+) class TETextPortionList -// ------------------------------------------------------------------------- -TETextPortionList::TETextPortionList() -{ -} - -TETextPortionList::~TETextPortionList() -{ - Reset(); -} - -void TETextPortionList::Reset() -{ - for ( iterator it = begin(); it != end(); ++it ) - delete *it; - clear(); -} - -void TETextPortionList::DeleteFromPortion( sal_uInt16 nDelFrom ) -{ - DBG_ASSERT( ( nDelFrom < size() ) || ( (nDelFrom == 0) && (size() == 0) ), "DeleteFromPortion: Out of range" ); - for ( iterator it = begin() + nDelFrom; it != end(); ++it ) - delete *it; - erase( begin() + nDelFrom, end() ); -} - -sal_uInt16 TETextPortionList::FindPortion( sal_uInt16 nCharPos, sal_uInt16& nPortionStart, sal_Bool bPreferStartingPortion ) -{ - // Bei nCharPos an Portion-Grenze wird die linke Portion gefunden - sal_uInt16 nTmpPos = 0; - for ( sal_uInt16 nPortion = 0; nPortion < size(); nPortion++ ) - { - TETextPortion* pPortion = operator[]( nPortion ); - nTmpPos = nTmpPos + pPortion->GetLen(); - if ( nTmpPos >= nCharPos ) - { - // take this one if we don't prefer the starting portion, or if it's the last one - if ( ( nTmpPos != nCharPos ) || !bPreferStartingPortion || ( nPortion == size() - 1 ) ) - { - nPortionStart = nTmpPos - pPortion->GetLen(); - return nPortion; - } - } - } - OSL_FAIL( "FindPortion: Nicht gefunden!" ); - return ( size() - 1 ); -} - - -// ------------------------------------------------------------------------- -// (+) class TEParaPortion -// ------------------------------------------------------------------------- -TEParaPortion::TEParaPortion( TextNode* pN ) -{ - mpNode = pN; - mnInvalidPosStart = mnInvalidDiff = 0; - mbInvalid = sal_True; - mbSimple = sal_False; -} - -TEParaPortion::~TEParaPortion() -{ -} - -void TEParaPortion::MarkInvalid( sal_uInt16 nStart, short nDiff ) -{ - if ( mbInvalid == sal_False ) - { - mnInvalidPosStart = ( nDiff >= 0 ) ? nStart : ( nStart + nDiff ); - mnInvalidDiff = nDiff; - } - else - { - // Einfaches hintereinander tippen - if ( ( nDiff > 0 ) && ( mnInvalidDiff > 0 ) && - ( ( mnInvalidPosStart+mnInvalidDiff ) == nStart ) ) - { - mnInvalidDiff = mnInvalidDiff + nDiff; - } - // Einfaches hintereinander loeschen - else if ( ( nDiff < 0 ) && ( mnInvalidDiff < 0 ) && ( mnInvalidPosStart == nStart ) ) - { - mnInvalidPosStart = mnInvalidPosStart + nDiff; - mnInvalidDiff = mnInvalidDiff + nDiff; - } - else - { - DBG_ASSERT( ( nDiff >= 0 ) || ( (nStart+nDiff) >= 0 ), "MarkInvalid: Diff out of Range" ); - mnInvalidPosStart = Min( mnInvalidPosStart, (sal_uInt16) ( (nDiff < 0) ? nStart+nDiff : nDiff ) ); - mnInvalidDiff = 0; - mbSimple = sal_False; - } - } - - maWritingDirectionInfos.clear(); - - mbInvalid = sal_True; -} - -void TEParaPortion::MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 /*nEnd*/ ) -{ - if ( mbInvalid == sal_False ) - { - mnInvalidPosStart = nStart; -// nInvalidPosEnd = nEnd; - } - else - { - mnInvalidPosStart = Min( mnInvalidPosStart, nStart ); -// nInvalidPosEnd = pNode->Len(); - } - - maWritingDirectionInfos.clear(); - - mnInvalidDiff = 0; - mbInvalid = sal_True; - mbSimple = sal_False; -} - -sal_uInt16 TEParaPortion::GetLineNumber( sal_uInt16 nChar, sal_Bool bInclEnd ) -{ - for ( sal_uInt16 nLine = 0; nLine < maLines.size(); nLine++ ) - { - TextLine* pLine = maLines[ nLine ]; - if ( ( bInclEnd && ( pLine->GetEnd() >= nChar ) ) || - ( pLine->GetEnd() > nChar ) ) - { - return nLine; - } - } - - // Then it should be at the end of the last line - OSL_ENSURE(nChar == maLines[maLines.size() - 1]->GetEnd(), "wrong Index"); - OSL_ENSURE(!bInclEnd, "Line not found: FindLine"); - return ( maLines.size() - 1 ); -} - - -void TEParaPortion::CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine ) -{ - sal_uInt16 nLines = maLines.size(); - DBG_ASSERT( nLines, "CorrectPortionNumbersFromLine: Leere Portion?" ); - if ( nLastFormattedLine < ( nLines - 1 ) ) - { - const TextLine* pLastFormatted = maLines[ nLastFormattedLine ]; - const TextLine* pUnformatted = maLines[ nLastFormattedLine+1 ]; - short nPortionDiff = pUnformatted->GetStartPortion() - pLastFormatted->GetEndPortion(); - short nTextDiff = pUnformatted->GetStart() - pLastFormatted->GetEnd(); - nTextDiff++; // LastFormatted->GetEnd() war incl. => 1 zuviel abgezogen! - - // Die erste unformatierte muss genau eine Portion hinter der letzten der - // formatierten beginnen: - // Wenn in der geaenderten Zeile eine Portion gesplittet wurde, - // kann nLastEnd > nNextStart sein! - short nPDiff = sal::static_int_cast< short >(-( nPortionDiff-1 )); - short nTDiff = sal::static_int_cast< short >(-( nTextDiff-1 )); - if ( nPDiff || nTDiff ) - { - for ( sal_uInt16 nL = nLastFormattedLine+1; nL < nLines; nL++ ) - { - TextLine* pLine = maLines[ nL ]; - - pLine->GetStartPortion() = pLine->GetStartPortion() + nPDiff; - pLine->GetEndPortion() = pLine->GetEndPortion() + nPDiff; - - pLine->GetStart() = pLine->GetStart() + nTDiff; - pLine->GetEnd() = pLine->GetEnd() + nTDiff; - - pLine->SetValid(); - } - } - } -} - -// ------------------------------------------------------------------------- -// (+) class TEParaPortions -// ------------------------------------------------------------------------- -TEParaPortions::TEParaPortions() -{ -} - -TEParaPortions::~TEParaPortions() -{ - Reset(); -} - -void TEParaPortions::Reset() -{ - TEParaPortions::iterator aIter( begin() ); - while ( aIter != end() ) - delete *aIter++; - clear(); -} - -// ------------------------------------------------------------------------- -// (+) class IdleFormatter -// ------------------------------------------------------------------------- -IdleFormatter::IdleFormatter() -{ - mpView = 0; - mnRestarts = 0; -} - -IdleFormatter::~IdleFormatter() -{ - mpView = 0; -} - -void IdleFormatter::DoIdleFormat( TextView* pV, sal_uInt16 nMaxRestarts ) -{ - mpView = pV; - - if ( IsActive() ) - mnRestarts++; - - if ( mnRestarts > nMaxRestarts ) - { - mnRestarts = 0; - ((Link&)GetTimeoutHdl()).Call( this ); - } - else - { - Start(); - } -} - -void IdleFormatter::ForceTimeout() -{ - if ( IsActive() ) - { - Stop(); - mnRestarts = 0; - ((Link&)GetTimeoutHdl()).Call( this ); - } -} - -TYPEINIT1( TextHint, SfxSimpleHint ); - -TextHint::TextHint( sal_uLong Id ) : SfxSimpleHint( Id ) -{ - mnValue = 0; -} - -TextHint::TextHint( sal_uLong Id, sal_uLong nValue ) : SfxSimpleHint( Id ) -{ - mnValue = nValue; -} - -TEIMEInfos::TEIMEInfos( const TextPaM& rPos, const String& rOldTextAfterStartPos ) -: aOldTextAfterStartPos( rOldTextAfterStartPos ) -{ - aPos = rPos; - nLen = 0; - bCursor = sal_True; - pAttribs = NULL; - bWasCursorOverwrite = sal_False; -} - -TEIMEInfos::~TEIMEInfos() -{ - delete[] pAttribs; -} - -void TEIMEInfos::CopyAttribs( const sal_uInt16* pA, sal_uInt16 nL ) -{ - nLen = nL; - delete pAttribs; - pAttribs = new sal_uInt16[ nL ]; - memcpy( pAttribs, pA, nL*sizeof(sal_uInt16) ); -} - -void TEIMEInfos::DestroyAttribs() -{ - delete pAttribs; - pAttribs = NULL; - nLen = 0; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textdoc.cxx b/svtools/source/edit/textdoc.cxx deleted file mode 100644 index a8062ecefbf3..000000000000 --- a/svtools/source/edit/textdoc.cxx +++ /dev/null @@ -1,636 +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. - * - ************************************************************************/ - -#include <textdoc.hxx> - -#include <stdlib.h> - - - -// Vergleichmethode wird von QuickSort gerufen... - -static bool CompareStart( const TextCharAttrib* pFirst, const TextCharAttrib* pSecond ) -{ - return pFirst->GetStart() < pSecond->GetStart(); -} - -// ------------------------------------------------------------------------- -// (+) class TextCharAttrib -// ------------------------------------------------------------------------- -TextCharAttrib::TextCharAttrib( const TextAttrib& rAttr, sal_uInt16 nStart, sal_uInt16 nEnd ) -{ - mpAttr = rAttr.Clone(); - mnStart = nStart, - mnEnd = nEnd; -} - -TextCharAttrib::TextCharAttrib( const TextCharAttrib& rTextCharAttrib ) -{ - mpAttr = rTextCharAttrib.GetAttr().Clone(); - mnStart = rTextCharAttrib.mnStart; - mnEnd = rTextCharAttrib.mnEnd; -} - -TextCharAttrib::~TextCharAttrib() -{ - delete mpAttr; -} - -// ------------------------------------------------------------------------- -// (+) class TextCharAttribList -// ------------------------------------------------------------------------- - -TextCharAttribList::TextCharAttribList() -{ - mbHasEmptyAttribs = sal_False; -} - -TextCharAttribList::~TextCharAttribList() -{ - // PTRARR_DEL -} - -void TextCharAttribList::Clear( sal_Bool bDestroyAttribs ) -{ - if ( bDestroyAttribs ) - for(iterator it = begin(); it != end(); ++it) - delete *it; - TextCharAttribs::clear(); -} - - -void TextCharAttribList::InsertAttrib( TextCharAttrib* pAttrib ) -{ - if ( pAttrib->IsEmpty() ) - mbHasEmptyAttribs = sal_True; - - const sal_uInt16 nCount = size(); - const sal_uInt16 nStart = pAttrib->GetStart(); // vielleicht besser fuer Comp.Opt. - sal_Bool bInserted = sal_False; - for ( sal_uInt16 x = 0; x < nCount; x++ ) - { - TextCharAttrib* pCurAttrib = GetAttrib( x ); - if ( pCurAttrib->GetStart() > nStart ) - { - insert( begin() + x, pAttrib ); - bInserted = sal_True; - break; - } - } - if ( !bInserted ) - push_back( pAttrib ); -} - -void TextCharAttribList::ResortAttribs() -{ - if ( !empty() ) - std::sort( begin(), end(), CompareStart ); -} - -TextCharAttrib* TextCharAttribList::FindAttrib( sal_uInt16 nWhich, sal_uInt16 nPos ) -{ - // Rueckwaerts, falls eins dort endet, das naechste startet. - // => Das startende gilt... - - for ( sal_uInt16 nAttr = size(); nAttr; ) - { - TextCharAttrib* pAttr = GetAttrib( --nAttr ); - - if ( pAttr->GetEnd() < nPos ) - return 0; - - if ( ( pAttr->Which() == nWhich ) && pAttr->IsIn(nPos) ) - return pAttr; - } - return NULL; -} - -TextCharAttrib* TextCharAttribList::FindNextAttrib( sal_uInt16 nWhich, sal_uInt16 nFromPos, sal_uInt16 nMaxPos ) const -{ - DBG_ASSERT( nWhich, "FindNextAttrib: Which?" ); - const sal_uInt16 nAttribs = size(); - for ( sal_uInt16 nAttr = 0; nAttr < nAttribs; nAttr++ ) - { - TextCharAttrib* pAttr = GetAttrib( nAttr ); - if ( ( pAttr->GetStart() >= nFromPos ) && - ( pAttr->GetEnd() <= nMaxPos ) && - ( pAttr->Which() == nWhich ) ) - return pAttr; - } - return NULL; -} - -sal_Bool TextCharAttribList::HasAttrib( sal_uInt16 nWhich ) const -{ - for ( sal_uInt16 nAttr = size(); nAttr; ) - { - const TextCharAttrib* pAttr = GetAttrib( --nAttr ); - if ( pAttr->Which() == nWhich ) - return sal_True; - } - return sal_False; -} - -sal_Bool TextCharAttribList::HasBoundingAttrib( sal_uInt16 nBound ) -{ - // Rueckwaerts, falls eins dort endet, das naechste startet. - // => Das startende gilt... - for ( sal_uInt16 nAttr = size(); nAttr; ) - { - TextCharAttrib* pAttr = GetAttrib( --nAttr ); - - if ( pAttr->GetEnd() < nBound ) - return sal_False; - - if ( ( pAttr->GetStart() == nBound ) || ( pAttr->GetEnd() == nBound ) ) - return sal_True; - } - return sal_False; -} - -TextCharAttrib* TextCharAttribList::FindEmptyAttrib( sal_uInt16 nWhich, sal_uInt16 nPos ) -{ - if ( !mbHasEmptyAttribs ) - return 0; - - const sal_uInt16 nAttribs = size(); - for ( sal_uInt16 nAttr = 0; nAttr < nAttribs; nAttr++ ) - { - TextCharAttrib* pAttr = GetAttrib( nAttr ); - if ( pAttr->GetStart() > nPos ) - return 0; - - if ( ( pAttr->GetStart() == nPos ) && ( pAttr->GetEnd() == nPos ) && ( pAttr->Which() == nWhich ) ) - return pAttr; - } - return 0; -} - -void TextCharAttribList::DeleteEmptyAttribs() -{ - for ( sal_uInt16 nAttr = 0; nAttr < size(); nAttr++ ) - { - TextCharAttrib* pAttr = GetAttrib( nAttr ); - if ( pAttr->IsEmpty() ) - { - erase( begin() + nAttr ); - delete pAttr; - nAttr--; - } - } - mbHasEmptyAttribs = sal_False; -} - -// ------------------------------------------------------------------------- -// (+) class TextNode -// ------------------------------------------------------------------------- - -TextNode::TextNode( const String& rText ) : - maText( rText ) -{ -} - -void TextNode::ExpandAttribs( sal_uInt16 nIndex, sal_uInt16 nNew ) -{ - if ( !nNew ) - return; - - sal_Bool bResort = sal_False; - sal_uInt16 nAttribs = maCharAttribs.Count(); - for ( sal_uInt16 nAttr = 0; nAttr < nAttribs; nAttr++ ) - { - TextCharAttrib* pAttrib = maCharAttribs.GetAttrib( nAttr ); - if ( pAttrib->GetEnd() >= nIndex ) - { - // Alle Attribute hinter der Einfuegeposition verschieben... - if ( pAttrib->GetStart() > nIndex ) - { - pAttrib->MoveForward( nNew ); - } - // 0: Leeres Attribut expandieren, wenn an Einfuegestelle - else if ( pAttrib->IsEmpty() ) - { - // Index nicht pruefen, leeres durfte nur dort liegen. - // Wenn spaeter doch Ueberpruefung: - // Spezialfall: Start == 0; AbsLen == 1, nNew = 1 => Expand, weil durch Absatzumbruch! - // Start <= nIndex, End >= nIndex => Start=End=nIndex! -// if ( pAttrib->GetStart() == nIndex ) - pAttrib->Expand( nNew ); - } - // 1: Attribut startet davor, geht bis Index... - else if ( pAttrib->GetEnd() == nIndex ) // Start muss davor liegen - { - // Nur expandieren, wenn kein Feature, - // und wenn nicht in ExcludeListe! - // Sonst geht z.B. ein UL bis zum neuen ULDB, beide expandieren - if ( !maCharAttribs.FindEmptyAttrib( pAttrib->Which(), nIndex ) ) - { - pAttrib->Expand( nNew ); - } - else - bResort = sal_True; - } - // 2: Attribut startet davor, geht hinter Index... - else if ( ( pAttrib->GetStart() < nIndex ) && ( pAttrib->GetEnd() > nIndex ) ) - { - pAttrib->Expand( nNew ); - } - // 3: Attribut startet auf Index... - else if ( pAttrib->GetStart() == nIndex ) - { - if ( nIndex == 0 ) - { - pAttrib->Expand( nNew ); -// bResort = sal_True; // es gibt ja keine Features mehr... - } - else - pAttrib->MoveForward( nNew ); - } - } - - DBG_ASSERT( pAttrib->GetStart() <= pAttrib->GetEnd(), "Expand: Attribut verdreht!" ); - DBG_ASSERT( ( pAttrib->GetEnd() <= maText.Len() ), "Expand: Attrib groesser als Absatz!" ); - DBG_ASSERT( !pAttrib->IsEmpty(), "Leeres Attribut nach ExpandAttribs?" ); - } - - if ( bResort ) - maCharAttribs.ResortAttribs(); -} - -void TextNode::CollapsAttribs( sal_uInt16 nIndex, sal_uInt16 nDeleted ) -{ - if ( !nDeleted ) - return; - - sal_Bool bResort = sal_False; - sal_uInt16 nEndChanges = nIndex+nDeleted; - - for ( sal_uInt16 nAttr = 0; nAttr < maCharAttribs.Count(); nAttr++ ) - { - TextCharAttrib* pAttrib = maCharAttribs.GetAttrib( nAttr ); - sal_Bool bDelAttr = sal_False; - if ( pAttrib->GetEnd() >= nIndex ) - { - // Alles Attribute hinter der Einfuegeposition verschieben... - if ( pAttrib->GetStart() >= nEndChanges ) - { - pAttrib->MoveBackward( nDeleted ); - } - // 1. Innenliegende Attribute loeschen... - else if ( ( pAttrib->GetStart() >= nIndex ) && ( pAttrib->GetEnd() <= nEndChanges ) ) - { - // Spezialfall: Attrubt deckt genau den Bereich ab - // => als leeres Attribut behalten. - if ( ( pAttrib->GetStart() == nIndex ) && ( pAttrib->GetEnd() == nEndChanges ) ) - pAttrib->GetEnd() = nIndex; // leer - else - bDelAttr = sal_True; - } - // 2. Attribut beginnt davor, endet drinnen oder dahinter... - else if ( ( pAttrib->GetStart() <= nIndex ) && ( pAttrib->GetEnd() > nIndex ) ) - { - if ( pAttrib->GetEnd() <= nEndChanges ) // endet drinnen - pAttrib->GetEnd() = nIndex; - else - pAttrib->Collaps( nDeleted ); // endet dahinter - } - // 3. Attribut beginnt drinnen, endet dahinter... - else if ( ( pAttrib->GetStart() >= nIndex ) && ( pAttrib->GetEnd() > nEndChanges ) ) - { - // Features duerfen nicht expandieren! - pAttrib->GetStart() = nEndChanges; - pAttrib->MoveBackward( nDeleted ); - } - } - - DBG_ASSERT( pAttrib->GetStart() <= pAttrib->GetEnd(), "Collaps: Attribut verdreht!" ); - DBG_ASSERT( ( pAttrib->GetEnd() <= maText.Len()) || bDelAttr, "Collaps: Attrib groesser als Absatz!" ); - if ( bDelAttr /* || pAttrib->IsEmpty() */ ) - { - bResort = sal_True; - maCharAttribs.RemoveAttrib( nAttr ); - delete pAttrib; - nAttr--; - } - else if ( pAttrib->IsEmpty() ) - maCharAttribs.HasEmptyAttribs() = sal_True; - } - - if ( bResort ) - maCharAttribs.ResortAttribs(); -} - -void TextNode::InsertText( sal_uInt16 nPos, const String& rText ) -{ - maText.Insert( rText, nPos ); - ExpandAttribs( nPos, rText.Len() ); -} - -void TextNode::InsertText( sal_uInt16 nPos, sal_Unicode c ) -{ - maText.Insert( c, nPos ); - ExpandAttribs( nPos, 1 ); -} - -void TextNode::RemoveText( sal_uInt16 nPos, sal_uInt16 nChars ) -{ - maText.Erase( nPos, nChars ); - CollapsAttribs( nPos, nChars ); -} - -TextNode* TextNode::Split( sal_uInt16 nPos, sal_Bool bKeepEndingAttribs ) -{ - String aNewText; - if ( nPos < maText.Len() ) - { - aNewText = maText.Copy( nPos ); - maText.Erase( nPos ); - } - TextNode* pNew = new TextNode( aNewText ); - - for ( sal_uInt16 nAttr = 0; nAttr < maCharAttribs.Count(); nAttr++ ) - { - TextCharAttrib* pAttrib = maCharAttribs.GetAttrib( nAttr ); - if ( pAttrib->GetEnd() < nPos ) - { - // bleiben unveraendert.... - ; - } - else if ( pAttrib->GetEnd() == nPos ) - { - // muessen als leeres Attribut kopiert werden. - // !FindAttrib nur sinnvoll, wenn Rueckwaerts durch Liste! - if ( bKeepEndingAttribs && !pNew->maCharAttribs.FindAttrib( pAttrib->Which(), 0 ) ) - { - TextCharAttrib* pNewAttrib = new TextCharAttrib( *pAttrib ); - pNewAttrib->GetStart() = 0; - pNewAttrib->GetEnd() = 0; - pNew->maCharAttribs.InsertAttrib( pNewAttrib ); - } - } - else if ( pAttrib->IsInside( nPos ) || ( !nPos && !pAttrib->GetStart() ) ) - { - // Wenn ganz vorne gecuttet wird, muss das Attribut erhalten bleiben! - // muessen kopiert und geaendert werden - TextCharAttrib* pNewAttrib = new TextCharAttrib( *pAttrib ); - pNewAttrib->GetStart() = 0; - pNewAttrib->GetEnd() = pAttrib->GetEnd()-nPos; - pNew->maCharAttribs.InsertAttrib( pNewAttrib ); - // stutzen: - pAttrib->GetEnd() = nPos; - } - else - { - DBG_ASSERT( pAttrib->GetStart() >= nPos, "Start < nPos!" ); - DBG_ASSERT( pAttrib->GetEnd() >= nPos, "End < nPos!" ); - // alle dahinter verschieben in den neuen Node (this) - maCharAttribs.RemoveAttrib( nAttr ); - pNew->maCharAttribs.InsertAttrib( pAttrib ); - pAttrib->GetStart() = pAttrib->GetStart() - nPos; - pAttrib->GetEnd() = pAttrib->GetEnd() - nPos; - nAttr--; - } - } - return pNew; -} - -void TextNode::Append( const TextNode& rNode ) -{ - sal_uInt16 nOldLen = maText.Len(); - - maText += rNode.GetText(); - - const sal_uInt16 nAttribs = rNode.GetCharAttribs().Count(); - for ( sal_uInt16 nAttr = 0; nAttr < nAttribs; nAttr++ ) - { - TextCharAttrib* pAttrib = rNode.GetCharAttribs().GetAttrib( nAttr ); - sal_Bool bMelted = sal_False; - if ( pAttrib->GetStart() == 0 ) - { - // Evtl koennen Attribute zusammengefasst werden: - sal_uInt16 nTmpAttribs = maCharAttribs.Count(); - for ( sal_uInt16 nTmpAttr = 0; nTmpAttr < nTmpAttribs; nTmpAttr++ ) - { - TextCharAttrib* pTmpAttrib = maCharAttribs.GetAttrib( nTmpAttr ); - - if ( pTmpAttrib->GetEnd() == nOldLen ) - { - if ( ( pTmpAttrib->Which() == pAttrib->Which() ) && - ( pTmpAttrib->GetAttr() == pAttrib->GetAttr() ) ) - { - pTmpAttrib->GetEnd() = - pTmpAttrib->GetEnd() + pAttrib->GetLen(); - bMelted = sal_True; - break; // es kann nur eins von der Sorte an der Stelle geben - } - } - } - } - - if ( !bMelted ) - { - TextCharAttrib* pNewAttrib = new TextCharAttrib( *pAttrib ); - pNewAttrib->GetStart() = pNewAttrib->GetStart() + nOldLen; - pNewAttrib->GetEnd() = pNewAttrib->GetEnd() + nOldLen; - maCharAttribs.InsertAttrib( pNewAttrib ); - } - } -} - -// ------------------------------------------------------------------------- -// (+) class TextDoc -// ------------------------------------------------------------------------- - -TextDoc::TextDoc() -{ - mnLeftMargin = 0; -}; - -TextDoc::~TextDoc() -{ - DestroyTextNodes(); -} - -void TextDoc::Clear() -{ - DestroyTextNodes(); -} - -void TextDoc::DestroyTextNodes() -{ - for ( sal_uLong nNode = 0; nNode < maTextNodes.Count(); nNode++ ) - delete maTextNodes.GetObject( nNode ); - maTextNodes.clear(); -} - -String TextDoc::GetText( const sal_Unicode* pSep ) const -{ - sal_uLong nLen = GetTextLen( pSep ); - sal_uLong nNodes = maTextNodes.Count(); - - if ( nLen > STRING_MAXLEN ) - { - OSL_FAIL( "Text zu gross fuer String" ); - return String(); - } - - String aASCIIText; - sal_uLong nLastNode = nNodes-1; - for ( sal_uLong nNode = 0; nNode < nNodes; nNode++ ) - { - TextNode* pNode = maTextNodes.GetObject( nNode ); - String aTmp( pNode->GetText() ); - aASCIIText += aTmp; - if ( pSep && ( nNode != nLastNode ) ) - aASCIIText += pSep; - } - - return aASCIIText; -} - -XubString TextDoc::GetText( sal_uLong nPara ) const -{ - XubString aText; - TextNode* pNode = ( nPara < maTextNodes.Count() ) ? maTextNodes.GetObject( nPara ) : 0; - if ( pNode ) - aText = pNode->GetText(); - - return aText; -} - - -sal_uLong TextDoc::GetTextLen( const xub_Unicode* pSep, const TextSelection* pSel ) const -{ - sal_uLong nLen = 0; - sal_uLong nNodes = maTextNodes.Count(); - if ( nNodes ) - { - sal_uLong nStartNode = 0; - sal_uLong nEndNode = nNodes-1; - if ( pSel ) - { - nStartNode = pSel->GetStart().GetPara(); - nEndNode = pSel->GetEnd().GetPara(); - } - - for ( sal_uLong nNode = nStartNode; nNode <= nEndNode; nNode++ ) - { - TextNode* pNode = maTextNodes.GetObject( nNode ); - - sal_uInt16 nS = 0; - sal_uLong nE = pNode->GetText().Len(); - if ( pSel && ( nNode == pSel->GetStart().GetPara() ) ) - nS = pSel->GetStart().GetIndex(); - if ( pSel && ( nNode == pSel->GetEnd().GetPara() ) ) - nE = pSel->GetEnd().GetIndex(); - - nLen += ( nE - nS ); - } - - if ( pSep ) - nLen += (nEndNode-nStartNode) * rtl_ustr_getLength(pSep); - } - - return nLen; -} - -TextPaM TextDoc::InsertText( const TextPaM& rPaM, xub_Unicode c ) -{ - DBG_ASSERT( c != 0x0A, "TextDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" ); - DBG_ASSERT( c != 0x0D, "TextDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" ); - - TextNode* pNode = maTextNodes.GetObject( rPaM.GetPara() ); - pNode->InsertText( rPaM.GetIndex(), c ); - - TextPaM aPaM( rPaM.GetPara(), rPaM.GetIndex()+1 ); - return aPaM; -} - -TextPaM TextDoc::InsertText( const TextPaM& rPaM, const XubString& rStr ) -{ - DBG_ASSERT( rStr.Search( 0x0A ) == STRING_NOTFOUND, "TextDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" ); - DBG_ASSERT( rStr.Search( 0x0D ) == STRING_NOTFOUND, "TextDoc::InsertText: Zeilentrenner in Absatz nicht erlaubt!" ); - - TextNode* pNode = maTextNodes.GetObject( rPaM.GetPara() ); - pNode->InsertText( rPaM.GetIndex(), rStr ); - - TextPaM aPaM( rPaM.GetPara(), rPaM.GetIndex()+rStr.Len() ); - return aPaM; -} - -TextPaM TextDoc::InsertParaBreak( const TextPaM& rPaM, sal_Bool bKeepEndingAttribs ) -{ - TextNode* pNode = maTextNodes.GetObject( rPaM.GetPara() ); - TextNode* pNew = pNode->Split( rPaM.GetIndex(), bKeepEndingAttribs ); - - maTextNodes.Insert( pNew, rPaM.GetPara()+1 ); - - TextPaM aPaM( rPaM.GetPara()+1, 0 ); - return aPaM; -} - -TextPaM TextDoc::ConnectParagraphs( TextNode* pLeft, TextNode* pRight ) -{ - sal_uInt16 nPrevLen = pLeft->GetText().Len(); - pLeft->Append( *pRight ); - - // der rechte verschwindet. - sal_uLong nRight = maTextNodes.GetPos( pRight ); - maTextNodes.Remove( nRight ); - delete pRight; - - sal_uLong nLeft = maTextNodes.GetPos( pLeft ); - TextPaM aPaM( nLeft, nPrevLen ); - return aPaM; -} - -TextPaM TextDoc::RemoveChars( const TextPaM& rPaM, sal_uInt16 nChars ) -{ - TextNode* pNode = maTextNodes.GetObject( rPaM.GetPara() ); - pNode->RemoveText( rPaM.GetIndex(), nChars ); - - return rPaM; -} - -sal_Bool TextDoc::IsValidPaM( const TextPaM& rPaM ) -{ - if ( rPaM.GetPara() >= maTextNodes.Count() ) - { - OSL_FAIL( "PaM: Para out of range" ); - return sal_False; - } - TextNode * pNode = maTextNodes.GetObject( rPaM.GetPara() ); - if ( rPaM.GetIndex() > pNode->GetText().Len() ) - { - OSL_FAIL( "PaM: Index out of range" ); - return sal_False; - } - return sal_True; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textdoc.hxx b/svtools/source/edit/textdoc.hxx deleted file mode 100644 index 15511234d716..000000000000 --- a/svtools/source/edit/textdoc.hxx +++ /dev/null @@ -1,145 +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. - * - ************************************************************************/ - -#ifndef _TEXTDOC_HXX -#define _TEXTDOC_HXX - -#include <svtools/textdata.hxx> -#include <svtools/txtattr.hxx> - -#include <tools/string.hxx> -#include <vector> - -class TextCharAttribs : public std::vector<TextCharAttrib*> { -public: - ~TextCharAttribs() - { - for( iterator it = begin(); it != end(); ++it ) - delete *it; - } -}; - -class TextCharAttribList : private TextCharAttribs -{ -private: - sal_Bool mbHasEmptyAttribs; - - TextCharAttribList( const TextCharAttribList& ) : TextCharAttribs() {} - -public: - TextCharAttribList(); - ~TextCharAttribList(); - - void Clear( sal_Bool bDestroyAttribs ); - sal_uInt16 Count() const { return TextCharAttribs::size(); } - - TextCharAttrib* GetAttrib( sal_uInt16 n ) const { return TextCharAttribs::operator[]( n ); } - void RemoveAttrib( sal_uInt16 n ) { TextCharAttribs::erase( begin() + n ); } - - void InsertAttrib( TextCharAttrib* pAttrib ); - - void DeleteEmptyAttribs(); - void ResortAttribs(); - - sal_Bool HasEmptyAttribs() const { return mbHasEmptyAttribs; } - sal_Bool& HasEmptyAttribs() { return mbHasEmptyAttribs; } - - TextCharAttrib* FindAttrib( sal_uInt16 nWhich, sal_uInt16 nPos ); - TextCharAttrib* FindNextAttrib( sal_uInt16 nWhich, sal_uInt16 nFromPos, sal_uInt16 nMaxPos = 0xFFFF ) const; - TextCharAttrib* FindEmptyAttrib( sal_uInt16 nWhich, sal_uInt16 nPos ); - sal_Bool HasAttrib( sal_uInt16 nWhich ) const; - sal_Bool HasBoundingAttrib( sal_uInt16 nBound ); -}; - - -class TextNode -{ -private: - String maText; - TextCharAttribList maCharAttribs; - - TextNode( const TextNode& ) {;} -protected: - void ExpandAttribs( sal_uInt16 nIndex, sal_uInt16 nNewChars ); - void CollapsAttribs( sal_uInt16 nIndex, sal_uInt16 nDelChars ); - -public: - TextNode( const String& rText ); - - - const String& GetText() const { return maText; } - - const TextCharAttribList& GetCharAttribs() const { return maCharAttribs; } - TextCharAttribList& GetCharAttribs() { return maCharAttribs; } - - void InsertText( sal_uInt16 nPos, const String& rText ); - void InsertText( sal_uInt16 nPos, sal_Unicode c ); - void RemoveText( sal_uInt16 nPos, sal_uInt16 nChars ); - - TextNode* Split( sal_uInt16 nPos, sal_Bool bKeepEndigAttribs ); - void Append( const TextNode& rNode ); -}; - -class TextDoc -{ -private: - ToolsList<TextNode*> maTextNodes; - sal_uInt16 mnLeftMargin; - -protected: - void DestroyTextNodes(); - -public: - TextDoc(); - ~TextDoc(); - - void Clear(); - - ToolsList<TextNode*>& GetNodes() { return maTextNodes; } - const ToolsList<TextNode*>& GetNodes() const { return maTextNodes; } - - TextPaM RemoveChars( const TextPaM& rPaM, sal_uInt16 nChars ); - TextPaM InsertText( const TextPaM& rPaM, sal_Unicode c ); - TextPaM InsertText( const TextPaM& rPaM, const String& rStr ); - - TextPaM InsertParaBreak( const TextPaM& rPaM, sal_Bool bKeepEndingAttribs ); - TextPaM ConnectParagraphs( TextNode* pLeft, TextNode* pRight ); - - sal_uLong GetTextLen( const sal_Unicode* pSep, const TextSelection* pSel = NULL ) const; - String GetText( const sal_Unicode* pSep ) const; - String GetText( sal_uLong nPara ) const; - - void SetLeftMargin( sal_uInt16 n ) { mnLeftMargin = n; } - sal_uInt16 GetLeftMargin() const { return mnLeftMargin; } - - sal_Bool IsValidPaM( const TextPaM& rPaM ); -}; - -#endif // _TEXTDOC_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/texteng.cxx b/svtools/source/edit/texteng.cxx deleted file mode 100644 index efce793b44b0..000000000000 --- a/svtools/source/edit/texteng.cxx +++ /dev/null @@ -1,3205 +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. - * - ************************************************************************/ - -#include <tools/stream.hxx> - -#include <svtools/texteng.hxx> -#include <svtools/textview.hxx> -#include <textdoc.hxx> -#include <textdat2.hxx> -#include <textundo.hxx> -#include <textund2.hxx> -#include <svl/ctloptions.hxx> -#include <vcl/window.hxx> - -#include <vcl/edit.hxx> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/beans/PropertyValues.hpp> - -#include <com/sun/star/i18n/XBreakIterator.hpp> - -#include <com/sun/star/i18n/CharacterIteratorMode.hpp> - -#include <com/sun/star/i18n/WordType.hpp> - -#include <com/sun/star/i18n/XExtendedInputSequenceChecker.hpp> -#include <com/sun/star/i18n/InputSequenceCheckMode.hpp> -#include <com/sun/star/i18n/ScriptType.hpp> - -#include <comphelper/processfactory.hxx> - -#include <unotools/localedatawrapper.hxx> -#include <vcl/unohelp.hxx> - -#include <vcl/svapp.hxx> -#include <vcl/metric.hxx> - -#include <unicode/ubidi.h> - -#include <set> -#include <vector> -#include <boost/foreach.hpp> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::rtl; - - -// ------------------------------------------------------------------------- -// (-) class TextEngine -// ------------------------------------------------------------------------- -TextEngine::TextEngine() -{ - mpDoc = 0; - mpTEParaPortions = 0; - - mpViews = new TextViews; - mpActiveView = NULL; - - mbIsFormatting = sal_False; - mbFormatted = sal_False; - mbUpdate = sal_True; - mbModified = sal_False; - mbUndoEnabled = sal_False; - mbIsInUndo = sal_False; - mbDowning = sal_False; - mbRightToLeft = sal_False; - mbHasMultiLineParas = sal_False; - - meAlign = TXTALIGN_LEFT; - - mnMaxTextWidth = 0; - mnMaxTextLen = 0; - mnCurTextWidth = 0xFFFFFFFF; - mnCurTextHeight = 0; - - mpUndoManager = NULL; - mpIMEInfos = NULL; - mpLocaleDataWrapper = NULL; - - mpIdleFormatter = new IdleFormatter; - mpIdleFormatter->SetTimeoutHdl( LINK( this, TextEngine, IdleFormatHdl ) ); - - mpRefDev = new VirtualDevice; - - ImpInitLayoutMode( mpRefDev ); - - ImpInitDoc(); - - maTextColor = COL_BLACK; - Font aFont; - aFont.SetTransparent( sal_False ); - Color aFillColor( aFont.GetFillColor() ); - aFillColor.SetTransparency( 0 ); - aFont.SetFillColor( aFillColor ); - SetFont( aFont ); -} - -TextEngine::~TextEngine() -{ - mbDowning = sal_True; - - delete mpIdleFormatter; - delete mpDoc; - delete mpTEParaPortions; - delete mpViews; // nur die Liste, nicht die Vies - delete mpRefDev; - delete mpUndoManager; - delete mpIMEInfos; - delete mpLocaleDataWrapper; -} - -void TextEngine::InsertView( TextView* pTextView ) -{ - mpViews->push_back( pTextView ); - pTextView->SetSelection( TextSelection() ); - - if ( !GetActiveView() ) - SetActiveView( pTextView ); -} - -void TextEngine::RemoveView( TextView* pTextView ) -{ - TextViews::iterator it = std::find( mpViews->begin(), mpViews->end(), pTextView ); - if( it != mpViews->end() ) - { - pTextView->HideCursor(); - mpViews->erase( it ); - if ( pTextView == GetActiveView() ) - SetActiveView( 0 ); - } -} - -sal_uInt16 TextEngine::GetViewCount() const -{ - return mpViews->size(); -} - -TextView* TextEngine::GetView( sal_uInt16 nView ) const -{ - return (*mpViews)[ nView ]; -} - -TextView* TextEngine::GetActiveView() const -{ - return mpActiveView; -} - -void TextEngine::SetActiveView( TextView* pTextView ) -{ - if ( pTextView != mpActiveView ) - { - if ( mpActiveView ) - mpActiveView->HideSelection(); - - mpActiveView = pTextView; - - if ( mpActiveView ) - mpActiveView->ShowSelection(); - } -} - -void TextEngine::SetFont( const Font& rFont ) -{ - if ( rFont != maFont ) - { - maFont = rFont; - // #i40221# As the font's color now defaults to transparent (since i35764) - // we have to choose a useful textcolor in this case. - // Otherwise maTextColor and maFont.GetColor() are both transparent.... - if( rFont.GetColor() == COL_TRANSPARENT ) - maTextColor = COL_BLACK; - else - maTextColor = rFont.GetColor(); - - // Wegen Selektion keinen Transparenten Font zulassen... - // (Sonst spaeter in ImplPaint den Hintergrund anders loeschen...) - maFont.SetTransparent( sal_False ); - // Tell VCL not to use the font color, use text color from OutputDevice - maFont.SetColor( COL_TRANSPARENT ); - Color aFillColor( maFont.GetFillColor() ); - aFillColor.SetTransparency( 0 ); - maFont.SetFillColor( aFillColor ); - - maFont.SetAlign( ALIGN_TOP ); - mpRefDev->SetFont( maFont); - Size aTextSize; - aTextSize.Width() = mpRefDev->GetTextWidth(rtl::OUString(" ")); - aTextSize.Height() = mpRefDev->GetTextHeight(); - if ( !aTextSize.Width() ) - aTextSize.Width() = mpRefDev->GetTextWidth(rtl::OUString("XXXX")); - - mnDefTab = (sal_uInt16)aTextSize.Width(); - if ( !mnDefTab ) - mnDefTab = 1; - mnCharHeight = (sal_uInt16)aTextSize.Height(); - mnFixCharWidth100 = 0; - - FormatFullDoc(); - UpdateViews(); - - for ( sal_uInt16 nView = mpViews->size(); nView; ) - { - TextView* pView = (*mpViews)[ --nView ]; - pView->GetWindow()->SetInputContext( InputContext( GetFont(), !pView->IsReadOnly() ? INPUTCONTEXT_TEXT|INPUTCONTEXT_EXTTEXTINPUT : 0 ) ); - } - } -} - -void TextEngine::SetMaxTextLen( sal_uLong nLen ) -{ - mnMaxTextLen = nLen; -} - -void TextEngine::SetMaxTextWidth( sal_uLong nMaxWidth ) -{ - if ( nMaxWidth != mnMaxTextWidth ) - { - mnMaxTextWidth = Min( nMaxWidth, (sal_uLong)0x7FFFFFFF ); - FormatFullDoc(); - UpdateViews(); - } -} - -static sal_Unicode static_aLFText[] = { '\n', 0 }; -static sal_Unicode static_aCRText[] = { '\r', 0 }; -static sal_Unicode static_aCRLFText[] = { '\r', '\n', 0 }; - -static inline const sal_Unicode* static_getLineEndText( LineEnd aLineEnd ) -{ - const sal_Unicode* pRet = NULL; - - switch( aLineEnd ) - { - case LINEEND_LF: pRet = static_aLFText;break; - case LINEEND_CR: pRet = static_aCRText;break; - case LINEEND_CRLF: pRet = static_aCRLFText;break; - } - return pRet; -} - -void TextEngine::ReplaceText(const TextSelection& rSel, const String& rText) -{ - ImpInsertText( rSel, rText ); -} - -String TextEngine::GetText( LineEnd aSeparator ) const -{ - return mpDoc->GetText( static_getLineEndText( aSeparator ) ); -} - -String TextEngine::GetTextLines( LineEnd aSeparator ) const -{ - String aText; - sal_uLong nParas = mpTEParaPortions->Count(); - const sal_Unicode* pSep = static_getLineEndText( aSeparator ); - for ( sal_uLong nP = 0; nP < nParas; nP++ ) - { - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nP ); - - sal_uInt16 nLines = pTEParaPortion->GetLines().size(); - for ( sal_uInt16 nL = 0; nL < nLines; nL++ ) - { - TextLine* pLine = pTEParaPortion->GetLines()[nL]; - aText += pTEParaPortion->GetNode()->GetText().Copy( pLine->GetStart(), pLine->GetEnd() - pLine->GetStart() ); - if ( pSep && ( ( (nP+1) < nParas ) || ( (nL+1) < nLines ) ) ) - aText += pSep; - } - } - return aText; -} - -String TextEngine::GetText( sal_uLong nPara ) const -{ - return mpDoc->GetText( nPara ); -} - -sal_uLong TextEngine::GetTextLen( LineEnd aSeparator ) const -{ - return mpDoc->GetTextLen( static_getLineEndText( aSeparator ) ); -} - -sal_uLong TextEngine::GetTextLen( const TextSelection& rSel, LineEnd aSeparator ) const -{ - TextSelection aSel( rSel ); - aSel.Justify(); - ValidateSelection( aSel ); - return mpDoc->GetTextLen( static_getLineEndText( aSeparator ), &aSel ); -} - -sal_uInt16 TextEngine::GetTextLen( sal_uLong nPara ) const -{ - return mpDoc->GetNodes().GetObject( nPara )->GetText().Len(); -} - -void TextEngine::SetUpdateMode( sal_Bool bUpdate ) -{ - if ( bUpdate != mbUpdate ) - { - mbUpdate = bUpdate; - if ( mbUpdate ) - { - FormatAndUpdate( GetActiveView() ); - if ( GetActiveView() ) - GetActiveView()->ShowCursor(); - } - } -} - -sal_Bool TextEngine::DoesKeyChangeText( const KeyEvent& rKeyEvent ) -{ - sal_Bool bDoesChange = sal_False; - - KeyFuncType eFunc = rKeyEvent.GetKeyCode().GetFunction(); - if ( eFunc != KEYFUNC_DONTKNOW ) - { - switch ( eFunc ) - { - case KEYFUNC_UNDO: - case KEYFUNC_REDO: - case KEYFUNC_CUT: - case KEYFUNC_PASTE: bDoesChange = sal_True; - break; - default: // wird dann evtl. unten bearbeitet. - eFunc = KEYFUNC_DONTKNOW; - } - } - if ( eFunc == KEYFUNC_DONTKNOW ) - { - switch ( rKeyEvent.GetKeyCode().GetCode() ) - { - case KEY_DELETE: - case KEY_BACKSPACE: - { - if ( !rKeyEvent.GetKeyCode().IsMod2() ) - bDoesChange = sal_True; - } - break; - case KEY_RETURN: - case KEY_TAB: - { - if ( !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() ) - bDoesChange = sal_True; - } - break; - default: - { - bDoesChange = TextEngine::IsSimpleCharInput( rKeyEvent ); - } - } - } - return bDoesChange; -} - -sal_Bool TextEngine::IsSimpleCharInput( const KeyEvent& rKeyEvent ) -{ - if( rKeyEvent.GetCharCode() >= 32 && rKeyEvent.GetCharCode() != 127 && - KEY_MOD1 != (rKeyEvent.GetKeyCode().GetModifier() & ~KEY_SHIFT) && // (ssa) #i45714#: - KEY_MOD2 != (rKeyEvent.GetKeyCode().GetModifier() & ~KEY_SHIFT) ) // check for Ctrl and Alt separately - { - return sal_True; - } - return sal_False; -} - -void TextEngine::ImpInitDoc() -{ - if ( mpDoc ) - mpDoc->Clear(); - else - mpDoc = new TextDoc; - - delete mpTEParaPortions; - mpTEParaPortions = new TEParaPortions; - - TextNode* pNode = new TextNode( String() ); - mpDoc->GetNodes().Insert( pNode, 0 ); - - TEParaPortion* pIniPortion = new TEParaPortion( pNode ); - mpTEParaPortions->Insert( pIniPortion, (sal_uLong)0 ); - - mbFormatted = sal_False; - - ImpParagraphRemoved( TEXT_PARA_ALL ); - ImpParagraphInserted( 0 ); -} - -String TextEngine::GetText( const TextSelection& rSel, LineEnd aSeparator ) const -{ - String aText; - - if ( !rSel.HasRange() ) - return aText; - - TextSelection aSel( rSel ); - aSel.Justify(); - - sal_uLong nStartPara = aSel.GetStart().GetPara(); - sal_uLong nEndPara = aSel.GetEnd().GetPara(); - const sal_Unicode* pSep = static_getLineEndText( aSeparator ); - for ( sal_uLong nNode = aSel.GetStart().GetPara(); nNode <= nEndPara; nNode++ ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( nNode ); - - sal_uInt16 nStartPos = 0; - sal_uInt16 nEndPos = pNode->GetText().Len(); - if ( nNode == nStartPara ) - nStartPos = aSel.GetStart().GetIndex(); - if ( nNode == nEndPara ) // kann auch == nStart sein! - nEndPos = aSel.GetEnd().GetIndex(); - - aText += pNode->GetText().Copy( nStartPos, nEndPos-nStartPos ); - if ( nNode < nEndPara ) - aText += pSep; - } - return aText; -} - -void TextEngine::ImpRemoveText() -{ - ImpInitDoc(); - - TextPaM aStartPaM( 0, 0 ); - TextSelection aEmptySel( aStartPaM, aStartPaM ); - for ( sal_uInt16 nView = 0; nView < mpViews->size(); nView++ ) - { - TextView* pView = (*mpViews)[ nView ]; - pView->ImpSetSelection( aEmptySel ); - } - ResetUndo(); -} - -void TextEngine::SetText( const XubString& rText ) -{ - ImpRemoveText(); - - sal_Bool bUndoCurrentlyEnabled = IsUndoEnabled(); - // Der von Hand reingesteckte Text kann nicht vom Anwender rueckgaengig gemacht werden. - EnableUndo( sal_False ); - - TextPaM aStartPaM( 0, 0 ); - TextSelection aEmptySel( aStartPaM, aStartPaM ); - - TextPaM aPaM = aStartPaM; - if ( rText.Len() ) - aPaM = ImpInsertText( aEmptySel, rText ); - - for ( sal_uInt16 nView = 0; nView < mpViews->size(); nView++ ) - { - TextView* pView = (*mpViews)[ nView ]; - pView->ImpSetSelection( aEmptySel ); - - // Wenn kein Text, dann auch Kein Format&Update - // => Der Text bleibt stehen. - if ( !rText.Len() && GetUpdateMode() ) - pView->Invalidate(); - } - - if( !rText.Len() ) // sonst muss spaeter noch invalidiert werden, !bFormatted reicht. - mnCurTextHeight = 0; - - FormatAndUpdate(); - - EnableUndo( bUndoCurrentlyEnabled ); - DBG_ASSERT( !HasUndoManager() || !GetUndoManager().GetUndoActionCount(), "Undo nach SetText?" ); -} - - -void TextEngine::CursorMoved( sal_uLong nNode ) -{ - // Leere Attribute loeschen, aber nur, wenn Absatz nicht leer! - TextNode* pNode = mpDoc->GetNodes().GetObject( nNode ); - if ( pNode && pNode->GetCharAttribs().HasEmptyAttribs() && pNode->GetText().Len() ) - pNode->GetCharAttribs().DeleteEmptyAttribs(); -} - -void TextEngine::ImpRemoveChars( const TextPaM& rPaM, sal_uInt16 nChars, SfxUndoAction* ) -{ - DBG_ASSERT( nChars, "ImpRemoveChars - 0 Chars?!" ); - if ( IsUndoEnabled() && !IsInUndo() ) - { - // Attribute muessen hier vorm RemoveChars fuer UNDO gesichert werden! - TextNode* pNode = mpDoc->GetNodes().GetObject( rPaM.GetPara() ); - XubString aStr( pNode->GetText().Copy( rPaM.GetIndex(), nChars ) ); - - // Pruefen, ob Attribute geloescht oder geaendert werden: - sal_uInt16 nStart = rPaM.GetIndex(); - sal_uInt16 nEnd = nStart + nChars; - for ( sal_uInt16 nAttr = pNode->GetCharAttribs().Count(); nAttr; ) - { - TextCharAttrib* pAttr = pNode->GetCharAttribs().GetAttrib( --nAttr ); - if ( ( pAttr->GetEnd() >= nStart ) && ( pAttr->GetStart() < nEnd ) ) - { - break; // for - } - } - InsertUndo( new TextUndoRemoveChars( this, rPaM, aStr ) ); - } - - mpDoc->RemoveChars( rPaM, nChars ); - ImpCharsRemoved( rPaM.GetPara(), rPaM.GetIndex(), nChars ); -} - -TextPaM TextEngine::ImpConnectParagraphs( sal_uLong nLeft, sal_uLong nRight ) -{ - DBG_ASSERT( nLeft != nRight, "Den gleichen Absatz zusammenfuegen ?" ); - - TextNode* pLeft = mpDoc->GetNodes().GetObject( nLeft ); - TextNode* pRight = mpDoc->GetNodes().GetObject( nRight ); - - if ( IsUndoEnabled() && !IsInUndo() ) - InsertUndo( new TextUndoConnectParas( this, nLeft, pLeft->GetText().Len() ) ); - - // Erstmal Portions suchen, da pRight nach ConnectParagraphs weg. - TEParaPortion* pLeftPortion = mpTEParaPortions->GetObject( nLeft ); - TEParaPortion* pRightPortion = mpTEParaPortions->GetObject( nRight ); - DBG_ASSERT( pLeft && pLeftPortion, "Blinde Portion in ImpConnectParagraphs(1)" ); - DBG_ASSERT( pRight && pRightPortion, "Blinde Portion in ImpConnectParagraphs(2)" ); - - TextPaM aPaM = mpDoc->ConnectParagraphs( pLeft, pRight ); - ImpParagraphRemoved( nRight ); - - pLeftPortion->MarkSelectionInvalid( aPaM.GetIndex(), pLeft->GetText().Len() ); - - mpTEParaPortions->Remove( nRight ); - delete pRightPortion; - // der rechte Node wird von EditDoc::ConnectParagraphs() geloescht. - - return aPaM; -} - -TextPaM TextEngine::ImpDeleteText( const TextSelection& rSel ) -{ - if ( !rSel.HasRange() ) - return rSel.GetStart(); - - TextSelection aSel( rSel ); - aSel.Justify(); - TextPaM aStartPaM( aSel.GetStart() ); - TextPaM aEndPaM( aSel.GetEnd() ); - - CursorMoved( aStartPaM.GetPara() ); // nur damit neu eingestellte Attribute verschwinden... - CursorMoved( aEndPaM.GetPara() ); // nur damit neu eingestellte Attribute verschwinden... - - DBG_ASSERT( mpDoc->IsValidPaM( aStartPaM ), "Index im Wald in ImpDeleteText" ); - DBG_ASSERT( mpDoc->IsValidPaM( aEndPaM ), "Index im Wald in ImpDeleteText" ); - - sal_uLong nStartNode = aStartPaM.GetPara(); - sal_uLong nEndNode = aEndPaM.GetPara(); - - // Alle Nodes dazwischen entfernen.... - for ( sal_uLong z = nStartNode+1; z < nEndNode; z++ ) - { - // Immer nStartNode+1, wegen Remove()! - ImpRemoveParagraph( nStartNode+1 ); - } - - if ( nStartNode != nEndNode ) - { - // Den Rest des StartNodes... - TextNode* pLeft = mpDoc->GetNodes().GetObject( nStartNode ); - sal_uInt16 nChars = pLeft->GetText().Len() - aStartPaM.GetIndex(); - if ( nChars ) - { - ImpRemoveChars( aStartPaM, nChars ); - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nStartNode ); - DBG_ASSERT( pPortion, "Blinde Portion in ImpDeleteText(3)" ); - pPortion->MarkSelectionInvalid( aStartPaM.GetIndex(), pLeft->GetText().Len() ); - } - - // Den Anfang des EndNodes.... - nEndNode = nStartNode+1; // Die anderen Absaetze wurden geloescht - nChars = aEndPaM.GetIndex(); - if ( nChars ) - { - aEndPaM.GetPara() = nEndNode; - aEndPaM.GetIndex() = 0; - ImpRemoveChars( aEndPaM, nChars ); - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nEndNode ); - DBG_ASSERT( pPortion, "Blinde Portion in ImpDeleteText(4)" ); - pPortion->MarkSelectionInvalid( 0, pPortion->GetNode()->GetText().Len() ); - } - - // Zusammenfuegen.... - aStartPaM = ImpConnectParagraphs( nStartNode, nEndNode ); - } - else - { - sal_uInt16 nChars; - nChars = aEndPaM.GetIndex() - aStartPaM.GetIndex(); - ImpRemoveChars( aStartPaM, nChars ); - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nStartNode ); - DBG_ASSERT( pPortion, "Blinde Portion in ImpDeleteText(5)" ); - pPortion->MarkInvalid( aEndPaM.GetIndex(), aStartPaM.GetIndex() - aEndPaM.GetIndex() ); - } - -// UpdateSelections(); - TextModified(); - return aStartPaM; -} - -void TextEngine::ImpRemoveParagraph( sal_uLong nPara ) -{ - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPara ); - - // Der Node wird vom Undo verwaltet und ggf. zerstoert! - /* delete */ mpDoc->GetNodes().Remove( nPara ); - if ( IsUndoEnabled() && !IsInUndo() ) - InsertUndo( new TextUndoDelPara( this, pNode, nPara ) ); - else - delete pNode; - - mpTEParaPortions->Remove( nPara ); - delete pPortion; - - ImpParagraphRemoved( nPara ); -} - -uno::Reference < i18n::XExtendedInputSequenceChecker > TextEngine::GetInputSequenceChecker() const -{ - uno::Reference < i18n::XExtendedInputSequenceChecker > xISC; -// if ( !xISC.is() ) - { - uno::Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); - uno::Reference< uno::XInterface > xI = xMSF->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.i18n.InputSequenceChecker" )) ); - if ( xI.is() ) - { - Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XExtendedInputSequenceChecker >*)0) ); - x >>= xISC; - } - } - return xISC; -} - -sal_Bool TextEngine::IsInputSequenceCheckingRequired( sal_Unicode c, const TextSelection& rCurSel ) const -{ - uno::Reference< i18n::XBreakIterator > xBI = ((TextEngine *) this)->GetBreakIterator(); - SvtCTLOptions aCTLOptions; - - // get the index that really is first - sal_uInt16 nFirstPos = rCurSel.GetStart().GetIndex(); - sal_uInt16 nMaxPos = rCurSel.GetEnd().GetIndex(); - if (nMaxPos < nFirstPos) - nFirstPos = nMaxPos; - - sal_Bool bIsSequenceChecking = - aCTLOptions.IsCTLFontEnabled() && - aCTLOptions.IsCTLSequenceChecking() && - nFirstPos != 0 && /* first char needs not to be checked */ - xBI.is() && i18n::ScriptType::COMPLEX == xBI->getScriptType( rtl::OUString( c ), 0 ); - - return bIsSequenceChecking; -} - -TextPaM TextEngine::ImpInsertText( const TextSelection& rCurSel, sal_Unicode c, sal_Bool bOverwrite ) -{ - return ImpInsertText( c, rCurSel, bOverwrite, sal_False ); -} - -TextPaM TextEngine::ImpInsertText( sal_Unicode c, const TextSelection& rCurSel, sal_Bool bOverwrite, sal_Bool bIsUserInput ) -{ - DBG_ASSERT( c != '\n', "Zeilenumbruch bei InsertText ?" ); - DBG_ASSERT( c != '\r', "Zeilenumbruch bei InsertText ?" ); - - TextPaM aPaM( rCurSel.GetStart() ); - TextNode* pNode = mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - - if ( pNode->GetText().Len() < STRING_MAXLEN ) - { - sal_Bool bDoOverwrite = ( bOverwrite && - ( aPaM.GetIndex() < pNode->GetText().Len() ) ) ? sal_True : sal_False; - - sal_Bool bUndoAction = ( rCurSel.HasRange() || bDoOverwrite ); - - if ( bUndoAction ) - UndoActionStart(); - - if ( rCurSel.HasRange() ) - { - aPaM = ImpDeleteText( rCurSel ); - } - else if ( bDoOverwrite ) - { - // Wenn Selektion, dann kein Zeichen ueberschreiben - TextSelection aTmpSel( aPaM ); - aTmpSel.GetEnd().GetIndex()++; - ImpDeleteText( aTmpSel ); - } - - if (bIsUserInput && IsInputSequenceCheckingRequired( c, rCurSel )) - { - uno::Reference < i18n::XExtendedInputSequenceChecker > xISC = GetInputSequenceChecker(); - SvtCTLOptions aCTLOptions; - - if (xISC.is()) - { - xub_StrLen nTmpPos = aPaM.GetIndex(); - sal_Int16 nCheckMode = aCTLOptions.IsCTLSequenceCheckingRestricted() ? - i18n::InputSequenceCheckMode::STRICT : i18n::InputSequenceCheckMode::BASIC; - - // the text that needs to be checked is only the one - // before the current cursor position - rtl::OUString aOldText( mpDoc->GetText( aPaM.GetPara() ).Copy(0, nTmpPos) ); - rtl::OUString aNewText( aOldText ); - if (aCTLOptions.IsCTLSequenceCheckingTypeAndReplace()) - { - xISC->correctInputSequence( aNewText, nTmpPos - 1, c, nCheckMode ); - - // find position of first character that has changed - sal_Int32 nOldLen = aOldText.getLength(); - sal_Int32 nNewLen = aNewText.getLength(); - const sal_Unicode *pOldTxt = aOldText.getStr(); - const sal_Unicode *pNewTxt = aNewText.getStr(); - sal_Int32 nChgPos = 0; - while ( nChgPos < nOldLen && nChgPos < nNewLen && - pOldTxt[nChgPos] == pNewTxt[nChgPos] ) - ++nChgPos; - - String aChgText( aNewText.copy( nChgPos ) ); - - // select text from first pos to be changed to current pos - TextSelection aSel( TextPaM( aPaM.GetPara(), (sal_uInt16) nChgPos ), aPaM ); - - if (aChgText.Len()) - // ImpInsertText implicitly handles undo... - return ImpInsertText( aSel, aChgText ); - else - return aPaM; - } - else - { - // should the character be ignored (i.e. not get inserted) ? - if (!xISC->checkInputSequence( aOldText, nTmpPos - 1, c, nCheckMode )) - return aPaM; // nothing to be done -> no need for undo - } - } - - // at this point now we will insert the character 'normally' some lines below... - } - - - if ( IsUndoEnabled() && !IsInUndo() ) - { - TextUndoInsertChars* pNewUndo = new TextUndoInsertChars( this, aPaM, rtl::OUString(c) ); - sal_Bool bTryMerge = ( !bDoOverwrite && ( c != ' ' ) ) ? sal_True : sal_False; - InsertUndo( pNewUndo, bTryMerge ); - } - - TEParaPortion* pPortion = mpTEParaPortions->GetObject( aPaM.GetPara() ); - pPortion->MarkInvalid( aPaM.GetIndex(), 1 ); - if ( c == '\t' ) - pPortion->SetNotSimpleInvalid(); - aPaM = mpDoc->InsertText( aPaM, c ); - ImpCharsInserted( aPaM.GetPara(), aPaM.GetIndex()-1, 1 ); - - TextModified(); - - if ( bUndoAction ) - UndoActionEnd(); - } - - return aPaM; -} - - -TextPaM TextEngine::ImpInsertText( const TextSelection& rCurSel, const XubString& rStr ) -{ - UndoActionStart(); - - TextPaM aPaM; - - if ( rCurSel.HasRange() ) - aPaM = ImpDeleteText( rCurSel ); - else - aPaM = rCurSel.GetEnd(); - - XubString aText(convertLineEnd(rStr, LINEEND_LF)); - - sal_uInt16 nStart = 0; - while ( nStart < aText.Len() ) - { - sal_uInt16 nEnd = aText.Search( LINE_SEP, nStart ); - if ( nEnd == STRING_NOTFOUND ) - nEnd = aText.Len(); // nicht dereferenzieren! - - // Start == End => Leerzeile - if ( nEnd > nStart ) - { - sal_uLong nL = aPaM.GetIndex(); - nL += ( nEnd-nStart ); - if ( nL > STRING_MAXLEN ) - { - sal_uInt16 nDiff = (sal_uInt16) (nL-STRING_MAXLEN); - nEnd = nEnd - nDiff; - } - - XubString aLine( aText, nStart, nEnd-nStart ); - if ( IsUndoEnabled() && !IsInUndo() ) - InsertUndo( new TextUndoInsertChars( this, aPaM, aLine ) ); - - TEParaPortion* pPortion = mpTEParaPortions->GetObject( aPaM.GetPara() ); - pPortion->MarkInvalid( aPaM.GetIndex(), aLine.Len() ); - if ( aLine.Search( '\t' ) != STRING_NOTFOUND ) - pPortion->SetNotSimpleInvalid(); - - aPaM = mpDoc->InsertText( aPaM, aLine ); - ImpCharsInserted( aPaM.GetPara(), aPaM.GetIndex()-aLine.Len(), aLine.Len() ); - - } - if ( nEnd < aText.Len() ) - aPaM = ImpInsertParaBreak( aPaM ); - - nStart = nEnd+1; - - if ( nStart < nEnd ) // #108611# overflow - break; - } - - UndoActionEnd(); - - TextModified(); - return aPaM; -} - -TextPaM TextEngine::ImpInsertParaBreak( const TextSelection& rCurSel, sal_Bool bKeepEndingAttribs ) -{ - TextPaM aPaM; - if ( rCurSel.HasRange() ) - aPaM = ImpDeleteText( rCurSel ); - else - aPaM = rCurSel.GetEnd(); - - return ImpInsertParaBreak( aPaM, bKeepEndingAttribs ); -} - -TextPaM TextEngine::ImpInsertParaBreak( const TextPaM& rPaM, sal_Bool bKeepEndingAttribs ) -{ - if ( IsUndoEnabled() && !IsInUndo() ) - InsertUndo( new TextUndoSplitPara( this, rPaM.GetPara(), rPaM.GetIndex() ) ); - - TextNode* pNode = mpDoc->GetNodes().GetObject( rPaM.GetPara() ); - sal_Bool bFirstParaContentChanged = rPaM.GetIndex() < pNode->GetText().Len(); - - TextPaM aPaM( mpDoc->InsertParaBreak( rPaM, bKeepEndingAttribs ) ); - - TEParaPortion* pPortion = mpTEParaPortions->GetObject( rPaM.GetPara() ); - DBG_ASSERT( pPortion, "Blinde Portion in ImpInsertParaBreak" ); - pPortion->MarkInvalid( rPaM.GetIndex(), 0 ); - - TextNode* pNewNode = mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - TEParaPortion* pNewPortion = new TEParaPortion( pNewNode ); - mpTEParaPortions->Insert( pNewPortion, aPaM.GetPara() ); - ImpParagraphInserted( aPaM.GetPara() ); - - CursorMoved( rPaM.GetPara() ); // falls leeres Attribut entstanden. - TextModified(); - - if ( bFirstParaContentChanged ) - Broadcast( TextHint( TEXT_HINT_PARACONTENTCHANGED, rPaM.GetPara() ) ); - - return aPaM; -} - -Rectangle TextEngine::PaMtoEditCursor( const TextPaM& rPaM, sal_Bool bSpecial ) -{ - DBG_ASSERT( GetUpdateMode(), "Darf bei Update=sal_False nicht erreicht werden: PaMtoEditCursor" ); - - Rectangle aEditCursor; - long nY = 0; - - if ( !mbHasMultiLineParas ) - { - nY = rPaM.GetPara() * mnCharHeight; - } - else - { - for ( sal_uLong nPortion = 0; nPortion < rPaM.GetPara(); nPortion++ ) - { - TEParaPortion* pPortion = mpTEParaPortions->GetObject(nPortion); - nY += pPortion->GetLines().size() * mnCharHeight; - } - } - - aEditCursor = GetEditCursor( rPaM, bSpecial ); - aEditCursor.Top() += nY; - aEditCursor.Bottom() += nY; - return aEditCursor; -} - -Rectangle TextEngine::GetEditCursor( const TextPaM& rPaM, sal_Bool bSpecial, sal_Bool bPreferPortionStart ) -{ - if ( !IsFormatted() && !IsFormatting() ) - FormatAndUpdate(); - - TEParaPortion* pPortion = mpTEParaPortions->GetObject( rPaM.GetPara() ); - //TextNode* pNode = mpDoc->GetNodes().GetObject( rPaM.GetPara() ); - - /* - bSpecial: Wenn hinter dem letzten Zeichen einer umgebrochenen Zeile, - am Ende der Zeile bleiben, nicht am Anfang der naechsten. - Zweck: - END => wirklich hinter das letzte Zeichen - - Selektion.... - bSpecial: If behind the last character of a made up line, stay at the - end of the line, not at the start of the next line. - Purpose: - really END = > behind the last character - - to selection... - - */ - - long nY = 0; - sal_uInt16 nCurIndex = 0; - TextLine* pLine = 0; - for ( sal_uInt16 nLine = 0; nLine < pPortion->GetLines().size(); nLine++ ) - { - TextLine* pTmpLine = pPortion->GetLines()[ nLine ]; - if ( ( pTmpLine->GetStart() == rPaM.GetIndex() ) || ( pTmpLine->IsIn( rPaM.GetIndex(), bSpecial ) ) ) - { - pLine = pTmpLine; - break; - } - - nCurIndex = nCurIndex + pTmpLine->GetLen(); - nY += mnCharHeight; - } - if ( !pLine ) - { - // Cursor am Ende des Absatzes. - DBG_ASSERT( rPaM.GetIndex() == nCurIndex, "Index voll daneben in GetEditCursor!" ); - - pLine = pPortion->GetLines().back(); - nY -= mnCharHeight; - nCurIndex = nCurIndex - pLine->GetLen(); - } - - Rectangle aEditCursor; - - aEditCursor.Top() = nY; - nY += mnCharHeight; - aEditCursor.Bottom() = nY-1; - - // innerhalb der Zeile suchen.... - long nX = ImpGetXPos( rPaM.GetPara(), pLine, rPaM.GetIndex(), bPreferPortionStart ); - aEditCursor.Left() = aEditCursor.Right() = nX; - return aEditCursor; -} - -long TextEngine::ImpGetXPos( sal_uLong nPara, TextLine* pLine, sal_uInt16 nIndex, sal_Bool bPreferPortionStart ) -{ - DBG_ASSERT( ( nIndex >= pLine->GetStart() ) && ( nIndex <= pLine->GetEnd() ) , "ImpGetXPos muss richtig gerufen werden!" ); - - sal_Bool bDoPreferPortionStart = bPreferPortionStart; - // Assure that the portion belongs to this line: - if ( nIndex == pLine->GetStart() ) - bDoPreferPortionStart = sal_True; - else if ( nIndex == pLine->GetEnd() ) - bDoPreferPortionStart = sal_False; - - TEParaPortion* pParaPortion = mpTEParaPortions->GetObject( nPara ); - - sal_uInt16 nTextPortionStart = 0; - size_t nTextPortion = pParaPortion->GetTextPortions().FindPortion( nIndex, nTextPortionStart, bDoPreferPortionStart ); - - DBG_ASSERT( ( nTextPortion >= pLine->GetStartPortion() ) && ( nTextPortion <= pLine->GetEndPortion() ), "GetXPos: Portion not in current line! " ); - - TETextPortion* pPortion = pParaPortion->GetTextPortions()[ nTextPortion ]; - - long nX = ImpGetPortionXOffset( nPara, pLine, nTextPortion ); - - long nPortionTextWidth = pPortion->GetWidth(); - - if ( nTextPortionStart != nIndex ) - { - // Search within portion... - if ( nIndex == ( nTextPortionStart + pPortion->GetLen() ) ) - { - // End of Portion - if ( ( pPortion->GetKind() == PORTIONKIND_TAB ) || - ( !IsRightToLeft() && !pPortion->IsRightToLeft() ) || - ( IsRightToLeft() && pPortion->IsRightToLeft() ) ) - { - nX += nPortionTextWidth; - if ( ( pPortion->GetKind() == PORTIONKIND_TAB ) && ( (nTextPortion+1) < pParaPortion->GetTextPortions().size() ) ) - { - TETextPortion* pNextPortion = pParaPortion->GetTextPortions()[ nTextPortion+1 ]; - if ( ( pNextPortion->GetKind() != PORTIONKIND_TAB ) && ( - ( !IsRightToLeft() && pNextPortion->IsRightToLeft() ) || - ( IsRightToLeft() && !pNextPortion->IsRightToLeft() ) ) ) - { -// nX += pNextPortion->GetWidth(); - // End of the tab portion, use start of next for cursor pos - DBG_ASSERT( !bPreferPortionStart, "ImpGetXPos - How can we this tab portion here???" ); - nX = ImpGetXPos( nPara, pLine, nIndex, sal_True ); - } - - } - } - } - else if ( pPortion->GetKind() == PORTIONKIND_TEXT ) - { - DBG_ASSERT( nIndex != pLine->GetStart(), "Strange behavior in new ImpGetXPos()" ); - - long nPosInPortion = (long)CalcTextWidth( nPara, nTextPortionStart, nIndex-nTextPortionStart ); - - if ( ( !IsRightToLeft() && !pPortion->IsRightToLeft() ) || - ( IsRightToLeft() && pPortion->IsRightToLeft() ) ) - { - nX += nPosInPortion; - } - else - { - nX += nPortionTextWidth - nPosInPortion; - } - } - } - else // if ( nIndex == pLine->GetStart() ) - { - if ( ( pPortion->GetKind() != PORTIONKIND_TAB ) && - ( ( !IsRightToLeft() && pPortion->IsRightToLeft() ) || - ( IsRightToLeft() && !pPortion->IsRightToLeft() ) ) ) - { - nX += nPortionTextWidth; - } - } - - return nX; -} - -const TextAttrib* TextEngine::FindAttrib( const TextPaM& rPaM, sal_uInt16 nWhich ) const -{ - const TextAttrib* pAttr = NULL; - const TextCharAttrib* pCharAttr = FindCharAttrib( rPaM, nWhich ); - if ( pCharAttr ) - pAttr = &pCharAttr->GetAttr(); - return pAttr; -} - -const TextCharAttrib* TextEngine::FindCharAttrib( const TextPaM& rPaM, sal_uInt16 nWhich ) const -{ - const TextCharAttrib* pAttr = NULL; - TextNode* pNode = mpDoc->GetNodes().GetObject( rPaM.GetPara() ); - if ( pNode && ( rPaM.GetIndex() < pNode->GetText().Len() ) ) - pAttr = pNode->GetCharAttribs().FindAttrib( nWhich, rPaM.GetIndex() ); - return pAttr; -} - -sal_Bool TextEngine::HasAttrib( sal_uInt16 nWhich ) const -{ - sal_Bool bAttr = sal_False; - for ( sal_uLong n = mpDoc->GetNodes().Count(); --n && !bAttr; ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( n ); - bAttr = pNode->GetCharAttribs().HasAttrib( nWhich ); - } - return bAttr; -} - -TextPaM TextEngine::GetPaM( const Point& rDocPos, sal_Bool bSmart ) -{ - DBG_ASSERT( GetUpdateMode(), "Darf bei Update=sal_False nicht erreicht werden: GetPaM" ); - - long nY = 0; - for ( sal_uLong nPortion = 0; nPortion < mpTEParaPortions->Count(); nPortion++ ) - { - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPortion ); - long nTmpHeight = pPortion->GetLines().size() * mnCharHeight; - nY += nTmpHeight; - if ( nY > rDocPos.Y() ) - { - nY -= nTmpHeight; - Point aPosInPara( rDocPos ); - aPosInPara.Y() -= nY; - - TextPaM aPaM( nPortion, 0 ); - aPaM.GetIndex() = ImpFindIndex( nPortion, aPosInPara, bSmart ); - return aPaM; - } - } - - // Nicht gefunden - Dann den letzten sichtbare... - sal_uLong nLastNode = mpDoc->GetNodes().Count() - 1; - TextNode* pLast = mpDoc->GetNodes().GetObject( nLastNode ); - return TextPaM( nLastNode, pLast->GetText().Len() ); -} - -sal_uInt16 TextEngine::ImpFindIndex( sal_uLong nPortion, const Point& rPosInPara, sal_Bool bSmart ) -{ - DBG_ASSERT( IsFormatted(), "GetPaM: Nicht formatiert" ); - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPortion ); - - sal_uInt16 nCurIndex = 0; - - long nY = 0; - TextLine* pLine = 0; - sal_uInt16 nLine; - for ( nLine = 0; nLine < pPortion->GetLines().size(); nLine++ ) - { - TextLine* pTmpLine = pPortion->GetLines()[ nLine ]; - nY += mnCharHeight; - if ( nY > rPosInPara.Y() ) // das war 'se - { - pLine = pTmpLine; - break; // richtige Y-Position intressiert nicht - } - } - DBG_ASSERT( pLine, "ImpFindIndex: pLine ?" ); - - nCurIndex = GetCharPos( nPortion, nLine, rPosInPara.X(), bSmart ); - - if ( nCurIndex && ( nCurIndex == pLine->GetEnd() ) && - ( pLine != pPortion->GetLines().back() ) ) - { - uno::Reference < i18n::XBreakIterator > xBI = GetBreakIterator(); - sal_Int32 nCount = 1; - nCurIndex = (sal_uInt16)xBI->previousCharacters( pPortion->GetNode()->GetText(), nCurIndex, GetLocale(), i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount ); - } - return nCurIndex; -} - -sal_uInt16 TextEngine::GetCharPos( sal_uLong nPortion, sal_uInt16 nLine, long nXPos, sal_Bool ) -{ - - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPortion ); - TextLine* pLine = pPortion->GetLines()[ nLine ]; - - sal_uInt16 nCurIndex = pLine->GetStart(); - - long nTmpX = pLine->GetStartX(); - if ( nXPos <= nTmpX ) - return nCurIndex; - - for ( sal_uInt16 i = pLine->GetStartPortion(); i <= pLine->GetEndPortion(); i++ ) - { - TETextPortion* pTextPortion = pPortion->GetTextPortions()[ i ]; - nTmpX += pTextPortion->GetWidth(); - - if ( nTmpX > nXPos ) - { - if( pTextPortion->GetLen() > 1 ) - { - nTmpX -= pTextPortion->GetWidth(); // vor die Portion stellen - // Optimieren: Kein GetTextBreak, wenn feste Fontbreite... - Font aFont; - SeekCursor( nPortion, nCurIndex+1, aFont, NULL ); - mpRefDev->SetFont( aFont); - long nPosInPortion = nXPos-nTmpX; - if ( IsRightToLeft() != pTextPortion->IsRightToLeft() ) - nPosInPortion = pTextPortion->GetWidth() - nPosInPortion; - nCurIndex = mpRefDev->GetTextBreak( pPortion->GetNode()->GetText(), nPosInPortion, nCurIndex ); - // MT: GetTextBreak should assure that we are not withing a CTL cell... - } - return nCurIndex; - } - nCurIndex = nCurIndex + pTextPortion->GetLen(); - } - return nCurIndex; -} - - -sal_uLong TextEngine::GetTextHeight() const -{ - DBG_ASSERT( GetUpdateMode(), "Sollte bei Update=sal_False nicht verwendet werden: GetTextHeight" ); - - if ( !IsFormatted() && !IsFormatting() ) - ((TextEngine*)this)->FormatAndUpdate(); - - return mnCurTextHeight; -} - -sal_uLong TextEngine::GetTextHeight( sal_uLong nParagraph ) const -{ - DBG_ASSERT( GetUpdateMode(), "Sollte bei Update=sal_False nicht verwendet werden: GetTextHeight" ); - - if ( !IsFormatted() && !IsFormatting() ) - ((TextEngine*)this)->FormatAndUpdate(); - - return CalcParaHeight( nParagraph ); -} - -sal_uLong TextEngine::CalcTextWidth( sal_uLong nPara ) -{ - sal_uLong nParaWidth = 0; - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPara ); - for ( sal_uInt16 nLine = pPortion->GetLines().size(); nLine; ) - { - sal_uLong nLineWidth = 0; - TextLine* pLine = pPortion->GetLines()[ --nLine ]; - for ( sal_uInt16 nTP = pLine->GetStartPortion(); nTP <= pLine->GetEndPortion(); nTP++ ) - { - TETextPortion* pTextPortion = pPortion->GetTextPortions()[ nTP ]; - nLineWidth += pTextPortion->GetWidth(); - } - if ( nLineWidth > nParaWidth ) - nParaWidth = nLineWidth; - } - return nParaWidth; -} - -sal_uLong TextEngine::CalcTextWidth() -{ - if ( !IsFormatted() && !IsFormatting() ) - FormatAndUpdate(); - - if ( mnCurTextWidth == 0xFFFFFFFF ) - { - mnCurTextWidth = 0; - for ( sal_uLong nPara = mpTEParaPortions->Count(); nPara; ) - { - sal_uLong nParaWidth = CalcTextWidth( --nPara ); - if ( nParaWidth > mnCurTextWidth ) - mnCurTextWidth = nParaWidth; - } - } - return mnCurTextWidth+1;// Ein breiter, da in CreateLines bei >= umgebrochen wird. -} - -sal_uLong TextEngine::CalcTextHeight() -{ - DBG_ASSERT( GetUpdateMode(), "Sollte bei Update=sal_False nicht verwendet werden: CalcTextHeight" ); - - sal_uLong nY = 0; - for ( sal_uLong nPortion = mpTEParaPortions->Count(); nPortion; ) - nY += CalcParaHeight( --nPortion ); - return nY; -} - -sal_uLong TextEngine::CalcTextWidth( sal_uLong nPara, sal_uInt16 nPortionStart, sal_uInt16 nLen, const Font* pFont ) -{ - // Innerhalb des Textes darf es keinen Portionwechsel (Attribut/Tab) geben! - DBG_ASSERT( mpDoc->GetNodes().GetObject( nPara )->GetText().Search( '\t', nPortionStart ) >= (nPortionStart+nLen), "CalcTextWidth: Tab!" ); - - sal_uLong nWidth; - if ( mnFixCharWidth100 ) - { - nWidth = (sal_uLong)nLen*mnFixCharWidth100/100; - } - else - { - if ( pFont ) - { - if ( !mpRefDev->GetFont().IsSameInstance( *pFont ) ) - mpRefDev->SetFont( *pFont ); - } - else - { - Font aFont; - SeekCursor( nPara, nPortionStart+1, aFont, NULL ); - mpRefDev->SetFont( aFont ); - } - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - nWidth = (sal_uLong)mpRefDev->GetTextWidth( pNode->GetText(), nPortionStart, nLen ); - - } - return nWidth; -} - - -sal_uInt16 TextEngine::GetLineCount( sal_uLong nParagraph ) const -{ - DBG_ASSERT( nParagraph < mpTEParaPortions->Count(), "GetLineCount: Out of range" ); - - TEParaPortion* pPPortion = mpTEParaPortions->GetObject( nParagraph ); - if ( pPPortion ) - return pPPortion->GetLines().size(); - - return 0xFFFF; -} - -sal_uInt16 TextEngine::GetLineLen( sal_uLong nParagraph, sal_uInt16 nLine ) const -{ - DBG_ASSERT( nParagraph < mpTEParaPortions->Count(), "GetLineCount: Out of range" ); - - TEParaPortion* pPPortion = mpTEParaPortions->GetObject( nParagraph ); - if ( pPPortion && ( nLine < pPPortion->GetLines().size() ) ) - { - TextLine* pLine = pPPortion->GetLines()[ nLine ]; - return pLine->GetLen(); - } - - return 0xFFFF; -} - -sal_uLong TextEngine::CalcParaHeight( sal_uLong nParagraph ) const -{ - sal_uLong nHeight = 0; - - TEParaPortion* pPPortion = mpTEParaPortions->GetObject( nParagraph ); - DBG_ASSERT( pPPortion, "Absatz nicht gefunden: GetParaHeight" ); - if ( pPPortion ) - nHeight = pPPortion->GetLines().size() * mnCharHeight; - - return nHeight; -} - -void TextEngine::UpdateSelections() -{ -} - -Range TextEngine::GetInvalidYOffsets( sal_uLong nPortion ) -{ - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPortion ); - sal_uInt16 nLines = pTEParaPortion->GetLines().size(); - sal_uInt16 nLastInvalid, nFirstInvalid = 0; - sal_uInt16 nLine; - for ( nLine = 0; nLine < nLines; nLine++ ) - { - TextLine* pL = pTEParaPortion->GetLines()[ nLine ]; - if ( pL->IsInvalid() ) - { - nFirstInvalid = nLine; - break; - } - } - - for ( nLastInvalid = nFirstInvalid; nLastInvalid < nLines; nLastInvalid++ ) - { - TextLine* pL = pTEParaPortion->GetLines()[ nLine ]; - if ( pL->IsValid() ) - break; - } - - if ( nLastInvalid >= nLines ) - nLastInvalid = nLines-1; - - return Range( nFirstInvalid*mnCharHeight, ((nLastInvalid+1)*mnCharHeight)-1 ); -} - -sal_uLong TextEngine::GetParagraphCount() const -{ - return mpDoc->GetNodes().Count(); -} - -void TextEngine::EnableUndo( sal_Bool bEnable ) -{ - // Beim Umschalten des Modus Liste loeschen: - if ( bEnable != IsUndoEnabled() ) - ResetUndo(); - - mbUndoEnabled = bEnable; -} - -::svl::IUndoManager& TextEngine::GetUndoManager() -{ - if ( !mpUndoManager ) - mpUndoManager = new TextUndoManager( this ); - return *mpUndoManager; -} - -void TextEngine::UndoActionStart( sal_uInt16 nId ) -{ - if ( IsUndoEnabled() && !IsInUndo() ) - { - String aComment; - // ... - GetUndoManager().EnterListAction( aComment, XubString(), nId ); - } -} - -void TextEngine::UndoActionEnd() -{ - if ( IsUndoEnabled() && !IsInUndo() ) - GetUndoManager().LeaveListAction(); -} - -void TextEngine::InsertUndo( TextUndo* pUndo, sal_Bool bTryMerge ) -{ - DBG_ASSERT( !IsInUndo(), "InsertUndo im Undomodus!" ); - GetUndoManager().AddUndoAction( pUndo, bTryMerge ); -} - -void TextEngine::ResetUndo() -{ - if ( mpUndoManager ) - mpUndoManager->Clear(); -} - -void TextEngine::InsertContent( TextNode* pNode, sal_uLong nPara ) -{ - DBG_ASSERT( pNode, "NULL-Pointer in InsertContent! " ); - DBG_ASSERT( IsInUndo(), "InsertContent nur fuer Undo()!" ); - TEParaPortion* pNew = new TEParaPortion( pNode ); - mpTEParaPortions->Insert( pNew, nPara ); - mpDoc->GetNodes().Insert( pNode, nPara ); - ImpParagraphInserted( nPara ); -} - -TextPaM TextEngine::SplitContent( sal_uLong nNode, sal_uInt16 nSepPos ) -{ - #ifdef DBG_UTIL - TextNode* pNode = mpDoc->GetNodes().GetObject( nNode ); - DBG_ASSERT( pNode, "Ungueltiger Node in SplitContent" ); - DBG_ASSERT( IsInUndo(), "SplitContent nur fuer Undo()!" ); - DBG_ASSERT( nSepPos <= pNode->GetText().Len(), "Index im Wald: SplitContent" ); - #endif - TextPaM aPaM( nNode, nSepPos ); - return ImpInsertParaBreak( aPaM ); -} - -TextPaM TextEngine::ConnectContents( sal_uLong nLeftNode ) -{ - DBG_ASSERT( IsInUndo(), "ConnectContent nur fuer Undo()!" ); - return ImpConnectParagraphs( nLeftNode, nLeftNode+1 ); -} - -void TextEngine::SeekCursor( sal_uLong nPara, sal_uInt16 nPos, Font& rFont, OutputDevice* pOutDev ) -{ - rFont = maFont; - if ( pOutDev ) - pOutDev->SetTextColor( maTextColor ); - - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - sal_uInt16 nAttribs = pNode->GetCharAttribs().Count(); - for ( sal_uInt16 nAttr = 0; nAttr < nAttribs; nAttr++ ) - { - TextCharAttrib* pAttrib = pNode->GetCharAttribs().GetAttrib( nAttr ); - if ( pAttrib->GetStart() > nPos ) - break; - - // Beim Seeken nicht die Attr beruecksichtigen, die dort beginnen! - // Leere Attribute werden beruecksichtigt( verwendet), da diese - // gerade eingestellt wurden. - // 12.4.95: Doch keine Leeren Attribute verwenden: - // - Wenn gerade eingestellt und leer => keine Auswirkung auf Font - // In einem leeren Absatz eingestellte Zeichen werden sofort wirksam. - if ( ( ( pAttrib->GetStart() < nPos ) && ( pAttrib->GetEnd() >= nPos ) ) - || !pNode->GetText().Len() ) - { - if ( pAttrib->Which() != TEXTATTR_FONTCOLOR ) - { - pAttrib->GetAttr().SetFont(rFont); - } - else - { - if ( pOutDev ) - pOutDev->SetTextColor( ((TextAttribFontColor&)pAttrib->GetAttr()).GetColor() ); - } - } - } - - if ( mpIMEInfos && mpIMEInfos->pAttribs && ( mpIMEInfos->aPos.GetPara() == nPara ) && - ( nPos > mpIMEInfos->aPos.GetIndex() ) && ( nPos <= ( mpIMEInfos->aPos.GetIndex() + mpIMEInfos->nLen ) ) ) - { - sal_uInt16 nAttr = mpIMEInfos->pAttribs[ nPos - mpIMEInfos->aPos.GetIndex() - 1 ]; - if ( nAttr & EXTTEXTINPUT_ATTR_UNDERLINE ) - rFont.SetUnderline( UNDERLINE_SINGLE ); - else if ( nAttr & EXTTEXTINPUT_ATTR_BOLDUNDERLINE ) - rFont.SetUnderline( UNDERLINE_BOLD ); - else if ( nAttr & EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE ) - rFont.SetUnderline( UNDERLINE_DOTTED ); - else if ( nAttr & EXTTEXTINPUT_ATTR_DASHDOTUNDERLINE ) - rFont.SetUnderline( UNDERLINE_DOTTED ); - if ( nAttr & EXTTEXTINPUT_ATTR_REDTEXT ) - rFont.SetColor( Color( COL_RED ) ); - else if ( nAttr & EXTTEXTINPUT_ATTR_HALFTONETEXT ) - rFont.SetColor( Color( COL_LIGHTGRAY ) ); - if ( nAttr & EXTTEXTINPUT_ATTR_HIGHLIGHT ) - { - const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); - rFont.SetColor( rStyleSettings.GetHighlightTextColor() ); - rFont.SetFillColor( rStyleSettings.GetHighlightColor() ); - rFont.SetTransparent( sal_False ); - } - else if ( nAttr & EXTTEXTINPUT_ATTR_GRAYWAVELINE ) - { - rFont.SetUnderline( UNDERLINE_WAVE ); -// if( pOut ) -// pOut->SetTextLineColor( Color( COL_LIGHTGRAY ) ); - } - } -} - -void TextEngine::FormatAndUpdate( TextView* pCurView ) -{ - if ( mbDowning ) - return ; - - if ( IsInUndo() ) - IdleFormatAndUpdate( pCurView ); - else - { - FormatDoc(); - UpdateViews( pCurView ); - } -} - - -void TextEngine::IdleFormatAndUpdate( TextView* pCurView, sal_uInt16 nMaxTimerRestarts ) -{ - mpIdleFormatter->DoIdleFormat( pCurView, nMaxTimerRestarts ); -} - -void TextEngine::TextModified() -{ - mbFormatted = sal_False; - mbModified = sal_True; -} - -void TextEngine::UpdateViews( TextView* pCurView ) -{ - if ( !GetUpdateMode() || IsFormatting() || maInvalidRec.IsEmpty() ) - return; - - DBG_ASSERT( IsFormatted(), "UpdateViews: Doc nicht formatiert!" ); - - for ( sal_uInt16 nView = 0; nView < mpViews->size(); nView++ ) - { - TextView* pView = (*mpViews)[ nView ]; - pView->HideCursor(); - - Rectangle aClipRec( maInvalidRec ); - Size aOutSz = pView->GetWindow()->GetOutputSizePixel(); - Rectangle aVisArea( pView->GetStartDocPos(), aOutSz ); - aClipRec.Intersection( aVisArea ); - if ( !aClipRec.IsEmpty() ) - { - // in Fensterkoordinaten umwandeln.... - Point aNewPos = pView->GetWindowPos( aClipRec.TopLeft() ); - if ( IsRightToLeft() ) - aNewPos.X() -= aOutSz.Width() - 1; - aClipRec.SetPos( aNewPos ); - - if ( pView == pCurView ) - pView->ImpPaint( aClipRec, !pView->GetWindow()->IsPaintTransparent() ); - else - pView->GetWindow()->Invalidate( aClipRec ); - } - } - - if ( pCurView ) - { - pCurView->ShowCursor( pCurView->IsAutoScroll() ); - } - - maInvalidRec = Rectangle(); -} - -IMPL_LINK_NOARG(TextEngine, IdleFormatHdl) -{ - FormatAndUpdate( mpIdleFormatter->GetView() ); - return 0; -} - -void TextEngine::CheckIdleFormatter() -{ - mpIdleFormatter->ForceTimeout(); -} - -void TextEngine::FormatFullDoc() -{ - for ( sal_uLong nPortion = 0; nPortion < mpTEParaPortions->Count(); nPortion++ ) - { - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPortion ); sal_uInt16 nLen = pTEParaPortion->GetNode()->GetText().Len(); - pTEParaPortion->MarkSelectionInvalid( 0, nLen ); - } - mbFormatted = sal_False; - FormatDoc(); -} - -void TextEngine::FormatDoc() -{ - if ( IsFormatted() || !GetUpdateMode() || IsFormatting() ) - return; - - mbIsFormatting = sal_True; - mbHasMultiLineParas = sal_False; - - long nY = 0; - sal_Bool bGrow = sal_False; - - maInvalidRec = Rectangle(); // leermachen - for ( sal_uLong nPara = 0; nPara < mpTEParaPortions->Count(); nPara++ ) - { - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - if ( pTEParaPortion->IsInvalid() ) - { - sal_uLong nOldParaWidth = 0xFFFFFFFF; - if ( mnCurTextWidth != 0xFFFFFFFF ) - nOldParaWidth = CalcTextWidth( nPara ); - - ImpFormattingParagraph( nPara ); - - if ( CreateLines( nPara ) ) - bGrow = sal_True; - - // InvalidRec nur einmal setzen... - if ( maInvalidRec.IsEmpty() ) - { - // Bei Paperwidth 0 (AutoPageSize) bleibt es sonst Empty()... - long nWidth = (long)mnMaxTextWidth; - if ( !nWidth ) - nWidth = 0x7FFFFFFF; - Range aInvRange( GetInvalidYOffsets( nPara ) ); - maInvalidRec = Rectangle( Point( 0, nY+aInvRange.Min() ), - Size( nWidth, aInvRange.Len() ) ); - } - else - { - maInvalidRec.Bottom() = nY + CalcParaHeight( nPara ); - } - - if ( mnCurTextWidth != 0xFFFFFFFF ) - { - sal_uLong nNewParaWidth = CalcTextWidth( nPara ); - if ( nNewParaWidth >= mnCurTextWidth ) - mnCurTextWidth = nNewParaWidth; - else if ( ( nOldParaWidth != 0xFFFFFFFF ) && ( nOldParaWidth >= mnCurTextWidth ) ) - mnCurTextWidth = 0xFFFFFFFF; - } - } - else if ( bGrow ) - { - maInvalidRec.Bottom() = nY + CalcParaHeight( nPara ); - } - nY += CalcParaHeight( nPara ); - if ( !mbHasMultiLineParas && pTEParaPortion->GetLines().size() > 1 ) - mbHasMultiLineParas = sal_True; - } - - if ( !maInvalidRec.IsEmpty() ) - { - sal_uLong nNewHeight = CalcTextHeight(); - long nDiff = nNewHeight - mnCurTextHeight; - if ( nNewHeight < mnCurTextHeight ) - { - maInvalidRec.Bottom() = (long)Max( nNewHeight, mnCurTextHeight ); - if ( maInvalidRec.IsEmpty() ) - { - maInvalidRec.Top() = 0; - // Left und Right werden nicht ausgewertet, aber wegen IsEmpty gesetzt. - maInvalidRec.Left() = 0; - maInvalidRec.Right() = mnMaxTextWidth; - } - } - - mnCurTextHeight = nNewHeight; - if ( nDiff ) - { - mbFormatted = sal_True; - ImpTextHeightChanged(); - } - } - - mbIsFormatting = sal_False; - mbFormatted = sal_True; - - ImpTextFormatted(); -} - -void TextEngine::CreateAndInsertEmptyLine( sal_uLong nPara ) -{ - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - - TextLine* pTmpLine = new TextLine; - pTmpLine->SetStart( pNode->GetText().Len() ); - pTmpLine->SetEnd( pTmpLine->GetStart() ); - pTEParaPortion->GetLines().push_back( pTmpLine ); - - if ( ImpGetAlign() == TXTALIGN_CENTER ) - pTmpLine->SetStartX( (short)(mnMaxTextWidth / 2) ); - else if ( ImpGetAlign() == TXTALIGN_RIGHT ) - pTmpLine->SetStartX( (short)mnMaxTextWidth ); - else - pTmpLine->SetStartX( mpDoc->GetLeftMargin() ); - - sal_Bool bLineBreak = pNode->GetText().Len() ? sal_True : sal_False; - - TETextPortion* pDummyPortion = new TETextPortion( 0 ); - pDummyPortion->GetWidth() = 0; - pTEParaPortion->GetTextPortions().push_back( pDummyPortion ); - - if ( bLineBreak == sal_True ) - { - // -2: The new one is already inserted. - OSL_ENSURE( - pTEParaPortion->GetLines()[pTEParaPortion->GetLines().size()-2], - "Soft Break, no Line?!"); - sal_uInt16 nPos = (sal_uInt16) pTEParaPortion->GetTextPortions().size() - 1 ; - pTmpLine->SetStartPortion( nPos ); - pTmpLine->SetEndPortion( nPos ); - } -} - -void TextEngine::ImpBreakLine( sal_uLong nPara, TextLine* pLine, TETextPortion*, sal_uInt16 nPortionStart, long nRemainingWidth ) -{ - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - - // Font sollte noch eingestellt sein. - sal_uInt16 nMaxBreakPos = mpRefDev->GetTextBreak( pNode->GetText(), nRemainingWidth, nPortionStart ); - - DBG_ASSERT( nMaxBreakPos < pNode->GetText().Len(), "Break?!" ); - - if ( nMaxBreakPos == STRING_LEN ) // GetTextBreak() ist anderer Auffassung als GetTextSize() - nMaxBreakPos = pNode->GetText().Len() - 1; - - uno::Reference < i18n::XBreakIterator > xBI = GetBreakIterator(); - i18n::LineBreakHyphenationOptions aHyphOptions( NULL, uno::Sequence< beans::PropertyValue >(), 1 ); - - i18n::LineBreakUserOptions aUserOptions; - aUserOptions.forbiddenBeginCharacters = ImpGetLocaleDataWrapper()->getForbiddenCharacters().beginLine; - aUserOptions.forbiddenEndCharacters = ImpGetLocaleDataWrapper()->getForbiddenCharacters().endLine; - aUserOptions.applyForbiddenRules = sal_True; - aUserOptions.allowPunctuationOutsideMargin = sal_False; - aUserOptions.allowHyphenateEnglish = sal_False; - - static const com::sun::star::lang::Locale aDefLocale; - i18n::LineBreakResults aLBR = xBI->getLineBreak( pNode->GetText(), nMaxBreakPos, aDefLocale, pLine->GetStart(), aHyphOptions, aUserOptions ); - sal_uInt16 nBreakPos = (sal_uInt16)aLBR.breakIndex; - if ( nBreakPos <= pLine->GetStart() ) - { - nBreakPos = nMaxBreakPos; - if ( nBreakPos <= pLine->GetStart() ) - nBreakPos = pLine->GetStart() + 1; // Sonst Endlosschleife! - } - - - // die angeknackste Portion ist die End-Portion - pLine->SetEnd( nBreakPos ); - sal_uInt16 nEndPortion = SplitTextPortion( nPara, nBreakPos ); - - sal_Bool bBlankSeparator = ( ( nBreakPos >= pLine->GetStart() ) && - ( pNode->GetText().GetChar( nBreakPos ) == ' ' ) ) ? sal_True : sal_False; - if ( bBlankSeparator ) - { - // Blanks am Zeilenende generell unterdruecken... - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - TETextPortion* pTP = pTEParaPortion->GetTextPortions()[ nEndPortion ]; - DBG_ASSERT( nBreakPos > pLine->GetStart(), "SplitTextPortion am Anfang der Zeile?" ); - pTP->GetWidth() = (long)CalcTextWidth( nPara, nBreakPos-pTP->GetLen(), pTP->GetLen()-1 ); - } - pLine->SetEndPortion( nEndPortion ); -} - -sal_uInt16 TextEngine::SplitTextPortion( sal_uLong nPara, sal_uInt16 nPos ) -{ - - // Die Portion bei nPos wird geplittet, wenn bei nPos nicht - // sowieso ein Wechsel ist - if ( nPos == 0 ) - return 0; - - sal_uInt16 nSplitPortion; - sal_uInt16 nTmpPos = 0; - TETextPortion* pTextPortion = 0; - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - sal_uInt16 nPortions = pTEParaPortion->GetTextPortions().size(); - for ( nSplitPortion = 0; nSplitPortion < nPortions; nSplitPortion++ ) - { - TETextPortion* pTP = pTEParaPortion->GetTextPortions()[nSplitPortion]; - nTmpPos = nTmpPos + pTP->GetLen(); - if ( nTmpPos >= nPos ) - { - if ( nTmpPos == nPos ) // dann braucht nichts geteilt werden - return nSplitPortion; - pTextPortion = pTP; - break; - } - } - - DBG_ASSERT( pTextPortion, "Position ausserhalb des Bereichs!" ); - - sal_uInt16 nOverlapp = nTmpPos - nPos; - pTextPortion->GetLen() = pTextPortion->GetLen() - nOverlapp; - TETextPortion* pNewPortion = new TETextPortion( nOverlapp ); - pTEParaPortion->GetTextPortions().insert( pTEParaPortion->GetTextPortions().begin() + nSplitPortion + 1, pNewPortion ); - pTextPortion->GetWidth() = (long)CalcTextWidth( nPara, nPos-pTextPortion->GetLen(), pTextPortion->GetLen() ); - - return nSplitPortion; -} - -void TextEngine::CreateTextPortions( sal_uLong nPara, sal_uInt16 nStartPos ) -{ - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - TextNode* pNode = pTEParaPortion->GetNode(); - DBG_ASSERT( pNode->GetText().Len(), "CreateTextPortions sollte nicht fuer leere Absaetze verwendet werden!" ); - - std::set<sal_uInt16> aPositions; - std::set<sal_uInt16>::iterator aPositionsIt; - aPositions.insert(0); - - sal_uInt16 nAttribs = pNode->GetCharAttribs().Count(); - for ( sal_uInt16 nAttr = 0; nAttr < nAttribs; nAttr++ ) - { - TextCharAttrib* pAttrib = pNode->GetCharAttribs().GetAttrib( nAttr ); - - aPositions.insert( pAttrib->GetStart() ); - aPositions.insert( pAttrib->GetEnd() ); - } - aPositions.insert( pNode->GetText().Len() ); - - const std::vector<TEWritingDirectionInfo>& rWritingDirections = pTEParaPortion->GetWritingDirectionInfos(); - for ( std::vector<TEWritingDirectionInfo>::const_iterator it = rWritingDirections.begin(); it != rWritingDirections.end(); ++it ) - aPositions.insert( (*it).nStartPos ); - - if ( mpIMEInfos && mpIMEInfos->pAttribs && ( mpIMEInfos->aPos.GetPara() == nPara ) ) - { - sal_uInt16 nLastAttr = 0xFFFF; - for( sal_uInt16 n = 0; n < mpIMEInfos->nLen; n++ ) - { - if ( mpIMEInfos->pAttribs[n] != nLastAttr ) - { - aPositions.insert( mpIMEInfos->aPos.GetIndex() + n ); - nLastAttr = mpIMEInfos->pAttribs[n]; - } - } - } - - sal_uInt16 nTabPos = pNode->GetText().Search( '\t', 0 ); - while ( nTabPos != STRING_NOTFOUND ) - { - aPositions.insert( nTabPos ); - aPositions.insert( nTabPos + 1 ); - nTabPos = pNode->GetText().Search( '\t', nTabPos+1 ); - } - - // Ab ... loeschen: - // Leider muss die Anzahl der TextPortions mit aPositions.Count() - // nicht uebereinstimmen, da evtl. Zeilenumbrueche... - sal_uInt16 nPortionStart = 0; - sal_uInt16 nInvPortion = 0; - sal_uInt16 nP; - for ( nP = 0; nP < pTEParaPortion->GetTextPortions().size(); nP++ ) - { - TETextPortion* pTmpPortion = pTEParaPortion->GetTextPortions()[nP]; - nPortionStart = nPortionStart + pTmpPortion->GetLen(); - if ( nPortionStart >= nStartPos ) - { - nPortionStart = nPortionStart - pTmpPortion->GetLen(); - nInvPortion = nP; - break; - } - } - OSL_ENSURE(nP < pTEParaPortion->GetTextPortions().size() - || pTEParaPortion->GetTextPortions().empty(), - "Nothing to delete: CreateTextPortions"); - if ( nInvPortion && ( nPortionStart+pTEParaPortion->GetTextPortions()[nInvPortion]->GetLen() > nStartPos ) ) - { - // lieber eine davor... - // Aber nur wenn es mitten in der Portion war, sonst ist es evtl. - // die einzige in der Zeile davor ! - nInvPortion--; - nPortionStart = nPortionStart - pTEParaPortion->GetTextPortions()[nInvPortion]->GetLen(); - } - pTEParaPortion->GetTextPortions().DeleteFromPortion( nInvPortion ); - - // Eine Portion kann auch durch einen Zeilenumbruch entstanden sein: - aPositions.insert( nPortionStart ); - - aPositionsIt = aPositions.find( nPortionStart ); - DBG_ASSERT( aPositionsIt != aPositions.end(), "nPortionStart not found" ); - - if ( aPositionsIt != aPositions.end() ) - { - std::set<sal_uInt16>::iterator nextIt = aPositionsIt; - for ( ++nextIt; nextIt != aPositions.end(); ++aPositionsIt, ++nextIt ) - { - TETextPortion* pNew = new TETextPortion( *nextIt - *aPositionsIt ); - pTEParaPortion->GetTextPortions().push_back( pNew ); - } - } - OSL_ENSURE(pTEParaPortion->GetTextPortions().size(), "No Portions?!"); -} - -void TextEngine::RecalcTextPortion( sal_uLong nPara, sal_uInt16 nStartPos, short nNewChars ) -{ - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - OSL_ENSURE(pTEParaPortion->GetTextPortions().size(), "no Portions!"); - OSL_ENSURE(nNewChars, "RecalcTextPortion with Diff == 0"); - - TextNode* const pNode = pTEParaPortion->GetNode(); - if ( nNewChars > 0 ) - { - // Wenn an nStartPos ein Attribut beginnt/endet, oder vor nStartPos - // ein Tab steht, faengt eine neue Portion an, - // ansonsten wird die Portion an nStartPos erweitert. - // Oder wenn ganz vorne ( StartPos 0 ) und dann ein Tab - - if ( ( pNode->GetCharAttribs().HasBoundingAttrib( nStartPos ) ) || - ( nStartPos && ( pNode->GetText().GetChar( nStartPos - 1 ) == '\t' ) ) || - ( ( !nStartPos && ( nNewChars < pNode->GetText().Len() ) && pNode->GetText().GetChar( nNewChars ) == '\t' ) ) ) - { - sal_uInt16 nNewPortionPos = 0; - if ( nStartPos ) - nNewPortionPos = SplitTextPortion( nPara, nStartPos ) + 1; - - // Eine leere Portion kann hier stehen, wenn der Absatz leer war, - // oder eine Zeile durch einen harten Zeilenumbruch entstanden ist. - if ( ( nNewPortionPos < pTEParaPortion->GetTextPortions().size() ) && - !pTEParaPortion->GetTextPortions()[nNewPortionPos]->GetLen() ) - { - // Dann die leere Portion verwenden. - sal_uInt16 & r = - pTEParaPortion->GetTextPortions()[nNewPortionPos]->GetLen(); - r = r + nNewChars; - } - else - { - TETextPortion* pNewPortion = new TETextPortion( nNewChars ); - pTEParaPortion->GetTextPortions().insert( pTEParaPortion->GetTextPortions().begin() + nNewPortionPos, pNewPortion ); - } - } - else - { - sal_uInt16 nPortionStart; - const sal_uInt16 nTP = pTEParaPortion->GetTextPortions(). - FindPortion( nStartPos, nPortionStart ); - TETextPortion* const pTP = pTEParaPortion->GetTextPortions()[ nTP ]; - DBG_ASSERT( pTP, "RecalcTextPortion: Portion nicht gefunden" ); - pTP->GetLen() = pTP->GetLen() + nNewChars; - pTP->GetWidth() = (-1); - } - } - else - { - // Portion schrumpfen oder ggf. entfernen. - // Vor Aufruf dieser Methode muss sichergestellt sein, dass - // keine Portions in dem geloeschten Bereich lagen! - - // Es darf keine reinragende oder im Bereich startende Portion geben, - // also muss nStartPos <= nPos <= nStartPos - nNewChars(neg.) sein - sal_uInt16 nPortion = 0; - sal_uInt16 nPos = 0; - sal_uInt16 nEnd = nStartPos-nNewChars; - sal_uInt16 nPortions = pTEParaPortion->GetTextPortions().size(); - TETextPortion* pTP = 0; - for ( nPortion = 0; nPortion < nPortions; nPortion++ ) - { - pTP = pTEParaPortion->GetTextPortions()[ nPortion ]; - if ( ( nPos+pTP->GetLen() ) > nStartPos ) - { - DBG_ASSERT( nPos <= nStartPos, "Start falsch!" ); - DBG_ASSERT( nPos+pTP->GetLen() >= nEnd, "End falsch!" ); - break; - } - nPos = nPos + pTP->GetLen(); - } - DBG_ASSERT( pTP, "RecalcTextPortion: Portion nicht gefunden" ); - if ( ( nPos == nStartPos ) && ( (nPos+pTP->GetLen()) == nEnd ) ) - { - // Portion entfernen; - pTEParaPortion->GetTextPortions().erase( pTEParaPortion->GetTextPortions().begin() + nPortion ); - delete pTP; - } - else - { - DBG_ASSERT( pTP->GetLen() > (-nNewChars), "Portion zu klein zum schrumpfen!" ); - pTP->GetLen() = pTP->GetLen() + nNewChars; - } - OSL_ENSURE( pTEParaPortion->GetTextPortions().size(), - "RecalcTextPortions: none are left!" ); - } -} - -void TextEngine::ImpPaint( OutputDevice* pOutDev, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange, TextSelection const* pSelection ) -{ - if ( !GetUpdateMode() ) - return; - - if ( !IsFormatted() ) - FormatDoc(); - - bool bTransparent = false; - Window* pOutWin = dynamic_cast<Window*>(pOutDev); - bTransparent = (pOutWin && pOutWin->IsPaintTransparent()); - - long nY = rStartPos.Y(); - - TextPaM const* pSelStart = 0; - TextPaM const* pSelEnd = 0; - if ( pSelection && pSelection->HasRange() ) - { - sal_Bool bInvers = pSelection->GetEnd() < pSelection->GetStart(); - pSelStart = !bInvers ? &pSelection->GetStart() : &pSelection->GetEnd(); - pSelEnd = bInvers ? &pSelection->GetStart() : &pSelection->GetEnd(); - } - DBG_ASSERT( !pPaintRange || ( pPaintRange->GetStart() < pPaintRange->GetEnd() ), "ImpPaint: Paint-Range?!" ); - - const StyleSettings& rStyleSettings = pOutDev->GetSettings().GetStyleSettings(); - - // -------------------------------------------------- - // Ueber alle Absaetze... - // -------------------------------------------------- - for ( sal_uLong nPara = 0; nPara < mpTEParaPortions->Count(); nPara++ ) - { - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPara ); - // falls beim Tippen Idle-Formatierung, asynchrones Paint. - if ( pPortion->IsInvalid() ) - return; - - sal_uLong nParaHeight = CalcParaHeight( nPara ); - if ( ( !pPaintArea || ( ( nY + (long)nParaHeight ) > pPaintArea->Top() ) ) - && ( !pPaintRange || ( ( nPara >= pPaintRange->GetStart().GetPara() ) && ( nPara <= pPaintRange->GetEnd().GetPara() ) ) ) ) - { - // -------------------------------------------------- - // Ueber die Zeilen des Absatzes... - // -------------------------------------------------- - sal_uInt16 nLines = pPortion->GetLines().size(); - sal_uInt16 nIndex = 0; - for ( sal_uInt16 nLine = 0; nLine < nLines; nLine++ ) - { - TextLine* pLine = pPortion->GetLines()[nLine]; - Point aTmpPos( rStartPos.X() + pLine->GetStartX(), nY ); - - if ( ( !pPaintArea || ( ( nY + mnCharHeight ) > pPaintArea->Top() ) ) - && ( !pPaintRange || ( - ( TextPaM( nPara, pLine->GetStart() ) < pPaintRange->GetEnd() ) && - ( TextPaM( nPara, pLine->GetEnd() ) > pPaintRange->GetStart() ) ) ) ) - { - // -------------------------------------------------- - // Ueber die Portions der Zeile... - // -------------------------------------------------- - nIndex = pLine->GetStart(); - for ( sal_uInt16 y = pLine->GetStartPortion(); y <= pLine->GetEndPortion(); y++ ) - { - OSL_ENSURE(pPortion->GetTextPortions().size(), - "Line without Textportion in Paint!"); - TETextPortion* pTextPortion = pPortion->GetTextPortions()[ y ]; - DBG_ASSERT( pTextPortion, "NULL-Pointer im Portioniterator in UpdateViews" ); - - ImpInitLayoutMode( pOutDev /*, pTextPortion->IsRightToLeft() */); - - long nTxtWidth = pTextPortion->GetWidth(); - aTmpPos.X() = rStartPos.X() + ImpGetOutputOffset( nPara, pLine, nIndex, nIndex ); - - // nur ausgeben, was im sichtbaren Bereich beginnt: - if ( ( ( aTmpPos.X() + nTxtWidth ) >= 0 ) - && ( !pPaintRange || ( - ( TextPaM( nPara, nIndex ) < pPaintRange->GetEnd() ) && - ( TextPaM( nPara, nIndex + pTextPortion->GetLen() ) > pPaintRange->GetStart() ) ) ) ) - { - switch ( pTextPortion->GetKind() ) - { - case PORTIONKIND_TEXT: - { - { - Font aFont; - SeekCursor( nPara, nIndex+1, aFont, pOutDev ); - if( bTransparent ) - aFont.SetTransparent( sal_True ); - else if ( pSelection ) - aFont.SetTransparent( sal_False ); - pOutDev->SetFont( aFont ); - - sal_uInt16 nTmpIndex = nIndex; - sal_uInt16 nEnd = nTmpIndex + pTextPortion->GetLen(); - Point aPos = aTmpPos; - if ( pPaintRange ) - { - // evtl soll nicht alles ausgegeben werden... - if ( ( pPaintRange->GetStart().GetPara() == nPara ) - && ( nTmpIndex < pPaintRange->GetStart().GetIndex() ) ) - { - nTmpIndex = pPaintRange->GetStart().GetIndex(); - } - if ( ( pPaintRange->GetEnd().GetPara() == nPara ) - && ( nEnd > pPaintRange->GetEnd().GetIndex() ) ) - { - nEnd = pPaintRange->GetEnd().GetIndex(); - } - } - - sal_Bool bDone = sal_False; - if ( pSelStart ) - { - // liegt ein Teil in der Selektion??? - TextPaM aTextStart( nPara, nTmpIndex ); - TextPaM aTextEnd( nPara, nEnd ); - if ( ( aTextStart < *pSelEnd ) && ( aTextEnd > *pSelStart ) ) - { - sal_uInt16 nL; - - // 1) Bereich vor Selektion - if ( aTextStart < *pSelStart ) - { - nL = pSelStart->GetIndex() - nTmpIndex; - pOutDev->SetFont( aFont); - aPos.X() = rStartPos.X() + ImpGetOutputOffset( nPara, pLine, nTmpIndex, nTmpIndex+nL ); - pOutDev->DrawText( aPos, pPortion->GetNode()->GetText(), nTmpIndex, nL ); - nTmpIndex = nTmpIndex + nL; - - } - // 2) Bereich mit Selektion - nL = nEnd-nTmpIndex; - if ( aTextEnd > *pSelEnd ) - nL = pSelEnd->GetIndex() - nTmpIndex; - if ( nL ) - { - Color aOldTextColor = pOutDev->GetTextColor(); - pOutDev->SetTextColor( rStyleSettings.GetHighlightTextColor() ); - pOutDev->SetTextFillColor( rStyleSettings.GetHighlightColor() ); - aPos.X() = rStartPos.X() + ImpGetOutputOffset( nPara, pLine, nTmpIndex, nTmpIndex+nL ); - pOutDev->DrawText( aPos, pPortion->GetNode()->GetText(), nTmpIndex, nL ); - pOutDev->SetTextColor( aOldTextColor ); - pOutDev->SetTextFillColor(); - nTmpIndex = nTmpIndex + nL; - } - - // 3) Bereich nach Selektion - if ( nTmpIndex < nEnd ) - { - nL = nEnd-nTmpIndex; - aPos.X() = rStartPos.X() + ImpGetOutputOffset( nPara, pLine, nTmpIndex, nTmpIndex+nL ); - pOutDev->DrawText( aPos, pPortion->GetNode()->GetText(), nTmpIndex, nEnd-nTmpIndex ); - } - bDone = sal_True; - } - } - if ( !bDone ) - { - aPos.X() = rStartPos.X() + ImpGetOutputOffset( nPara, pLine, nTmpIndex, nEnd ); - pOutDev->DrawText( aPos, pPortion->GetNode()->GetText(), nTmpIndex, nEnd-nTmpIndex ); - } - } - - } - break; - case PORTIONKIND_TAB: - { - // Bei HideSelection() nur Range, pSelection = 0. - if ( pSelStart || pPaintRange ) - { - Rectangle aTabArea( aTmpPos, Point( aTmpPos.X()+nTxtWidth, aTmpPos.Y()+mnCharHeight-1 ) ); - sal_Bool bDone = sal_False; - if ( pSelStart ) - { - // liegt der Tab in der Selektion??? - TextPaM aTextStart( nPara, nIndex ); - TextPaM aTextEnd( nPara, nIndex+1 ); - if ( ( aTextStart < *pSelEnd ) && ( aTextEnd > *pSelStart ) ) - { - Color aOldColor = pOutDev->GetFillColor(); - pOutDev->SetFillColor( rStyleSettings.GetHighlightColor() ); - pOutDev->DrawRect( aTabArea ); - pOutDev->SetFillColor( aOldColor ); - bDone = sal_True; - } - } - if ( !bDone ) - { - pOutDev->Erase( aTabArea ); - } - } - } - break; - default: OSL_FAIL( "ImpPaint: Unknown Portion-Type !" ); - } - } - - nIndex = nIndex + pTextPortion->GetLen(); - } - } - - nY += mnCharHeight; - - if ( pPaintArea && ( nY >= pPaintArea->Bottom() ) ) - break; // keine sichtbaren Aktionen mehr... - } - } - else - { - nY += nParaHeight; - } - - if ( pPaintArea && ( nY > pPaintArea->Bottom() ) ) - break; // keine sichtbaren Aktionen mehr... - } -} - -sal_Bool TextEngine::CreateLines( sal_uLong nPara ) -{ - // sal_Bool: Aenderung der Hoehe des Absatzes Ja/Nein - sal_True/sal_False - - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - DBG_ASSERT( pTEParaPortion->IsInvalid(), "CreateLines: Portion nicht invalid!" ); - - sal_uInt16 nOldLineCount = pTEParaPortion->GetLines().size(); - - // --------------------------------------------------------------- - // Schnelle Sonderbehandlung fuer leere Absaetze... - // --------------------------------------------------------------- - if ( pTEParaPortion->GetNode()->GetText().Len() == 0 ) - { - // schnelle Sonderbehandlung... - if ( !pTEParaPortion->GetTextPortions().empty() ) - pTEParaPortion->GetTextPortions().Reset(); - if ( !pTEParaPortion->GetLines().empty() ) - { - BOOST_FOREACH(TextLine* pLine, pTEParaPortion->GetLines()) - delete pLine; - pTEParaPortion->GetLines().clear(); - } - CreateAndInsertEmptyLine( nPara ); - pTEParaPortion->SetValid(); - return nOldLineCount != pTEParaPortion->GetLines().size(); - } - - // --------------------------------------------------------------- - // Initialisierung...... - // --------------------------------------------------------------- - - if ( pTEParaPortion->GetLines().empty() ) - { - TextLine* pL = new TextLine; - pTEParaPortion->GetLines().push_back( pL ); - } - - const short nInvalidDiff = pTEParaPortion->GetInvalidDiff(); - const sal_uInt16 nInvalidStart = pTEParaPortion->GetInvalidPosStart(); - const sal_uInt16 nInvalidEnd = nInvalidStart + Abs( nInvalidDiff ); - sal_Bool bQuickFormat = sal_False; - - if ( pTEParaPortion->GetWritingDirectionInfos().empty() ) - ImpInitWritingDirections( nPara ); - - if ( pTEParaPortion->GetWritingDirectionInfos().size() == 1 ) - { - if ( pTEParaPortion->IsSimpleInvalid() && ( nInvalidDiff > 0 ) ) - { - bQuickFormat = sal_True; - } - else if ( ( pTEParaPortion->IsSimpleInvalid() ) && ( nInvalidDiff < 0 ) ) - { - // pruefen, ob loeschen ueber Portiongrenzen erfolgte... - sal_uInt16 nStart = nInvalidStart; // DOPPELT !!!!!!!!!!!!!!! - sal_uInt16 nEnd = nStart - nInvalidDiff; // neg. - bQuickFormat = sal_True; - sal_uInt16 nPos = 0; - sal_uInt16 nPortions = pTEParaPortion->GetTextPortions().size(); - for ( sal_uInt16 nTP = 0; nTP < nPortions; nTP++ ) - { - // Es darf kein Start/Ende im geloeschten Bereich liegen. - TETextPortion* const pTP = pTEParaPortion->GetTextPortions()[ nTP ]; - nPos = nPos + pTP->GetLen(); - if ( ( nPos > nStart ) && ( nPos < nEnd ) ) - { - bQuickFormat = sal_False; - break; - } - } - } - } - - if ( bQuickFormat ) - RecalcTextPortion( nPara, nInvalidStart, nInvalidDiff ); - else - CreateTextPortions( nPara, nInvalidStart ); - - // --------------------------------------------------------------- - // Zeile mit InvalidPos suchen, eine Zeile davor beginnen... - // Zeilen flaggen => nicht removen ! - // --------------------------------------------------------------- - - sal_uInt16 nLine = pTEParaPortion->GetLines().size()-1; - for ( sal_uInt16 nL = 0; nL <= nLine; nL++ ) - { - TextLine* pLine = pTEParaPortion->GetLines()[ nL ]; - if ( pLine->GetEnd() > nInvalidStart ) - { - nLine = nL; - break; - } - pLine->SetValid(); - } - // Eine Zeile davor beginnen... - // Wenn ganz hinten getippt wird, kann sich die Zeile davor nicht aendern. - if ( nLine && ( !pTEParaPortion->IsSimpleInvalid() || ( nInvalidEnd < pNode->GetText().Len() ) || ( nInvalidDiff <= 0 ) ) ) - nLine--; - - TextLine* pLine = pTEParaPortion->GetLines()[ nLine ]; - - // --------------------------------------------------------------- - // Ab hier alle Zeilen durchformatieren... - // --------------------------------------------------------------- - size_t nDelFromLine = std::numeric_limits<size_t>::max(); - sal_Bool bLineBreak = sal_False; - - sal_uInt16 nIndex = pLine->GetStart(); - TextLine aSaveLine( *pLine ); - - Font aFont; - - sal_Bool bCalcPortion = sal_True; - - while ( nIndex < pNode->GetText().Len() ) - { - sal_Bool bEOL = sal_False; - sal_uInt16 nPortionStart = 0; - sal_uInt16 nPortionEnd = 0; - - sal_uInt16 nTmpPos = nIndex; - sal_uInt16 nTmpPortion = pLine->GetStartPortion(); - long nTmpWidth = mpDoc->GetLeftMargin(); -// long nXWidth = mnMaxTextWidth ? ( mnMaxTextWidth - mpDoc->GetLeftMargin() ) : 0x7FFFFFFF; - // Margin nicht abziehen, ist schon in TmpWidth enthalten. - long nXWidth = mnMaxTextWidth ? mnMaxTextWidth : 0x7FFFFFFF; - if ( nXWidth < nTmpWidth ) - nXWidth = nTmpWidth; - - // Portion suchen, die nicht mehr in Zeile passt.... - TETextPortion* pPortion = 0; - sal_Bool bBrokenLine = sal_False; - bLineBreak = sal_False; - - while ( ( nTmpWidth <= nXWidth ) && !bEOL && ( nTmpPortion < pTEParaPortion->GetTextPortions().size() ) ) - { - nPortionStart = nTmpPos; - pPortion = pTEParaPortion->GetTextPortions()[ nTmpPortion ]; - DBG_ASSERT( pPortion->GetLen(), "Leere Portion in CreateLines ?!" ); - if ( pNode->GetText().GetChar( nTmpPos ) == '\t' ) - { - long nCurPos = nTmpWidth-mpDoc->GetLeftMargin(); - nTmpWidth = ((nCurPos/mnDefTab)+1)*mnDefTab+mpDoc->GetLeftMargin(); - pPortion->GetWidth() = nTmpWidth - nCurPos - mpDoc->GetLeftMargin(); - // Wenn dies das erste Token in der Zeile ist, und - // nTmpWidth > aPaperSize.Width, habe ich eine Endlos-Schleife! - if ( ( nTmpWidth >= nXWidth ) && ( nTmpPortion == pLine->GetStartPortion() ) ) - { - // Aber was jetzt ? Tab passend machen! - pPortion->GetWidth() = nXWidth-1; - nTmpWidth = pPortion->GetWidth(); - bEOL = sal_True; - bBrokenLine = sal_True; - } - pPortion->GetKind() = PORTIONKIND_TAB; - } - else - { - - if ( bCalcPortion || !pPortion->HasValidSize() ) - pPortion->GetWidth() = (long)CalcTextWidth( nPara, nTmpPos, pPortion->GetLen() ); - nTmpWidth += pPortion->GetWidth(); - - pPortion->GetRightToLeft() = ImpGetRightToLeft( nPara, nTmpPos+1 ); - pPortion->GetKind() = PORTIONKIND_TEXT; - } - - nTmpPos = nTmpPos + pPortion->GetLen(); - nPortionEnd = nTmpPos; - nTmpPortion++; - } - - // das war evtl. eine Portion zu weit: - sal_Bool bFixedEnd = sal_False; - if ( nTmpWidth > nXWidth ) - { - nPortionEnd = nTmpPos; - nTmpPos = nTmpPos - pPortion->GetLen(); - nPortionStart = nTmpPos; - nTmpPortion--; - bEOL = sal_False; - - nTmpWidth -= pPortion->GetWidth(); - if ( pPortion->GetKind() == PORTIONKIND_TAB ) - { - bEOL = sal_True; - bFixedEnd = sal_True; - } - } - else - { - bEOL = sal_True; - pLine->SetEnd( nPortionEnd ); - OSL_ENSURE(pTEParaPortion->GetTextPortions().size(), - "No TextPortions?"); - pLine->SetEndPortion( (sal_uInt16)pTEParaPortion->GetTextPortions().size() - 1 ); - } - - if ( bFixedEnd ) - { - pLine->SetEnd( nPortionStart ); - pLine->SetEndPortion( nTmpPortion-1 ); - } - else if ( bLineBreak || bBrokenLine ) - { - pLine->SetEnd( nPortionStart+1 ); - pLine->SetEndPortion( nTmpPortion-1 ); - } - else if ( !bEOL ) - { - DBG_ASSERT( (nPortionEnd-nPortionStart) == pPortion->GetLen(), "Doch eine andere Portion?!" ); - long nRemainingWidth = mnMaxTextWidth - nTmpWidth; - ImpBreakLine( nPara, pLine, pPortion, nPortionStart, nRemainingWidth ); - } - - if ( ( ImpGetAlign() == TXTALIGN_CENTER ) || ( ImpGetAlign() == TXTALIGN_RIGHT ) ) - { - // Ausrichten... - long nTextWidth = 0; - for ( sal_uInt16 nTP = pLine->GetStartPortion(); nTP <= pLine->GetEndPortion(); nTP++ ) - { - TETextPortion* pTextPortion = pTEParaPortion->GetTextPortions()[ nTP ]; - nTextWidth += pTextPortion->GetWidth(); - } - long nSpace = mnMaxTextWidth - nTextWidth; - if ( nSpace > 0 ) - { - if ( ImpGetAlign() == TXTALIGN_CENTER ) - pLine->SetStartX( (sal_uInt16)(nSpace / 2) ); - else // TXTALIGN_RIGHT - pLine->SetStartX( (sal_uInt16)nSpace ); - } - } - else - { - pLine->SetStartX( mpDoc->GetLeftMargin() ); - } - - // ----------------------------------------------------------------- - // pruefen, ob die Zeile neu ausgegeben werden muss... - // ----------------------------------------------------------------- - pLine->SetInvalid(); - - if ( pTEParaPortion->IsSimpleInvalid() ) - { - // Aenderung durch einfache Textaenderung... - // Formatierung nicht abbrechen, da Portions evtl. wieder - // gesplittet werden muessen! - // Wenn irgendwann mal abbrechbar, dann fogende Zeilen Validieren! - // Aber ggf. als Valid markieren, damit weniger Ausgabe... - if ( pLine->GetEnd() < nInvalidStart ) - { - if ( *pLine == aSaveLine ) - { - pLine->SetValid(); - } - } - else - { - sal_uInt16 nStart = pLine->GetStart(); - sal_uInt16 nEnd = pLine->GetEnd(); - - if ( nStart > nInvalidEnd ) - { - if ( ( ( nStart-nInvalidDiff ) == aSaveLine.GetStart() ) && - ( ( nEnd-nInvalidDiff ) == aSaveLine.GetEnd() ) ) - { - pLine->SetValid(); - if ( bCalcPortion && bQuickFormat ) - { - bCalcPortion = sal_False; - pTEParaPortion->CorrectValuesBehindLastFormattedLine( nLine ); - break; - } - } - } - else if ( bQuickFormat && ( nEnd > nInvalidEnd) ) - { - // Wenn die ungueltige Zeile so endet, dass die naechste an - // der 'gleichen' Textstelle wie vorher beginnt, also nicht - // anders umgebrochen wird, brauche ich dort auch nicht die - // textbreiten neu bestimmen: - if ( nEnd == ( aSaveLine.GetEnd() + nInvalidDiff ) ) - { - bCalcPortion = sal_False; - pTEParaPortion->CorrectValuesBehindLastFormattedLine( nLine ); - break; - } - } - } - } - - nIndex = pLine->GetEnd(); // naechste Zeile Start = letzte Zeile Ende - // weil nEnd hinter das letzte Zeichen zeigt! - - sal_uInt16 nEndPortion = pLine->GetEndPortion(); - - // Naechste Zeile oder ggf. neue Zeile.... - pLine = 0; - if ( nLine < pTEParaPortion->GetLines().size()-1 ) - pLine = pTEParaPortion->GetLines()[ ++nLine ]; - if ( pLine && ( nIndex >= pNode->GetText().Len() ) ) - { - nDelFromLine = nLine; - break; - } - if ( !pLine && ( nIndex < pNode->GetText().Len() ) ) - { - pLine = new TextLine; - pTEParaPortion->GetLines().insert( pTEParaPortion->GetLines().begin() + ++nLine, pLine ); - } - if ( pLine ) - { - aSaveLine = *pLine; - pLine->SetStart( nIndex ); - pLine->SetEnd( nIndex ); - pLine->SetStartPortion( nEndPortion+1 ); - pLine->SetEndPortion( nEndPortion+1 ); - } - } // while ( Index < Len ) - - if (nDelFromLine != std::numeric_limits<size_t>::max()) - { - for( TextLines::iterator it = pTEParaPortion->GetLines().begin() + nDelFromLine; - it != pTEParaPortion->GetLines().end(); ++it ) - { - delete *it; - } - pTEParaPortion->GetLines().erase( pTEParaPortion->GetLines().begin() + nDelFromLine, - pTEParaPortion->GetLines().end() ); - } - - DBG_ASSERT( pTEParaPortion->GetLines().size(), "Keine Zeile nach CreateLines!" ); - - if ( bLineBreak == sal_True ) - CreateAndInsertEmptyLine( nPara ); - - pTEParaPortion->SetValid(); - - return nOldLineCount != pTEParaPortion->GetLines().size(); -} - -String TextEngine::GetWord( const TextPaM& rCursorPos, TextPaM* pStartOfWord ) -{ - String aWord; - if ( rCursorPos.GetPara() < mpDoc->GetNodes().Count() ) - { - TextSelection aSel( rCursorPos ); - TextNode* pNode = mpDoc->GetNodes().GetObject( rCursorPos.GetPara() ); - uno::Reference < i18n::XBreakIterator > xBI = GetBreakIterator(); - i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), rCursorPos.GetIndex(), GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True ); - aSel.GetStart().GetIndex() = (sal_uInt16)aBoundary.startPos; - aSel.GetEnd().GetIndex() = (sal_uInt16)aBoundary.endPos; - aWord = pNode->GetText().Copy( aSel.GetStart().GetIndex(), aSel.GetEnd().GetIndex() - aSel.GetStart().GetIndex() ); - if ( pStartOfWord ) - *pStartOfWord = aSel.GetStart(); - } - return aWord; -} - -sal_Bool TextEngine::Read( SvStream& rInput, const TextSelection* pSel ) -{ - sal_Bool bUpdate = GetUpdateMode(); - SetUpdateMode( sal_False ); - - UndoActionStart(); - TextSelection aSel; - if ( pSel ) - aSel = *pSel; - else - { - sal_uLong nParas = mpDoc->GetNodes().Count(); - TextNode* pNode = mpDoc->GetNodes().GetObject( nParas - 1 ); - aSel = TextPaM( nParas-1 , pNode->GetText().Len() ); - } - - if ( aSel.HasRange() ) - aSel = ImpDeleteText( aSel ); - - rtl::OString aLine; - sal_Bool bDone = rInput.ReadLine( aLine ); - rtl::OUString aTmpStr(rtl::OStringToOUString(aLine, rInput.GetStreamCharSet())), aStr; - while ( bDone ) - { - aSel = ImpInsertText( aSel, aTmpStr ); - bDone = rInput.ReadLine( aLine ); - aTmpStr = rtl::OStringToOUString(aLine, rInput.GetStreamCharSet()); - if ( bDone ) - aSel = ImpInsertParaBreak( aSel.GetEnd() ); - } - - UndoActionEnd(); - - TextSelection aNewSel( aSel.GetEnd(), aSel.GetEnd() ); - - // Damit bei FormatAndUpdate nicht auf die ungueltige Selektion zugegriffen wird. - if ( GetActiveView() ) - GetActiveView()->ImpSetSelection( aNewSel ); - - SetUpdateMode( bUpdate ); - FormatAndUpdate( GetActiveView() ); - - return rInput.GetError() ? sal_False : sal_True; -} - -sal_Bool TextEngine::Write( SvStream& rOutput, const TextSelection* pSel, sal_Bool bHTML ) -{ - TextSelection aSel; - if ( pSel ) - aSel = *pSel; - else - { - sal_uLong nParas = mpDoc->GetNodes().Count(); - TextNode* pNode = mpDoc->GetNodes().GetObject( nParas - 1 ); - aSel.GetStart() = TextPaM( 0, 0 ); - aSel.GetEnd() = TextPaM( nParas-1, pNode->GetText().Len() ); - } - - if ( bHTML ) - { - rOutput.WriteLine( "<HTML>" ); - rOutput.WriteLine( "<BODY>" ); - } - - for ( sal_uLong nPara = aSel.GetStart().GetPara(); nPara <= aSel.GetEnd().GetPara(); nPara++ ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - - sal_uInt16 nStartPos = 0; - sal_uInt16 nEndPos = pNode->GetText().Len(); - if ( nPara == aSel.GetStart().GetPara() ) - nStartPos = aSel.GetStart().GetIndex(); - if ( nPara == aSel.GetEnd().GetPara() ) - nEndPos = aSel.GetEnd().GetIndex(); - - String aText; - if ( !bHTML ) - { - aText = pNode->GetText().Copy( nStartPos, nEndPos-nStartPos ); - } - else - { - aText.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "<P STYLE=\"margin-bottom: 0cm\">" ) ); - - if ( nStartPos == nEndPos ) - { - // Leerzeilen werden von Writer wegoptimiert - aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "<BR>" ) ); - } - else - { - sal_uInt16 nTmpStart = nStartPos; - sal_uInt16 nTmpEnd = nEndPos; - do - { - TextCharAttrib* pAttr = pNode->GetCharAttribs().FindNextAttrib( TEXTATTR_HYPERLINK, nTmpStart, nEndPos ); - nTmpEnd = pAttr ? pAttr->GetStart() : nEndPos; - - // Text vor dem Attribut - aText += pNode->GetText().Copy( nTmpStart, nTmpEnd-nTmpStart ); - - if ( pAttr ) - { - nTmpEnd = Min( pAttr->GetEnd(), nEndPos ); - - // z.B. <A HREF="http://www.mopo.de/">Morgenpost</A> - aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "<A HREF=\"" ) ); - aText += ((const TextAttribHyperLink&) pAttr->GetAttr() ).GetURL(); - aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\">" ) ); - nTmpStart = pAttr->GetStart(); - aText += pNode->GetText().Copy( nTmpStart, nTmpEnd-nTmpStart ); - aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "</A>" ) ); - - nTmpStart = pAttr->GetEnd(); - } - } while ( nTmpEnd < nEndPos ); - } - - aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "</P>" ) ); - } - rOutput.WriteLine(rtl::OUStringToOString(aText, - rOutput.GetStreamCharSet())); - } - - if ( bHTML ) - { - rOutput.WriteLine( "</BODY>" ); - rOutput.WriteLine( "</HTML>" ); - } - - return rOutput.GetError() ? sal_False : sal_True; -} - -void TextEngine::RemoveAttribs( sal_uLong nPara, sal_Bool bIdleFormatAndUpdate ) -{ - if ( nPara < mpDoc->GetNodes().Count() ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - if ( pNode->GetCharAttribs().Count() ) - { - pNode->GetCharAttribs().Clear( sal_True ); - - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - pTEParaPortion->MarkSelectionInvalid( 0, pNode->GetText().Len() ); - - mbFormatted = sal_False; - - if ( bIdleFormatAndUpdate ) - IdleFormatAndUpdate( NULL, 0xFFFF ); - else - FormatAndUpdate( NULL ); - } - } -} -void TextEngine::RemoveAttribs( sal_uLong nPara, sal_uInt16 nWhich, sal_Bool bIdleFormatAndUpdate ) -{ - if ( nPara < mpDoc->GetNodes().Count() ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - if ( pNode->GetCharAttribs().Count() ) - { - TextCharAttribList& rAttribs = pNode->GetCharAttribs(); - sal_uInt16 nAttrCount = rAttribs.Count(); - for(sal_uInt16 nAttr = nAttrCount; nAttr; --nAttr) - { - if(rAttribs.GetAttrib( nAttr - 1 )->Which() == nWhich) - rAttribs.RemoveAttrib( nAttr -1 ); - } - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - pTEParaPortion->MarkSelectionInvalid( 0, pNode->GetText().Len() ); - mbFormatted = sal_False; - if(bIdleFormatAndUpdate) - IdleFormatAndUpdate( NULL, 0xFFFF ); - else - FormatAndUpdate( NULL ); - } - } -} -void TextEngine::RemoveAttrib( sal_uLong nPara, const TextCharAttrib& rAttrib ) -{ - if ( nPara < mpDoc->GetNodes().Count() ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - if ( pNode->GetCharAttribs().Count() ) - { - TextCharAttribList& rAttribs = pNode->GetCharAttribs(); - sal_uInt16 nAttrCount = rAttribs.Count(); - for(sal_uInt16 nAttr = nAttrCount; nAttr; --nAttr) - { - if(rAttribs.GetAttrib( nAttr - 1 ) == &rAttrib) - { - rAttribs.RemoveAttrib( nAttr -1 ); - break; - } - } - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - pTEParaPortion->MarkSelectionInvalid( 0, pNode->GetText().Len() ); - mbFormatted = sal_False; - FormatAndUpdate( NULL ); - } - } -} - -void TextEngine::SetAttrib( const TextAttrib& rAttr, sal_uLong nPara, sal_uInt16 nStart, sal_uInt16 nEnd, sal_Bool bIdleFormatAndUpdate ) -{ - // Es wird hier erstmal nicht geprueft, ob sich Attribute ueberlappen! - // Diese Methode ist erstmal nur fuer einen Editor, der fuer eine Zeile - // _schnell_ das Syntax-Highlight einstellen will. - - // Da die TextEngine z.Zt fuer Editoren gedacht ist gibt es auch kein - // Undo fuer Attribute! - - if ( nPara < mpDoc->GetNodes().Count() ) - { - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - TEParaPortion* pTEParaPortion = mpTEParaPortions->GetObject( nPara ); - - sal_uInt16 nMax = pNode->GetText().Len(); - if ( nStart > nMax ) - nStart = nMax; - if ( nEnd > nMax ) - nEnd = nMax; - - pNode->GetCharAttribs().InsertAttrib( new TextCharAttrib( rAttr, nStart, nEnd ) ); - pTEParaPortion->MarkSelectionInvalid( nStart, nEnd ); - - mbFormatted = sal_False; - if ( bIdleFormatAndUpdate ) - IdleFormatAndUpdate( NULL, 0xFFFF ); - else - FormatAndUpdate( NULL ); - } -} - -void TextEngine::SetTextAlign( TxtAlign eAlign ) -{ - if ( eAlign != meAlign ) - { - meAlign = eAlign; - FormatFullDoc(); - UpdateViews(); - } -} - - -void TextEngine::ValidateSelection( TextSelection& rSel ) const -{ - ValidatePaM( rSel.GetStart() ); - ValidatePaM( rSel.GetEnd() ); -} - -void TextEngine::ValidatePaM( TextPaM& rPaM ) const -{ - sal_uLong nMaxPara = mpDoc->GetNodes().Count() - 1; - if ( rPaM.GetPara() > nMaxPara ) - { - rPaM.GetPara() = nMaxPara; - rPaM.GetIndex() = 0xFFFF; - } - - sal_uInt16 nMaxIndex = GetTextLen( rPaM.GetPara() ); - if ( rPaM.GetIndex() > nMaxIndex ) - rPaM.GetIndex() = nMaxIndex; -} - - -// Status & Selektionsanpassung - -void TextEngine::ImpParagraphInserted( sal_uLong nPara ) -{ - // Die aktive View braucht nicht angepasst werden, aber bei allen - // passiven muss die Selektion angepasst werden: - if ( mpViews->size() > 1 ) - { - for ( sal_uInt16 nView = mpViews->size(); nView; ) - { - TextView* pView = (*mpViews)[ --nView ]; - if ( pView != GetActiveView() ) - { - for ( int n = 0; n <= 1; n++ ) - { - TextPaM& rPaM = n ? pView->GetSelection().GetStart(): pView->GetSelection().GetEnd(); - if ( rPaM.GetPara() >= nPara ) - rPaM.GetPara()++; - } - } - } - } - Broadcast( TextHint( TEXT_HINT_PARAINSERTED, nPara ) ); -} - -void TextEngine::ImpParagraphRemoved( sal_uLong nPara ) -{ - if ( mpViews->size() > 1 ) - { - for ( sal_uInt16 nView = mpViews->size(); nView; ) - { - TextView* pView = (*mpViews)[ --nView ]; - if ( pView != GetActiveView() ) - { - sal_uLong nParas = mpDoc->GetNodes().Count(); - for ( int n = 0; n <= 1; n++ ) - { - TextPaM& rPaM = n ? pView->GetSelection().GetStart(): pView->GetSelection().GetEnd(); - if ( rPaM.GetPara() > nPara ) - rPaM.GetPara()--; - else if ( rPaM.GetPara() == nPara ) - { - rPaM.GetIndex() = 0; - if ( rPaM.GetPara() >= nParas ) - rPaM.GetPara()--; - } - } - } - } - } - Broadcast( TextHint( TEXT_HINT_PARAREMOVED, nPara ) ); -} - -void TextEngine::ImpCharsRemoved( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16 nChars ) -{ - if ( mpViews->size() > 1 ) - { - for ( sal_uInt16 nView = mpViews->size(); nView; ) - { - TextView* pView = (*mpViews)[ --nView ]; - if ( pView != GetActiveView() ) - { - sal_uInt16 nEnd = nPos+nChars; - for ( int n = 0; n <= 1; n++ ) - { - TextPaM& rPaM = n ? pView->GetSelection().GetStart(): pView->GetSelection().GetEnd(); - if ( rPaM.GetPara() == nPara ) - { - if ( rPaM.GetIndex() > nEnd ) - rPaM.GetIndex() = rPaM.GetIndex() - nChars; - else if ( rPaM.GetIndex() > nPos ) - rPaM.GetIndex() = nPos; - } - } - } - } - } - Broadcast( TextHint( TEXT_HINT_PARACONTENTCHANGED, nPara ) ); -} - -void TextEngine::ImpCharsInserted( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16 nChars ) -{ - if ( mpViews->size() > 1 ) - { - for ( sal_uInt16 nView = mpViews->size(); nView; ) - { - TextView* pView = (*mpViews)[ --nView ]; - if ( pView != GetActiveView() ) - { - for ( int n = 0; n <= 1; n++ ) - { - TextPaM& rPaM = n ? pView->GetSelection().GetStart(): pView->GetSelection().GetEnd(); - if ( rPaM.GetPara() == nPara ) - { - if ( rPaM.GetIndex() >= nPos ) - rPaM.GetIndex() = rPaM.GetIndex() + nChars; - } - } - } - } - } - Broadcast( TextHint( TEXT_HINT_PARACONTENTCHANGED, nPara ) ); -} - -void TextEngine::ImpFormattingParagraph( sal_uLong nPara ) -{ - Broadcast( TextHint( TEXT_HINT_FORMATPARA, nPara ) ); -} - -void TextEngine::ImpTextHeightChanged() -{ - Broadcast( TextHint( TEXT_HINT_TEXTHEIGHTCHANGED ) ); -} - -void TextEngine::ImpTextFormatted() -{ - Broadcast( TextHint( TEXT_HINT_TEXTFORMATTED ) ); -} - -void TextEngine::Draw( OutputDevice* pDev, const Point& rPos ) -{ - ImpPaint( pDev, rPos, NULL ); -} - -void TextEngine::SetLeftMargin( sal_uInt16 n ) -{ - mpDoc->SetLeftMargin( n ); -} - -sal_uInt16 TextEngine::GetLeftMargin() const -{ - return mpDoc->GetLeftMargin(); -} - -uno::Reference< i18n::XBreakIterator > TextEngine::GetBreakIterator() -{ - if ( !mxBreakIterator.is() ) - mxBreakIterator = vcl::unohelper::CreateBreakIterator(); - DBG_ASSERT( mxBreakIterator.is(), "Could not create BreakIterator" ); - return mxBreakIterator; -} - -void TextEngine::SetLocale( const ::com::sun::star::lang::Locale& rLocale ) -{ - maLocale = rLocale; - delete mpLocaleDataWrapper; - mpLocaleDataWrapper = NULL; -} - -::com::sun::star::lang::Locale TextEngine::GetLocale() -{ - if ( maLocale.Language.isEmpty() ) - { - maLocale = Application::GetSettings().GetUILocale(); - } - return maLocale; -} - -LocaleDataWrapper* TextEngine::ImpGetLocaleDataWrapper() -{ - if ( !mpLocaleDataWrapper ) - mpLocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetLocale() ); - - return mpLocaleDataWrapper; -} - -void TextEngine::SetRightToLeft( sal_Bool bR2L ) -{ - if ( mbRightToLeft != bR2L ) - { - mbRightToLeft = bR2L; - meAlign = bR2L ? TXTALIGN_RIGHT : TXTALIGN_LEFT; - FormatFullDoc(); - UpdateViews(); - } -} - -void TextEngine::ImpInitWritingDirections( sal_uLong nPara ) -{ - TEParaPortion* pParaPortion = mpTEParaPortions->GetObject( nPara ); - std::vector<TEWritingDirectionInfo>& rInfos = pParaPortion->GetWritingDirectionInfos(); - rInfos.clear(); - - if ( pParaPortion->GetNode()->GetText().Len() ) - { - const UBiDiLevel nBidiLevel = IsRightToLeft() ? 1 /*RTL*/ : 0 /*LTR*/; - String aText( pParaPortion->GetNode()->GetText() ); - - // - // Bidi functions from icu 2.0 - // - UErrorCode nError = U_ZERO_ERROR; - UBiDi* pBidi = ubidi_openSized( aText.Len(), 0, &nError ); - nError = U_ZERO_ERROR; - - ubidi_setPara( pBidi, reinterpret_cast<const UChar *>(aText.GetBuffer()), aText.Len(), nBidiLevel, NULL, &nError ); // UChar != sal_Unicode in MinGW - nError = U_ZERO_ERROR; - - long nCount = ubidi_countRuns( pBidi, &nError ); - - int32_t nStart = 0; - int32_t nEnd; - UBiDiLevel nCurrDir; - - for ( sal_uInt16 nIdx = 0; nIdx < nCount; ++nIdx ) - { - ubidi_getLogicalRun( pBidi, nStart, &nEnd, &nCurrDir ); - rInfos.push_back( TEWritingDirectionInfo( nCurrDir, (sal_uInt16)nStart, (sal_uInt16)nEnd ) ); - nStart = nEnd; - } - - ubidi_close( pBidi ); - } - - // No infos mean no CTL and default dir is L2R... - if ( rInfos.empty() ) - rInfos.push_back( TEWritingDirectionInfo( 0, 0, (sal_uInt16)pParaPortion->GetNode()->GetText().Len() ) ); - -} - -sal_uInt8 TextEngine::ImpGetRightToLeft( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16* pStart, sal_uInt16* pEnd ) -{ - sal_uInt8 nRightToLeft = 0; - - TextNode* pNode = mpDoc->GetNodes().GetObject( nPara ); - if ( pNode && pNode->GetText().Len() ) - { - TEParaPortion* pParaPortion = mpTEParaPortions->GetObject( nPara ); - if ( pParaPortion->GetWritingDirectionInfos().empty() ) - ImpInitWritingDirections( nPara ); - - std::vector<TEWritingDirectionInfo>& rDirInfos = pParaPortion->GetWritingDirectionInfos(); - for ( std::vector<TEWritingDirectionInfo>::const_iterator rDirInfosIt = rDirInfos.begin(); rDirInfosIt != rDirInfos.end(); ++rDirInfosIt ) - { - if ( ( (*rDirInfosIt).nStartPos <= nPos ) && ( (*rDirInfosIt).nEndPos >= nPos ) ) - { - nRightToLeft = (*rDirInfosIt).nType; - if ( pStart ) - *pStart = (*rDirInfosIt).nStartPos; - if ( pEnd ) - *pEnd = (*rDirInfosIt).nEndPos; - break; - } - } - } - return nRightToLeft; -} - -long TextEngine::ImpGetPortionXOffset( sal_uLong nPara, TextLine* pLine, sal_uInt16 nTextPortion ) -{ - long nX = pLine->GetStartX(); - - TEParaPortion* pParaPortion = mpTEParaPortions->GetObject( nPara ); - - for ( sal_uInt16 i = pLine->GetStartPortion(); i < nTextPortion; i++ ) - { - TETextPortion* pPortion = pParaPortion->GetTextPortions()[ i ]; - nX += pPortion->GetWidth(); - } - - TETextPortion* pDestPortion = pParaPortion->GetTextPortions()[ nTextPortion ]; - if ( pDestPortion->GetKind() != PORTIONKIND_TAB ) - { - if ( !IsRightToLeft() && pDestPortion->GetRightToLeft() ) - { - // Portions behind must be added, visual before this portion - sal_uInt16 nTmpPortion = nTextPortion+1; - while ( nTmpPortion <= pLine->GetEndPortion() ) - { - TETextPortion* pNextTextPortion = pParaPortion->GetTextPortions()[ nTmpPortion ]; - if ( pNextTextPortion->GetRightToLeft() && ( pNextTextPortion->GetKind() != PORTIONKIND_TAB ) ) - nX += pNextTextPortion->GetWidth(); - else - break; - nTmpPortion++; - } - // Portions before must be removed, visual behind this portion - nTmpPortion = nTextPortion; - while ( nTmpPortion > pLine->GetStartPortion() ) - { - --nTmpPortion; - TETextPortion* pPrevTextPortion = pParaPortion->GetTextPortions()[ nTmpPortion ]; - if ( pPrevTextPortion->GetRightToLeft() && ( pPrevTextPortion->GetKind() != PORTIONKIND_TAB ) ) - nX -= pPrevTextPortion->GetWidth(); - else - break; - } - } - else if ( IsRightToLeft() && !pDestPortion->IsRightToLeft() ) - { - // Portions behind must be removed, visual behind this portion - sal_uInt16 nTmpPortion = nTextPortion+1; - while ( nTmpPortion <= pLine->GetEndPortion() ) - { - TETextPortion* pNextTextPortion = pParaPortion->GetTextPortions()[ nTmpPortion ]; - if ( !pNextTextPortion->IsRightToLeft() && ( pNextTextPortion->GetKind() != PORTIONKIND_TAB ) ) - nX += pNextTextPortion->GetWidth(); - else - break; - nTmpPortion++; - } - // Portions before must be added, visual before this portion - nTmpPortion = nTextPortion; - while ( nTmpPortion > pLine->GetStartPortion() ) - { - --nTmpPortion; - TETextPortion* pPrevTextPortion = pParaPortion->GetTextPortions()[ nTmpPortion ]; - if ( !pPrevTextPortion->IsRightToLeft() && ( pPrevTextPortion->GetKind() != PORTIONKIND_TAB ) ) - nX -= pPrevTextPortion->GetWidth(); - else - break; - } - } - } - - return nX; -} - -void TextEngine::ImpInitLayoutMode( OutputDevice* pOutDev, sal_Bool bDrawingR2LPortion ) -{ - sal_uLong nLayoutMode = pOutDev->GetLayoutMode(); - - nLayoutMode &= ~(TEXT_LAYOUT_BIDI_RTL | TEXT_LAYOUT_COMPLEX_DISABLED | TEXT_LAYOUT_BIDI_STRONG ); - if ( bDrawingR2LPortion ) - nLayoutMode |= TEXT_LAYOUT_BIDI_RTL; - - pOutDev->SetLayoutMode( nLayoutMode ); -} - -TxtAlign TextEngine::ImpGetAlign() const -{ - TxtAlign eAlign = meAlign; - if ( IsRightToLeft() ) - { - if ( eAlign == TXTALIGN_LEFT ) - eAlign = TXTALIGN_RIGHT; - else if ( eAlign == TXTALIGN_RIGHT ) - eAlign = TXTALIGN_LEFT; - } - return eAlign; -} - -long TextEngine::ImpGetOutputOffset( sal_uLong nPara, TextLine* pLine, sal_uInt16 nIndex, sal_uInt16 nIndex2 ) -{ - TEParaPortion* pPortion = mpTEParaPortions->GetObject( nPara ); - - sal_uInt16 nPortionStart; - sal_uInt16 nPortion = pPortion->GetTextPortions().FindPortion( nIndex, nPortionStart, sal_True ); - - TETextPortion* pTextPortion = pPortion->GetTextPortions()[ nPortion ]; - - long nX; - - if ( ( nIndex == nPortionStart ) && ( nIndex == nIndex2 ) ) - { - // Output of full portion, so we need portion x offset. - // Use ImpGetPortionXOffset, because GetXPos may deliver left or right position from portioon, depending on R2L, L2R - nX = ImpGetPortionXOffset( nPara, pLine, nPortion ); - if ( IsRightToLeft() ) - { - nX = -nX -pTextPortion->GetWidth(); - } - } - else - { - nX = ImpGetXPos( nPara, pLine, nIndex, nIndex == nPortionStart ); - if ( nIndex2 != nIndex ) - { - long nX2 = ImpGetXPos( nPara, pLine, nIndex2, sal_False ); - if ( ( !IsRightToLeft() && ( nX2 < nX ) ) || - ( IsRightToLeft() && ( nX2 > nX ) ) ) - { - nX = nX2; - } - } - if ( IsRightToLeft() ) - { - nX = -nX; - } - } - - return nX; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textund2.hxx b/svtools/source/edit/textund2.hxx deleted file mode 100644 index c5ce90cc9e54..000000000000 --- a/svtools/source/edit/textund2.hxx +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- 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 . - */ -#ifndef _TEXTUND2_HXX -#define _TEXTUND2_HXX - -#include <textundo.hxx> - - -class TextUndoDelPara : public TextUndo -{ -private: - sal_Bool mbDelObject; - sal_uLong mnPara; - TextNode* mpNode; // Zeigt auf das gueltige, nicht zerstoerte Objekt! - -public: - TYPEINFO(); - TextUndoDelPara( TextEngine* pTextEngine, TextNode* pNode, sal_uLong nPara ); - ~TextUndoDelPara(); - - virtual void Undo(); - virtual void Redo(); -}; - - -class TextUndoConnectParas : public TextUndo -{ -private: - sal_uLong mnPara; - sal_uInt16 mnSepPos; - -public: - TYPEINFO(); - TextUndoConnectParas( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nSepPos ); - ~TextUndoConnectParas(); - - virtual void Undo(); - virtual void Redo(); -}; - - -class TextUndoSplitPara : public TextUndo -{ -private: - sal_uLong mnPara; - sal_uInt16 mnSepPos; - -public: - TYPEINFO(); - TextUndoSplitPara( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nSepPos ); - ~TextUndoSplitPara(); - - virtual void Undo(); - virtual void Redo(); -}; - - -class TextUndoInsertChars : public TextUndo -{ -private: - TextPaM maTextPaM; - String maText; - -public: - TYPEINFO(); - TextUndoInsertChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const String& rStr ); - - virtual void Undo(); - virtual void Redo(); - - virtual sal_Bool Merge( SfxUndoAction *pNextAction ); -}; - - -class TextUndoRemoveChars : public TextUndo -{ -private: - TextPaM maTextPaM; - String maText; - -public: - TYPEINFO(); - TextUndoRemoveChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const String& rStr ); - - virtual void Undo(); - virtual void Redo(); -}; - - -class TextUndoSetAttribs: public TextUndo -{ -private: - TextSelection maSelection; - -public: - TYPEINFO(); - TextUndoSetAttribs( TextEngine* pTextEngine, const TextSelection& rESel ); - ~TextUndoSetAttribs(); - - virtual void Undo(); - virtual void Redo(); -}; - -#endif // _TEXTUND2_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textundo.cxx b/svtools/source/edit/textundo.cxx deleted file mode 100644 index 1b82d0f1025b..000000000000 --- a/svtools/source/edit/textundo.cxx +++ /dev/null @@ -1,295 +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. - * - ************************************************************************/ - - -#include <svtools/texteng.hxx> -#include <svtools/textview.hxx> -#include <textundo.hxx> -#include <textund2.hxx> -#include <svtools/textdata.hxx> -#include <textdoc.hxx> -#include <textdat2.hxx> - -TYPEINIT1( TextUndo, SfxUndoAction ); -TYPEINIT1( TextUndoDelPara, TextUndo ); -TYPEINIT1( TextUndoConnectParas, TextUndo ); -TYPEINIT1( TextUndoSplitPara, TextUndo ); -TYPEINIT1( TextUndoInsertChars, TextUndo ); -TYPEINIT1( TextUndoRemoveChars, TextUndo ); - - -TextUndoManager::TextUndoManager( TextEngine* p ) -{ - mpTextEngine = p; -} - -TextUndoManager::~TextUndoManager() -{ -} - -sal_Bool TextUndoManager::Undo() -{ - if ( GetUndoActionCount() == 0 ) - return sal_False; - - UndoRedoStart(); - - mpTextEngine->SetIsInUndo( sal_True ); - sal_Bool bDone = SfxUndoManager::Undo(); - mpTextEngine->SetIsInUndo( sal_False ); - - UndoRedoEnd(); - - return bDone; -} - -sal_Bool TextUndoManager::Redo() -{ - if ( GetRedoActionCount() == 0 ) - return sal_False; - - - UndoRedoStart(); - - mpTextEngine->SetIsInUndo( sal_True ); - sal_Bool bDone = SfxUndoManager::Redo(); - mpTextEngine->SetIsInUndo( sal_False ); - - UndoRedoEnd(); - - return bDone; -} - -void TextUndoManager::UndoRedoStart() -{ - DBG_ASSERT( GetView(), "Undo/Redo: Active View?" ); - -// if ( GetView() ) -// GetView()->HideSelection(); -} - -void TextUndoManager::UndoRedoEnd() -{ - if ( GetView() ) - { - TextSelection aNewSel( GetView()->GetSelection() ); - aNewSel.GetStart() = aNewSel.GetEnd(); - GetView()->ImpSetSelection( aNewSel ); - } - - mpTextEngine->UpdateSelections(); - - mpTextEngine->FormatAndUpdate( GetView() ); -} - - -TextUndo::TextUndo( TextEngine* p ) -{ - mpTextEngine = p; -} - -TextUndo::~TextUndo() -{ -} - -rtl::OUString TextUndo::GetComment() const -{ - return rtl::OUString(); -} - -void TextUndo::SetSelection( const TextSelection& rSel ) -{ - if ( GetView() ) - GetView()->ImpSetSelection( rSel ); -} - - -TextUndoDelPara::TextUndoDelPara( TextEngine* pTextEngine, TextNode* pNode, sal_uLong nPara ) - : TextUndo( pTextEngine ) -{ - mpNode = pNode; - mnPara = nPara; - mbDelObject = sal_True; -} - -TextUndoDelPara::~TextUndoDelPara() -{ - if ( mbDelObject ) - delete mpNode; -} - -void TextUndoDelPara::Undo() -{ - GetTextEngine()->InsertContent( mpNode, mnPara ); - mbDelObject = sal_False; // gehoert wieder der Engine - - if ( GetView() ) - { - TextSelection aSel( TextPaM( mnPara, 0 ), TextPaM( mnPara, mpNode->GetText().Len() ) ); - SetSelection( aSel ); - } -} - -void TextUndoDelPara::Redo() -{ - // pNode stimmt nicht mehr, falls zwischendurch Undos, in denen - // Absaetze verschmolzen sind. - mpNode = GetDoc()->GetNodes().GetObject( mnPara ); - - delete GetTEParaPortions()->GetObject( mnPara ); - GetTEParaPortions()->Remove( mnPara ); - - // Node nicht loeschen, haengt im Undo! - GetDoc()->GetNodes().Remove( mnPara ); - GetTextEngine()->ImpParagraphRemoved( mnPara ); - - mbDelObject = sal_True; // gehoert wieder dem Undo - - sal_uLong nParas = GetDoc()->GetNodes().Count(); - sal_uLong n = mnPara < nParas ? mnPara : (nParas-1); - TextNode* pN = GetDoc()->GetNodes().GetObject( n ); - TextPaM aPaM( n, pN->GetText().Len() ); - SetSelection( aPaM ); -} - -// ----------------------------------------------------------------------- -// TextUndoConnectParas -// ------------------------------------------------------------------------ -TextUndoConnectParas::TextUndoConnectParas( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos ) - : TextUndo( pTextEngine ) -{ - mnPara = nPara; - mnSepPos = nPos; -} - -TextUndoConnectParas::~TextUndoConnectParas() -{ -} - -void TextUndoConnectParas::Undo() -{ - TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos ); - SetSelection( aPaM ); -} - -void TextUndoConnectParas::Redo() -{ - TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara ); - SetSelection( aPaM ); -} - - -TextUndoSplitPara::TextUndoSplitPara( TextEngine* pTextEngine, sal_uLong nPara, sal_uInt16 nPos ) - : TextUndo( pTextEngine ) -{ - mnPara = nPara; - mnSepPos = nPos; -} - -TextUndoSplitPara::~TextUndoSplitPara() -{ -} - -void TextUndoSplitPara::Undo() -{ - TextPaM aPaM = GetTextEngine()->ConnectContents( mnPara ); - SetSelection( aPaM ); -} - -void TextUndoSplitPara::Redo() -{ - TextPaM aPaM = GetTextEngine()->SplitContent( mnPara, mnSepPos ); - SetSelection( aPaM ); -} - - -TextUndoInsertChars::TextUndoInsertChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr ) - : TextUndo( pTextEngine ), - maTextPaM( rTextPaM ), maText( rStr ) -{ -} - -void TextUndoInsertChars::Undo() -{ - TextSelection aSel( maTextPaM, maTextPaM ); - aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len(); - TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel ); - SetSelection( aPaM ); -} - -void TextUndoInsertChars::Redo() -{ - TextSelection aSel( maTextPaM, maTextPaM ); - GetTextEngine()->ImpInsertText( aSel, maText ); - TextPaM aNewPaM( maTextPaM ); - aNewPaM.GetIndex() = aNewPaM.GetIndex() + maText.Len(); - SetSelection( TextSelection( aSel.GetStart(), aNewPaM ) ); -} - -sal_Bool TextUndoInsertChars::Merge( SfxUndoAction* pNextAction ) -{ - if ( !pNextAction->ISA( TextUndoInsertChars ) ) - return sal_False; - - TextUndoInsertChars* pNext = (TextUndoInsertChars*)pNextAction; - - if ( maTextPaM.GetPara() != pNext->maTextPaM.GetPara() ) - return sal_False; - - if ( ( maTextPaM.GetIndex() + maText.Len() ) == pNext->maTextPaM.GetIndex() ) - { - maText += pNext->maText; - return sal_True; - } - return sal_False; -} - - -TextUndoRemoveChars::TextUndoRemoveChars( TextEngine* pTextEngine, const TextPaM& rTextPaM, const XubString& rStr ) - : TextUndo( pTextEngine ), - maTextPaM( rTextPaM ), maText( rStr ) -{ -} - -void TextUndoRemoveChars::Undo() -{ - TextSelection aSel( maTextPaM, maTextPaM ); - GetTextEngine()->ImpInsertText( aSel, maText ); - aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len(); - SetSelection( aSel ); -} - -void TextUndoRemoveChars::Redo() -{ - TextSelection aSel( maTextPaM, maTextPaM ); - aSel.GetEnd().GetIndex() = aSel.GetEnd().GetIndex() + maText.Len(); - TextPaM aPaM = GetTextEngine()->ImpDeleteText( aSel ); - SetSelection( aPaM ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textundo.hxx b/svtools/source/edit/textundo.hxx deleted file mode 100644 index f86f87763097..000000000000 --- a/svtools/source/edit/textundo.hxx +++ /dev/null @@ -1,85 +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. - * - ************************************************************************/ -#ifndef _TEXTUNDO_HXX -#define _TEXTUNDO_HXX - -#include <svl/undo.hxx> - -class TextEngine; - -class TextUndoManager : public SfxUndoManager -{ - TextEngine* mpTextEngine; - -protected: - - void UndoRedoStart(); - void UndoRedoEnd(); - - TextView* GetView() const { return mpTextEngine->GetActiveView(); } - -public: - TextUndoManager( TextEngine* pTextEngine ); - ~TextUndoManager(); - - using SfxUndoManager::Undo; - virtual sal_Bool Undo(); - using SfxUndoManager::Redo; - virtual sal_Bool Redo(); - -}; - -class TextUndo : public SfxUndoAction -{ -private: - TextEngine* mpTextEngine; - -protected: - - TextView* GetView() const { return mpTextEngine->GetActiveView(); } - void SetSelection( const TextSelection& rSel ); - - TextDoc* GetDoc() const { return mpTextEngine->mpDoc; } - TEParaPortions* GetTEParaPortions() const { return mpTextEngine->mpTEParaPortions; } - -public: - TYPEINFO(); - TextUndo( TextEngine* pTextEngine ); - virtual ~TextUndo(); - - TextEngine* GetTextEngine() const { return mpTextEngine; } - - virtual void Undo() = 0; - virtual void Redo() = 0; - - virtual rtl::OUString GetComment() const; -}; - -#endif // _TEXTUNDO_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textview.cxx b/svtools/source/edit/textview.cxx deleted file mode 100644 index 40a67743f4bb..000000000000 --- a/svtools/source/edit/textview.cxx +++ /dev/null @@ -1,2378 +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. - * - ************************************************************************/ - -#include <svtools/textview.hxx> -#include <svtools/texteng.hxx> -#include <textdoc.hxx> -#include <svtools/textdata.hxx> -#include <textdat2.hxx> - -#include <svl/undo.hxx> -#include <vcl/cursor.hxx> -#include <vcl/window.hxx> -#include <vcl/svapp.hxx> -#include <tools/stream.hxx> - -#include <sot/formats.hxx> -#include <svl/urlbmk.hxx> - -#include <com/sun/star/i18n/XBreakIterator.hpp> - -#include <com/sun/star/i18n/CharacterIteratorMode.hpp> - -#include <com/sun/star/i18n/WordType.hpp> -#include <cppuhelper/weak.hxx> -#include <vcl/unohelp.hxx> -#include <com/sun/star/datatransfer/XTransferable.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> -#include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> - -#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp> -#include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp> -#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> - -#include <vcl/edit.hxx> - - -#include <sot/exchange.hxx> - -#include <osl/mutex.hxx> - - -using namespace ::com::sun::star; - -class TETextDataObject : public ::com::sun::star::datatransfer::XTransferable, - public ::cppu::OWeakObject - -{ -private: - String maText; - SvMemoryStream maHTMLStream; - -public: - TETextDataObject( const String& rText ); - ~TETextDataObject(); - - String& GetText() { return maText; } - SvMemoryStream& GetHTMLStream() { return maHTMLStream; } - - // ::com::sun::star::uno::XInterface - ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); - void SAL_CALL acquire() throw() { OWeakObject::acquire(); } - void SAL_CALL release() throw() { OWeakObject::release(); } - - // ::com::sun::star::datatransfer::XTransferable - ::com::sun::star::uno::Any SAL_CALL getTransferData( const ::com::sun::star::datatransfer::DataFlavor& aFlavor ) throw(::com::sun::star::datatransfer::UnsupportedFlavorException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); - ::com::sun::star::uno::Sequence< ::com::sun::star::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors( ) throw(::com::sun::star::uno::RuntimeException); - sal_Bool SAL_CALL isDataFlavorSupported( const ::com::sun::star::datatransfer::DataFlavor& aFlavor ) throw(::com::sun::star::uno::RuntimeException); -}; - -TETextDataObject::TETextDataObject( const String& rText ) : maText( rText ) -{ -} - -TETextDataObject::~TETextDataObject() -{ -} - -// uno::XInterface -uno::Any TETextDataObject::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException) -{ - uno::Any aRet = ::cppu::queryInterface( rType, (static_cast< datatransfer::XTransferable* >(this)) ); - return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType )); -} - -// datatransfer::XTransferable -uno::Any TETextDataObject::getTransferData( const datatransfer::DataFlavor& rFlavor ) throw(datatransfer::UnsupportedFlavorException, io::IOException, uno::RuntimeException) -{ - uno::Any aAny; - - sal_uLong nT = SotExchange::GetFormat( rFlavor ); - if ( nT == SOT_FORMAT_STRING ) - { - aAny <<= (::rtl::OUString)GetText(); - } - else if ( nT == SOT_FORMATSTR_ID_HTML ) - { - GetHTMLStream().Seek( STREAM_SEEK_TO_END ); - sal_uLong nLen = GetHTMLStream().Tell(); - GetHTMLStream().Seek(0); - - uno::Sequence< sal_Int8 > aSeq( nLen ); - memcpy( aSeq.getArray(), GetHTMLStream().GetData(), nLen ); - aAny <<= aSeq; - } - else - { - throw datatransfer::UnsupportedFlavorException(); - } - return aAny; -} - -uno::Sequence< datatransfer::DataFlavor > TETextDataObject::getTransferDataFlavors( ) throw(uno::RuntimeException) -{ - GetHTMLStream().Seek( STREAM_SEEK_TO_END ); - sal_Bool bHTML = GetHTMLStream().Tell() > 0; - uno::Sequence< datatransfer::DataFlavor > aDataFlavors( bHTML ? 2 : 1 ); - SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aDataFlavors.getArray()[0] ); - if ( bHTML ) - SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_HTML, aDataFlavors.getArray()[1] ); - return aDataFlavors; -} - -sal_Bool TETextDataObject::isDataFlavorSupported( const datatransfer::DataFlavor& rFlavor ) throw(uno::RuntimeException) -{ - sal_uLong nT = SotExchange::GetFormat( rFlavor ); - return ( nT == SOT_FORMAT_STRING ); -} - -struct ImpTextView -{ - TextEngine* mpTextEngine; - - Window* mpWindow; - TextSelection maSelection; - Point maStartDocPos; -// TextPaM maMBDownPaM; - - Cursor* mpCursor; - - TextDDInfo* mpDDInfo; - - VirtualDevice* mpVirtDev; - - SelectionEngine* mpSelEngine; - TextSelFunctionSet* mpSelFuncSet; - - ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSourceListener > mxDnDListener; - - sal_uInt16 mnTravelXPos; - - sal_Bool mbAutoScroll : 1; - sal_Bool mbInsertMode : 1; - sal_Bool mbReadOnly : 1; - sal_Bool mbPaintSelection : 1; - sal_Bool mbAutoIndent : 1; - sal_Bool mbHighlightSelection : 1; - sal_Bool mbCursorEnabled : 1; - sal_Bool mbClickedInSelection : 1; - sal_Bool mbSupportProtectAttribute : 1; - bool mbCursorAtEndOfLine; -}; - -// ------------------------------------------------------------------------- -// (+) class TextView -// ------------------------------------------------------------------------- -TextView::TextView( TextEngine* pEng, Window* pWindow ) : - mpImpl(new ImpTextView) -{ - pWindow->EnableRTL( sal_False ); - - mpImpl->mpWindow = pWindow; - mpImpl->mpTextEngine = pEng; - mpImpl->mpVirtDev = NULL; - - mpImpl->mbPaintSelection = sal_True; - mpImpl->mbAutoScroll = sal_True; - mpImpl->mbInsertMode = sal_True; - mpImpl->mbReadOnly = sal_False; - mpImpl->mbHighlightSelection = sal_False; - mpImpl->mbAutoIndent = sal_False; - mpImpl->mbCursorEnabled = sal_True; - mpImpl->mbClickedInSelection = sal_False; - mpImpl->mbSupportProtectAttribute = sal_False; - mpImpl->mbCursorAtEndOfLine = false; -// mbInSelection = sal_False; - - mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW; - - mpImpl->mpSelFuncSet = new TextSelFunctionSet( this ); - mpImpl->mpSelEngine = new SelectionEngine( mpImpl->mpWindow, mpImpl->mpSelFuncSet ); - mpImpl->mpSelEngine->SetSelectionMode( RANGE_SELECTION ); - mpImpl->mpSelEngine->EnableDrag( sal_True ); - - mpImpl->mpCursor = new Cursor; - mpImpl->mpCursor->Show(); - pWindow->SetCursor( mpImpl->mpCursor ); - pWindow->SetInputContext( InputContext( pEng->GetFont(), INPUTCONTEXT_TEXT|INPUTCONTEXT_EXTTEXTINPUT ) ); - - if ( pWindow->GetSettings().GetStyleSettings().GetSelectionOptions() & SELECTION_OPTION_INVERT ) - mpImpl->mbHighlightSelection = sal_True; - - pWindow->SetLineColor(); - - mpImpl->mpDDInfo = NULL; - - if ( pWindow->GetDragGestureRecognizer().is() ) - { - vcl::unohelper::DragAndDropWrapper* pDnDWrapper = new vcl::unohelper::DragAndDropWrapper( this ); - mpImpl->mxDnDListener = pDnDWrapper; - - uno::Reference< datatransfer::dnd::XDragGestureListener> xDGL( mpImpl->mxDnDListener, uno::UNO_QUERY ); - pWindow->GetDragGestureRecognizer()->addDragGestureListener( xDGL ); - uno::Reference< datatransfer::dnd::XDropTargetListener> xDTL( xDGL, uno::UNO_QUERY ); - pWindow->GetDropTarget()->addDropTargetListener( xDTL ); - pWindow->GetDropTarget()->setActive( sal_True ); - pWindow->GetDropTarget()->setDefaultActions( datatransfer::dnd::DNDConstants::ACTION_COPY_OR_MOVE ); - } -} - -TextView::~TextView() -{ - delete mpImpl->mpSelEngine; - delete mpImpl->mpSelFuncSet; - delete mpImpl->mpVirtDev; - - if ( mpImpl->mpWindow->GetCursor() == mpImpl->mpCursor ) - mpImpl->mpWindow->SetCursor( 0 ); - delete mpImpl->mpCursor; - delete mpImpl->mpDDInfo; - delete mpImpl; -} - -void TextView::Invalidate() -{ - mpImpl->mpWindow->Invalidate(); -} - -void TextView::SetSelection( const TextSelection& rTextSel, sal_Bool bGotoCursor ) -{ - // Falls jemand gerade ein leeres Attribut hinterlassen hat, - // und dann der Outliner die Selektion manipulitert: - if ( !mpImpl->maSelection.HasRange() ) - mpImpl->mpTextEngine->CursorMoved( mpImpl->maSelection.GetStart().GetPara() ); - - // Wenn nach einem KeyInput die Selection manipuliert wird: - mpImpl->mpTextEngine->CheckIdleFormatter(); - - HideSelection(); - TextSelection aNewSel( rTextSel ); - mpImpl->mpTextEngine->ValidateSelection( aNewSel ); - ImpSetSelection( aNewSel ); - ShowSelection(); - ShowCursor( bGotoCursor ); -} - -void TextView::SetSelection( const TextSelection& rTextSel ) -{ - SetSelection( rTextSel, mpImpl->mbAutoScroll ); -} - -const TextSelection& TextView::GetSelection() const -{ - return mpImpl->maSelection; -} -TextSelection& TextView::GetSelection() -{ - return mpImpl->maSelection; -} - -void TextView::DeleteSelected() -{ -// HideSelection(); - - mpImpl->mpTextEngine->UndoActionStart(); - TextPaM aPaM = mpImpl->mpTextEngine->ImpDeleteText( mpImpl->maSelection ); - mpImpl->mpTextEngine->UndoActionEnd(); - - ImpSetSelection( aPaM ); - mpImpl->mpTextEngine->FormatAndUpdate( this ); - ShowCursor(); -} - -void TextView::ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange, TextSelection const* pSelection ) -{ - if ( !mpImpl->mbPaintSelection ) - pSelection = NULL; - else - { - // Richtige Hintergrundfarbe einstellen. - // Ich bekomme leider nicht mit, ob sich diese inzwischen geaendert hat. - Font aFont = mpImpl->mpTextEngine->GetFont(); - Color aColor = pOut->GetBackground().GetColor(); - aColor.SetTransparency( 0 ); - if ( aColor != aFont.GetFillColor() ) - { - if( aFont.IsTransparent() ) - aColor = Color( COL_TRANSPARENT ); - aFont.SetFillColor( aColor ); - mpImpl->mpTextEngine->maFont = aFont; - } - } - - mpImpl->mpTextEngine->ImpPaint( pOut, rStartPos, pPaintArea, pPaintRange, pSelection ); -} - -void TextView::Paint( const Rectangle& rRect ) -{ - ImpPaint( rRect, sal_False ); -} - -void TextView::ImpPaint( const Rectangle& rRect, sal_Bool bUseVirtDev ) -{ - if ( !mpImpl->mpTextEngine->GetUpdateMode() || mpImpl->mpTextEngine->IsInUndo() ) - return; - - TextSelection *pDrawSelection = NULL; - if ( !mpImpl->mbHighlightSelection && mpImpl->maSelection.HasRange() ) - pDrawSelection = &mpImpl->maSelection; - - if ( bUseVirtDev ) - { - VirtualDevice* pVDev = GetVirtualDevice(); - - const Color& rBackgroundColor = mpImpl->mpWindow->GetBackground().GetColor(); - if ( pVDev->GetFillColor() != rBackgroundColor ) - pVDev->SetFillColor( rBackgroundColor ); - if ( pVDev->GetBackground().GetColor() != rBackgroundColor ) - pVDev->SetBackground( rBackgroundColor ); - - sal_Bool bVDevValid = sal_True; - Size aOutSz( pVDev->GetOutputSizePixel() ); - if ( ( aOutSz.Width() < rRect.GetWidth() ) || - ( aOutSz.Height() < rRect.GetHeight() ) ) - { - bVDevValid = pVDev->SetOutputSizePixel( rRect.GetSize() ); - } - else - { - // Das VirtDev kann bei einem Resize sehr gross werden => - // irgendwann mal kleiner machen! - if ( ( aOutSz.Height() > ( rRect.GetHeight() + 20 ) ) || - ( aOutSz.Width() > ( rRect.GetWidth() + 20 ) ) ) - { - bVDevValid = pVDev->SetOutputSizePixel( rRect.GetSize() ); - } - else - { - pVDev->Erase(); - } - } - if ( !bVDevValid ) - { - ImpPaint( rRect, sal_False /* ohne VDev */ ); - return; - } - - Rectangle aTmpRec( Point( 0, 0 ), rRect.GetSize() ); - - Point aDocPos( mpImpl->maStartDocPos.X(), mpImpl->maStartDocPos.Y() + rRect.Top() ); - Point aStartPos = ImpGetOutputStartPos( aDocPos ); - ImpPaint( pVDev, aStartPos, &aTmpRec, NULL, pDrawSelection ); - mpImpl->mpWindow->DrawOutDev( rRect.TopLeft(), rRect.GetSize(), - Point(0,0), rRect.GetSize(), *pVDev ); -// ShowSelection(); - if ( mpImpl->mbHighlightSelection ) - ImpHighlight( mpImpl->maSelection ); - } - else - { - Point aStartPos = ImpGetOutputStartPos( mpImpl->maStartDocPos ); - ImpPaint( mpImpl->mpWindow, aStartPos, &rRect, NULL, pDrawSelection ); - -// ShowSelection(); - if ( mpImpl->mbHighlightSelection ) - ImpHighlight( mpImpl->maSelection ); - } -} - -void TextView::ImpHighlight( const TextSelection& rSel ) -{ - TextSelection aSel( rSel ); - aSel.Justify(); - if ( aSel.HasRange() && !mpImpl->mpTextEngine->IsInUndo() && mpImpl->mpTextEngine->GetUpdateMode() ) - { - mpImpl->mpCursor->Hide(); - - DBG_ASSERT( !mpImpl->mpTextEngine->mpIdleFormatter->IsActive(), "ImpHighlight: Not formatted!" ); - - Rectangle aVisArea( mpImpl->maStartDocPos, mpImpl->mpWindow->GetOutputSizePixel() ); - long nY = 0; - sal_uLong nStartPara = aSel.GetStart().GetPara(); - sal_uLong nEndPara = aSel.GetEnd().GetPara(); - for ( sal_uLong nPara = 0; nPara <= nEndPara; nPara++ ) - { - long nParaHeight = (long)mpImpl->mpTextEngine->CalcParaHeight( nPara ); - if ( ( nPara >= nStartPara ) && ( ( nY + nParaHeight ) > aVisArea.Top() ) ) - { - TEParaPortion* pTEParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( nPara ); - sal_uInt16 nStartLine = 0; - sal_uInt16 nEndLine = pTEParaPortion->GetLines().size() -1; - if ( nPara == nStartPara ) - nStartLine = pTEParaPortion->GetLineNumber( aSel.GetStart().GetIndex(), sal_False ); - if ( nPara == nEndPara ) - nEndLine = pTEParaPortion->GetLineNumber( aSel.GetEnd().GetIndex(), sal_True ); - - // ueber die Zeilen iterieren.... - for ( sal_uInt16 nLine = nStartLine; nLine <= nEndLine; nLine++ ) - { - TextLine* pLine = pTEParaPortion->GetLines()[ nLine ]; - sal_uInt16 nStartIndex = pLine->GetStart(); - sal_uInt16 nEndIndex = pLine->GetEnd(); - if ( ( nPara == nStartPara ) && ( nLine == nStartLine ) ) - nStartIndex = aSel.GetStart().GetIndex(); - if ( ( nPara == nEndPara ) && ( nLine == nEndLine ) ) - nEndIndex = aSel.GetEnd().GetIndex(); - - // Kann passieren, wenn am Anfang einer umgebrochenen Zeile. - if ( nEndIndex < nStartIndex ) - nEndIndex = nStartIndex; - - Rectangle aTmpRec( mpImpl->mpTextEngine->GetEditCursor( TextPaM( nPara, nStartIndex ), sal_False ) ); - aTmpRec.Top() += nY; - aTmpRec.Bottom() += nY; - Point aTopLeft( aTmpRec.TopLeft() ); - - aTmpRec = mpImpl->mpTextEngine->GetEditCursor( TextPaM( nPara, nEndIndex ), sal_True ); - aTmpRec.Top() += nY; - aTmpRec.Bottom() += nY; - Point aBottomRight( aTmpRec.BottomRight() ); - aBottomRight.X()--; - - // Nur Painten, wenn im sichtbaren Bereich... - if ( ( aTopLeft.X() < aBottomRight.X() ) && ( aBottomRight.Y() >= aVisArea.Top() ) ) - { - Point aPnt1( GetWindowPos( aTopLeft ) ); - Point aPnt2( GetWindowPos( aBottomRight ) ); - - Rectangle aRect( aPnt1, aPnt2 ); - mpImpl->mpWindow->Invert( aRect ); - } - } - } - nY += nParaHeight; - - if ( nY >= aVisArea.Bottom() ) - break; - } - } -} - -void TextView::ImpSetSelection( const TextSelection& rSelection ) -{ - if ( rSelection != mpImpl->maSelection ) - { - mpImpl->maSelection = rSelection; - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_VIEWSELECTIONCHANGED ) ); - } -} - -void TextView::ShowSelection() -{ - ImpShowHideSelection( sal_True ); -} - -void TextView::HideSelection() -{ - ImpShowHideSelection( sal_False ); -} - -void TextView::ShowSelection( const TextSelection& rRange ) -{ - ImpShowHideSelection( sal_True, &rRange ); -} - -void TextView::ImpShowHideSelection( sal_Bool bShow, const TextSelection* pRange ) -{ - const TextSelection* pRangeOrSelection = pRange ? pRange : &mpImpl->maSelection; - - if ( pRangeOrSelection->HasRange() ) - { - if ( mpImpl->mbHighlightSelection ) - { - ImpHighlight( *pRangeOrSelection ); - } - else - { - if( mpImpl->mpWindow->IsPaintTransparent() ) - mpImpl->mpWindow->Invalidate(); - else - { - Rectangle aOutArea( Point( 0, 0 ), mpImpl->mpWindow->GetOutputSizePixel() ); - Point aStartPos( ImpGetOutputStartPos( mpImpl->maStartDocPos ) ); - TextSelection aRange( *pRangeOrSelection ); - aRange.Justify(); - sal_Bool bVisCursor = mpImpl->mpCursor->IsVisible(); - mpImpl->mpCursor->Hide(); - ImpPaint( mpImpl->mpWindow, aStartPos, &aOutArea, &aRange, bShow ? &mpImpl->maSelection : NULL ); - if ( bVisCursor ) - mpImpl->mpCursor->Show(); - } - } - } -} - -VirtualDevice* TextView::GetVirtualDevice() -{ - if ( !mpImpl->mpVirtDev ) - { - mpImpl->mpVirtDev = new VirtualDevice; - mpImpl->mpVirtDev->SetLineColor(); - } - return mpImpl->mpVirtDev; -} - -void TextView::EraseVirtualDevice() -{ - delete mpImpl->mpVirtDev; - mpImpl->mpVirtDev = 0; -} - -sal_Bool TextView::KeyInput( const KeyEvent& rKeyEvent ) -{ - sal_Bool bDone = sal_True; - sal_Bool bModified = sal_False; - sal_Bool bMoved = sal_False; - sal_Bool bEndKey = sal_False; // spezielle CursorPosition - sal_Bool bAllowIdle = sal_True; - - // Um zu pruefen ob durch irgendeine Aktion mModified, das lokale - // bModified wird z.B. bei Cut/Paste nicht gesetzt, weil dort an anderen - // Stellen das updaten erfolgt. - sal_Bool bWasModified = mpImpl->mpTextEngine->IsModified(); - mpImpl->mpTextEngine->SetModified( sal_False ); - - TextSelection aCurSel( mpImpl->maSelection ); - TextSelection aOldSel( aCurSel ); - - sal_uInt16 nCode = rKeyEvent.GetKeyCode().GetCode(); - KeyFuncType eFunc = rKeyEvent.GetKeyCode().GetFunction(); - if ( eFunc != KEYFUNC_DONTKNOW ) - { - switch ( eFunc ) - { - case KEYFUNC_CUT: - { - if ( !mpImpl->mbReadOnly ) - Cut(); - } - break; - case KEYFUNC_COPY: - { - Copy(); - } - break; - case KEYFUNC_PASTE: - { - if ( !mpImpl->mbReadOnly ) - Paste(); - } - break; - case KEYFUNC_UNDO: - { - if ( !mpImpl->mbReadOnly ) - Undo(); - } - break; - case KEYFUNC_REDO: - { - if ( !mpImpl->mbReadOnly ) - Redo(); - } - break; - - default: // wird dann evtl. unten bearbeitet. - eFunc = KEYFUNC_DONTKNOW; - } - } - if ( eFunc == KEYFUNC_DONTKNOW ) - { - switch ( nCode ) - { - case KEY_UP: - case KEY_DOWN: - case KEY_LEFT: - case KEY_RIGHT: - case KEY_HOME: - case KEY_END: - case KEY_PAGEUP: - case KEY_PAGEDOWN: - case com::sun::star::awt::Key::MOVE_WORD_FORWARD: - case com::sun::star::awt::Key::SELECT_WORD_FORWARD: - case com::sun::star::awt::Key::MOVE_WORD_BACKWARD: - case com::sun::star::awt::Key::SELECT_WORD_BACKWARD: - case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE: - case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE: - case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE: - case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE: - case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH: - case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH: - case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH: - case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH: - case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT: - case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT: - case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT: - case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT: - { - if ( ( !rKeyEvent.GetKeyCode().IsMod2() || ( nCode == KEY_LEFT ) || ( nCode == KEY_RIGHT ) ) - && !( rKeyEvent.GetKeyCode().IsMod1() && ( nCode == KEY_PAGEUP || nCode == KEY_PAGEDOWN ) ) ) - { - aCurSel = ImpMoveCursor( rKeyEvent ); - if ( aCurSel.HasRange() ) { - uno::Reference<datatransfer::clipboard::XClipboard> aSelection(GetWindow()->GetPrimarySelection()); - Copy( aSelection ); - } - bMoved = sal_True; - if ( nCode == KEY_END ) - bEndKey = sal_True; - } - else - bDone = sal_False; - } - break; - case KEY_BACKSPACE: - case KEY_DELETE: - case com::sun::star::awt::Key::DELETE_WORD_BACKWARD: - case com::sun::star::awt::Key::DELETE_WORD_FORWARD: - case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE: - case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE: - { - if ( !mpImpl->mbReadOnly && !rKeyEvent.GetKeyCode().IsMod2() ) - { - sal_uInt8 nDel = ( nCode == KEY_DELETE ) ? DEL_RIGHT : DEL_LEFT; - sal_uInt8 nMode = rKeyEvent.GetKeyCode().IsMod1() ? DELMODE_RESTOFWORD : DELMODE_SIMPLE; - if ( ( nMode == DELMODE_RESTOFWORD ) && rKeyEvent.GetKeyCode().IsShift() ) - nMode = DELMODE_RESTOFCONTENT; - - switch( nCode ) - { - case com::sun::star::awt::Key::DELETE_WORD_BACKWARD: - nDel = DEL_LEFT; - nMode = DELMODE_RESTOFWORD; - break; - case com::sun::star::awt::Key::DELETE_WORD_FORWARD: - nDel = DEL_RIGHT; - nMode = DELMODE_RESTOFWORD; - break; - case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE: - nDel = DEL_LEFT; - nMode = DELMODE_RESTOFCONTENT; - break; - case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE: - nDel = DEL_RIGHT; - nMode = DELMODE_RESTOFCONTENT; - break; - default: break; - } - - mpImpl->mpTextEngine->UndoActionStart(); - if(mpImpl->mbSupportProtectAttribute) - { - //expand selection to include all protected content - if there is any - const TextCharAttrib* pStartAttr = mpImpl->mpTextEngine->FindCharAttrib( - TextPaM(mpImpl->maSelection.GetStart().GetPara(), - mpImpl->maSelection.GetStart().GetIndex()), - TEXTATTR_PROTECTED ); - const TextCharAttrib* pEndAttr = mpImpl->mpTextEngine->FindCharAttrib( - TextPaM(mpImpl->maSelection.GetEnd().GetPara(), - mpImpl->maSelection.GetEnd().GetIndex()), - TEXTATTR_PROTECTED ); - if(pStartAttr && pStartAttr->GetStart() < mpImpl->maSelection.GetStart().GetIndex()) - { - mpImpl->maSelection.GetStart().GetIndex() = pStartAttr->GetStart(); - } - if(pEndAttr && pEndAttr->GetEnd() > mpImpl->maSelection.GetEnd().GetIndex()) - { - mpImpl->maSelection.GetEnd().GetIndex() = pEndAttr->GetEnd(); - } - } - aCurSel = ImpDelete( nDel, nMode ); - mpImpl->mpTextEngine->UndoActionEnd(); - bModified = sal_True; - bAllowIdle = sal_False; - } - else - bDone = sal_False; - } - break; - case KEY_TAB: - { - if ( !mpImpl->mbReadOnly && !rKeyEvent.GetKeyCode().IsShift() && - !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() && - ImplCheckTextLen( rtl::OUString('x') ) ) - { - aCurSel = mpImpl->mpTextEngine->ImpInsertText( aCurSel, '\t', !IsInsertMode() ); - bModified = sal_True; - } - else - bDone = sal_False; - } - break; - case KEY_RETURN: - { - // Shift-RETURN darf nicht geschluckt werden, weil dann keine - // mehrzeilige Eingabe in Dialogen/Property-Editor moeglich. - if ( !mpImpl->mbReadOnly && !rKeyEvent.GetKeyCode().IsMod1() && - !rKeyEvent.GetKeyCode().IsMod2() && ImplCheckTextLen( rtl::OUString('x') ) ) - { - mpImpl->mpTextEngine->UndoActionStart(); - aCurSel = mpImpl->mpTextEngine->ImpInsertParaBreak( aCurSel ); - if ( mpImpl->mbAutoIndent ) - { - TextNode* pPrev = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aCurSel.GetEnd().GetPara() - 1 ); - sal_uInt16 n = 0; - while ( ( n < pPrev->GetText().Len() ) && ( - ( pPrev->GetText().GetChar( n ) == ' ' ) || - ( pPrev->GetText().GetChar( n ) == '\t' ) ) ) - { - n++; - } - if ( n ) - aCurSel = mpImpl->mpTextEngine->ImpInsertText( aCurSel, pPrev->GetText().Copy( 0, n ) ); - } - mpImpl->mpTextEngine->UndoActionEnd(); - bModified = sal_True; - } - else - bDone = sal_False; - } - break; - case KEY_INSERT: - { - if ( !mpImpl->mbReadOnly ) - SetInsertMode( !IsInsertMode() ); - } - break; - default: - { - if ( TextEngine::IsSimpleCharInput( rKeyEvent ) ) - { - xub_Unicode nCharCode = rKeyEvent.GetCharCode(); - if ( !mpImpl->mbReadOnly && ImplCheckTextLen( rtl::OUString(nCharCode) ) ) // sonst trotzdem das Zeichen schlucken... - { - aCurSel = mpImpl->mpTextEngine->ImpInsertText( nCharCode, aCurSel, !IsInsertMode(), sal_True ); - bModified = sal_True; - } - } - else - bDone = sal_False; - } - } - } - - if ( aCurSel != aOldSel ) // Check if changed, maybe other method already changed mpImpl->maSelection, don't overwrite that! - ImpSetSelection( aCurSel ); - - mpImpl->mpTextEngine->UpdateSelections(); - - if ( ( nCode != KEY_UP ) && ( nCode != KEY_DOWN ) ) - mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW; - - if ( bModified ) - { - // Idle-Formatter nur, wenn AnyInput. - if ( bAllowIdle && Application::AnyInput( VCL_INPUT_KEYBOARD) ) - mpImpl->mpTextEngine->IdleFormatAndUpdate( this ); - else - mpImpl->mpTextEngine->FormatAndUpdate( this); - } - else if ( bMoved ) - { - // Selection wird jetzt gezielt in ImpMoveCursor gemalt. - ImpShowCursor( mpImpl->mbAutoScroll, sal_True, bEndKey ); - } - - if ( mpImpl->mpTextEngine->IsModified() ) - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - else if ( bWasModified ) - mpImpl->mpTextEngine->SetModified( sal_True ); - - return bDone; -} - -void TextView::MouseButtonUp( const MouseEvent& rMouseEvent ) -{ - mpImpl->mbClickedInSelection = sal_False; - mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW; - mpImpl->mpSelEngine->SelMouseButtonUp( rMouseEvent ); - if ( rMouseEvent.IsMiddle() && !IsReadOnly() && - ( GetWindow()->GetSettings().GetMouseSettings().GetMiddleButtonAction() == MOUSE_MIDDLE_PASTESELECTION ) ) - { - uno::Reference<datatransfer::clipboard::XClipboard> aSelection(GetWindow()->GetPrimarySelection()); - Paste( aSelection ); - if ( mpImpl->mpTextEngine->IsModified() ) - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - } - else if ( rMouseEvent.IsLeft() && GetSelection().HasRange() ) - { - uno::Reference<datatransfer::clipboard::XClipboard> aSelection(GetWindow()->GetPrimarySelection()); - Copy( aSelection ); - } -} - -void TextView::MouseButtonDown( const MouseEvent& rMouseEvent ) -{ - mpImpl->mpTextEngine->CheckIdleFormatter(); // Falls schnelles Tippen und MouseButtonDown - mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW; - mpImpl->mbClickedInSelection = IsSelectionAtPoint( rMouseEvent.GetPosPixel() ); - - mpImpl->mpTextEngine->SetActiveView( this ); - - mpImpl->mpSelEngine->SelMouseButtonDown( rMouseEvent ); - - // mbu 20.01.2005 - SelMouseButtonDown() possibly triggers a 'selection changed' - // notification. The appropriate handler could change the current selection, - // which is the case in the MailMerge address block control. To enable select'n'drag - // we need to reevaluate the selection after the notification has been fired. - mpImpl->mbClickedInSelection = IsSelectionAtPoint( rMouseEvent.GetPosPixel() ); - - // Sonderbehandlungen - if ( !rMouseEvent.IsShift() && ( rMouseEvent.GetClicks() >= 2 ) ) - { - if ( rMouseEvent.IsMod2() ) - { - HideSelection(); - ImpSetSelection( mpImpl->maSelection.GetEnd() ); - SetCursorAtPoint( rMouseEvent.GetPosPixel() ); // Wird von SelectionEngine bei MOD2 nicht gesetzt - } - - if ( rMouseEvent.GetClicks() == 2 ) - { - // Wort selektieren - if ( mpImpl->maSelection.GetEnd().GetIndex() < mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection.GetEnd().GetPara() ) ) - { - HideSelection(); - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( mpImpl->maSelection.GetEnd().GetPara() ); - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True ); - TextSelection aNewSel( mpImpl->maSelection ); - aNewSel.GetStart().GetIndex() = (sal_uInt16)aBoundary.startPos; - aNewSel.GetEnd().GetIndex() = (sal_uInt16)aBoundary.endPos; - if(mpImpl->mbSupportProtectAttribute) - { - //expand selection to include all protected content - if there is any - const TextCharAttrib* pStartAttr = mpImpl->mpTextEngine->FindCharAttrib( - TextPaM(aNewSel.GetStart().GetPara(), - (sal_uInt16)aBoundary.startPos), - TEXTATTR_PROTECTED ); - const TextCharAttrib* pEndAttr = mpImpl->mpTextEngine->FindCharAttrib( - TextPaM(aNewSel.GetEnd().GetPara(), - (sal_uInt16)aBoundary.endPos), - TEXTATTR_PROTECTED ); - if(pStartAttr && pStartAttr->GetStart() < aNewSel.GetStart().GetIndex()) - { - aNewSel.GetStart().GetIndex() = pStartAttr->GetStart(); - } - if(pEndAttr && pEndAttr->GetEnd() > aNewSel.GetEnd().GetIndex()) - { - aNewSel.GetEnd().GetIndex() = pEndAttr->GetEnd(); - } - } - ImpSetSelection( aNewSel ); - ShowSelection(); - ShowCursor( sal_True, sal_True ); - } - } - else if ( rMouseEvent.GetClicks() == 3 ) - { - // Absatz selektieren - if ( mpImpl->maSelection.GetStart().GetIndex() || ( mpImpl->maSelection.GetEnd().GetIndex() < mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection.GetEnd().GetPara() ) ) ) - { - HideSelection(); - TextSelection aNewSel( mpImpl->maSelection ); - aNewSel.GetStart().GetIndex() = 0; - aNewSel.GetEnd().GetIndex() = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( mpImpl->maSelection.GetEnd().GetPara() )->GetText().Len(); - ImpSetSelection( aNewSel ); - ShowSelection(); - ShowCursor( sal_True, sal_True ); - } - } - } -} - - -void TextView::MouseMove( const MouseEvent& rMouseEvent ) -{ - mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW; - mpImpl->mpSelEngine->SelMouseMove( rMouseEvent ); -} - -void TextView::Command( const CommandEvent& rCEvt ) -{ - mpImpl->mpTextEngine->CheckIdleFormatter(); // Falls schnelles Tippen und MouseButtonDown - mpImpl->mpTextEngine->SetActiveView( this ); - - if ( rCEvt.GetCommand() == COMMAND_STARTEXTTEXTINPUT ) - { - DeleteSelected(); - delete mpImpl->mpTextEngine->mpIMEInfos; - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( GetSelection().GetEnd().GetPara() ); - mpImpl->mpTextEngine->mpIMEInfos = new TEIMEInfos( GetSelection().GetEnd(), pNode->GetText().Copy( GetSelection().GetEnd().GetIndex() ) ); - mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite = !IsInsertMode(); - } - else if ( rCEvt.GetCommand() == COMMAND_ENDEXTTEXTINPUT ) - { - DBG_ASSERT( mpImpl->mpTextEngine->mpIMEInfos, "COMMAND_ENDEXTTEXTINPUT => Kein Start ?" ); - if( mpImpl->mpTextEngine->mpIMEInfos ) - { - TEParaPortion* pPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara() ); - pPortion->MarkSelectionInvalid( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex(), 0 ); - - sal_Bool bInsertMode = !mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite; - - delete mpImpl->mpTextEngine->mpIMEInfos; - mpImpl->mpTextEngine->mpIMEInfos = NULL; - - mpImpl->mpTextEngine->FormatAndUpdate( this ); - - SetInsertMode( bInsertMode ); - - if ( mpImpl->mpTextEngine->IsModified() ) - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - } - } - else if ( rCEvt.GetCommand() == COMMAND_EXTTEXTINPUT ) - { - DBG_ASSERT( mpImpl->mpTextEngine->mpIMEInfos, "COMMAND_EXTTEXTINPUT => Kein Start ?" ); - if( mpImpl->mpTextEngine->mpIMEInfos ) - { - const CommandExtTextInputData* pData = rCEvt.GetExtTextInputData(); - - if ( !pData->IsOnlyCursorChanged() ) - { - TextSelection aSelect( mpImpl->mpTextEngine->mpIMEInfos->aPos ); - aSelect.GetEnd().GetIndex() = aSelect.GetEnd().GetIndex() + mpImpl->mpTextEngine->mpIMEInfos->nLen; - aSelect = mpImpl->mpTextEngine->ImpDeleteText( aSelect ); - aSelect = mpImpl->mpTextEngine->ImpInsertText( aSelect, pData->GetText() ); - - if ( mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite ) - { - sal_uInt16 nOldIMETextLen = mpImpl->mpTextEngine->mpIMEInfos->nLen; - sal_uInt16 nNewIMETextLen = pData->GetText().Len(); - - if ( ( nOldIMETextLen > nNewIMETextLen ) && - ( nNewIMETextLen < mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() ) ) - { - // restore old characters - sal_uInt16 nRestore = nOldIMETextLen - nNewIMETextLen; - TextPaM aPaM( mpImpl->mpTextEngine->mpIMEInfos->aPos ); - aPaM.GetIndex() = aPaM.GetIndex() + nNewIMETextLen; - mpImpl->mpTextEngine->ImpInsertText( aPaM, mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Copy( nNewIMETextLen, nRestore ) ); - } - else if ( ( nOldIMETextLen < nNewIMETextLen ) && - ( nOldIMETextLen < mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() ) ) - { - // overwrite - sal_uInt16 nOverwrite = nNewIMETextLen - nOldIMETextLen; - if ( ( nOldIMETextLen + nOverwrite ) > mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() ) - nOverwrite = mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() - nOldIMETextLen; - DBG_ASSERT( nOverwrite && (nOverwrite < 0xFF00), "IME Overwrite?!" ); - TextPaM aPaM( mpImpl->mpTextEngine->mpIMEInfos->aPos ); - aPaM.GetIndex() = aPaM.GetIndex() + nNewIMETextLen; - TextSelection aSel( aPaM ); - aSel.GetEnd().GetIndex() = - aSel.GetEnd().GetIndex() + nOverwrite; - mpImpl->mpTextEngine->ImpDeleteText( aSel ); - } - } - - if ( pData->GetTextAttr() ) - { - mpImpl->mpTextEngine->mpIMEInfos->CopyAttribs( pData->GetTextAttr(), pData->GetText().Len() ); - mpImpl->mpTextEngine->mpIMEInfos->bCursor = pData->IsCursorVisible(); - } - else - { - mpImpl->mpTextEngine->mpIMEInfos->DestroyAttribs(); - } - - TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara() ); - pPPortion->MarkSelectionInvalid( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex(), 0 ); - mpImpl->mpTextEngine->FormatAndUpdate( this ); - } - - TextSelection aNewSel = TextPaM( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara(), mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex()+pData->GetCursorPos() ); - SetSelection( aNewSel ); - SetInsertMode( !pData->IsCursorOverwrite() ); - - if ( pData->IsCursorVisible() ) - ShowCursor(); - else - HideCursor(); - } - } - else if ( rCEvt.GetCommand() == COMMAND_CURSORPOS ) - { - if ( mpImpl->mpTextEngine->mpIMEInfos && mpImpl->mpTextEngine->mpIMEInfos->nLen ) - { - TextPaM aPaM( GetSelection().GetEnd() ); - Rectangle aR1 = mpImpl->mpTextEngine->PaMtoEditCursor( aPaM ); - - sal_uInt16 nInputEnd = mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex() + mpImpl->mpTextEngine->mpIMEInfos->nLen; - - if ( !mpImpl->mpTextEngine->IsFormatted() ) - mpImpl->mpTextEngine->FormatDoc(); - - TEParaPortion* pParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() ); - sal_uInt16 nLine = pParaPortion->GetLineNumber( aPaM.GetIndex(), sal_True ); - TextLine* pLine = pParaPortion->GetLines()[ nLine ]; - if ( pLine && ( nInputEnd > pLine->GetEnd() ) ) - nInputEnd = pLine->GetEnd(); - Rectangle aR2 = mpImpl->mpTextEngine->PaMtoEditCursor( TextPaM( aPaM.GetPara(), nInputEnd ) ); - - long nWidth = aR2.Left()-aR1.Right(); - aR1.Move( -GetStartDocPos().X(), -GetStartDocPos().Y() ); - GetWindow()->SetCursorRect( &aR1, nWidth ); - } - else - { - GetWindow()->SetCursorRect(); - } - } - else - { - mpImpl->mpSelEngine->Command( rCEvt ); - } -} - -void TextView::ShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor ) -{ - // Die Einstellung hat mehr Gewicht: - if ( !mpImpl->mbAutoScroll ) - bGotoCursor = sal_False; - ImpShowCursor( bGotoCursor, bForceVisCursor, sal_False ); -} - -void TextView::HideCursor() -{ - mpImpl->mpCursor->Hide(); -} - -void TextView::Scroll( long ndX, long ndY ) -{ - DBG_ASSERT( mpImpl->mpTextEngine->IsFormatted(), "Scroll: Nicht formatiert!" ); - - if ( !ndX && !ndY ) - return; - - Point aNewStartPos( mpImpl->maStartDocPos ); - - // Vertical: - aNewStartPos.Y() -= ndY; - if ( aNewStartPos.Y() < 0 ) - aNewStartPos.Y() = 0; - - // Horizontal: - aNewStartPos.X() -= ndX; - if ( aNewStartPos.X() < 0 ) - aNewStartPos.X() = 0; - - long nDiffX = mpImpl->maStartDocPos.X() - aNewStartPos.X(); - long nDiffY = mpImpl->maStartDocPos.Y() - aNewStartPos.Y(); - - if ( nDiffX || nDiffY ) - { - sal_Bool bVisCursor = mpImpl->mpCursor->IsVisible(); - mpImpl->mpCursor->Hide(); - mpImpl->mpWindow->Update(); - mpImpl->maStartDocPos = aNewStartPos; - - if ( mpImpl->mpTextEngine->IsRightToLeft() ) - nDiffX = -nDiffX; - mpImpl->mpWindow->Scroll( nDiffX, nDiffY ); - mpImpl->mpWindow->Update(); - mpImpl->mpCursor->SetPos( mpImpl->mpCursor->GetPos() + Point( nDiffX, nDiffY ) ); - if ( bVisCursor && !mpImpl->mbReadOnly ) - mpImpl->mpCursor->Show(); - } - - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_VIEWSCROLLED ) ); -} - -void TextView::Undo() -{ - mpImpl->mpTextEngine->SetActiveView( this ); - mpImpl->mpTextEngine->GetUndoManager().Undo(); -} - -void TextView::Redo() -{ - mpImpl->mpTextEngine->SetActiveView( this ); - mpImpl->mpTextEngine->GetUndoManager().Redo(); -} - -void TextView::Cut() -{ - mpImpl->mpTextEngine->UndoActionStart(); - Copy(); - DeleteSelected(); - mpImpl->mpTextEngine->UndoActionEnd(); -} - -void TextView::Copy( uno::Reference< datatransfer::clipboard::XClipboard >& rxClipboard ) -{ - if ( rxClipboard.is() ) - { - TETextDataObject* pDataObj = new TETextDataObject( GetSelected() ); - - if ( mpImpl->mpTextEngine->HasAttrib( TEXTATTR_HYPERLINK ) ) // Dann auch als HTML - mpImpl->mpTextEngine->Write( pDataObj->GetHTMLStream(), &mpImpl->maSelection, sal_True ); - - const sal_uInt32 nRef = Application::ReleaseSolarMutex(); - - try - { - rxClipboard->setContents( pDataObj, NULL ); - - uno::Reference< datatransfer::clipboard::XFlushableClipboard > xFlushableClipboard( rxClipboard, uno::UNO_QUERY ); - if( xFlushableClipboard.is() ) - xFlushableClipboard->flushClipboard(); - } - catch( const ::com::sun::star::uno::Exception& ) - { - } - - Application::AcquireSolarMutex( nRef ); - } -} - -void TextView::Copy() -{ - uno::Reference<datatransfer::clipboard::XClipboard> aClipboard(GetWindow()->GetClipboard()); - Copy( aClipboard ); -} - -void TextView::Paste( uno::Reference< datatransfer::clipboard::XClipboard >& rxClipboard ) -{ - if ( rxClipboard.is() ) - { - uno::Reference< datatransfer::XTransferable > xDataObj; - - const sal_uInt32 nRef = Application::ReleaseSolarMutex(); - - try - { - xDataObj = rxClipboard->getContents(); - } - catch( const ::com::sun::star::uno::Exception& ) - { - } - - Application::AcquireSolarMutex( nRef ); - - if ( xDataObj.is() ) - { - datatransfer::DataFlavor aFlavor; - SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor ); - if ( xDataObj->isDataFlavorSupported( aFlavor ) ) - { - try - { - uno::Any aData = xDataObj->getTransferData( aFlavor ); - ::rtl::OUString aText; - aData >>= aText; - bool bWasTruncated = false; - if( mpImpl->mpTextEngine->GetMaxTextLen() != 0 ) - bWasTruncated = ImplTruncateNewText( aText ); - InsertNewText( aText, sal_False ); - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - - if( bWasTruncated ) - Edit::ShowTruncationWarning( mpImpl->mpWindow ); - } - catch( const ::com::sun::star::datatransfer::UnsupportedFlavorException& ) - { - } - } - } - } -} - -void TextView::Paste() -{ - uno::Reference<datatransfer::clipboard::XClipboard> aClipboard(GetWindow()->GetClipboard()); - Paste( aClipboard ); -} - -String TextView::GetSelected() -{ - return GetSelected( GetSystemLineEnd() ); -} - -String TextView::GetSelected( LineEnd aSeparator ) -{ - return mpImpl->mpTextEngine->GetText( mpImpl->maSelection, aSeparator ); -} - -void TextView::SetInsertMode( sal_Bool bInsert ) -{ - if ( mpImpl->mbInsertMode != bInsert ) - { - mpImpl->mbInsertMode = bInsert; - ShowCursor( mpImpl->mbAutoScroll, sal_False ); - } -} - -void TextView::SetReadOnly( sal_Bool bReadOnly ) -{ - if ( mpImpl->mbReadOnly != bReadOnly ) - { - mpImpl->mbReadOnly = bReadOnly; - if ( !mpImpl->mbReadOnly ) - ShowCursor( mpImpl->mbAutoScroll, sal_False ); - else - HideCursor(); - - GetWindow()->SetInputContext( InputContext( mpImpl->mpTextEngine->GetFont(), bReadOnly ? INPUTCONTEXT_TEXT|INPUTCONTEXT_EXTTEXTINPUT : 0 ) ); - } -} - -TextSelection TextView::ImpMoveCursor( const KeyEvent& rKeyEvent ) -{ - // Eigentlich nur bei Up/Down noetig, aber was solls. - mpImpl->mpTextEngine->CheckIdleFormatter(); - - TextPaM aPaM( mpImpl->maSelection.GetEnd() ); - TextPaM aOldEnd( aPaM ); - - TextDirectionality eTextDirection = TextDirectionality_LeftToRight_TopToBottom; - if ( mpImpl->mpTextEngine->IsRightToLeft() ) - eTextDirection = TextDirectionality_RightToLeft_TopToBottom; - - KeyEvent aTranslatedKeyEvent = rKeyEvent.LogicalTextDirectionality( eTextDirection ); - - sal_Bool bCtrl = aTranslatedKeyEvent.GetKeyCode().IsMod1() ? sal_True : sal_False; - sal_uInt16 nCode = aTranslatedKeyEvent.GetKeyCode().GetCode(); - - bool bSelect = aTranslatedKeyEvent.GetKeyCode().IsShift(); - switch ( nCode ) - { - case KEY_UP: aPaM = CursorUp( aPaM ); - break; - case KEY_DOWN: aPaM = CursorDown( aPaM ); - break; - case KEY_HOME: aPaM = bCtrl ? CursorStartOfDoc() : CursorStartOfLine( aPaM ); - break; - case KEY_END: aPaM = bCtrl ? CursorEndOfDoc() : CursorEndOfLine( aPaM ); - break; - case KEY_PAGEUP: aPaM = bCtrl ? CursorStartOfDoc() : PageUp( aPaM ); - break; - case KEY_PAGEDOWN: aPaM = bCtrl ? CursorEndOfDoc() : PageDown( aPaM ); - break; - case KEY_LEFT: aPaM = bCtrl ? CursorWordLeft( aPaM ) : CursorLeft( aPaM, aTranslatedKeyEvent.GetKeyCode().IsMod2() ? (sal_uInt16)i18n::CharacterIteratorMode::SKIPCHARACTER : (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL ); - break; - case KEY_RIGHT: aPaM = bCtrl ? CursorWordRight( aPaM ) : CursorRight( aPaM, aTranslatedKeyEvent.GetKeyCode().IsMod2() ? (sal_uInt16)i18n::CharacterIteratorMode::SKIPCHARACTER : (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL ); - break; - case com::sun::star::awt::Key::SELECT_WORD_FORWARD: - bSelect = true; // fallthrough intentional - case com::sun::star::awt::Key::MOVE_WORD_FORWARD: - aPaM = CursorWordRight( aPaM ); - break; - case com::sun::star::awt::Key::SELECT_WORD_BACKWARD: - bSelect = true; // fallthrough intentional - case com::sun::star::awt::Key::MOVE_WORD_BACKWARD: - aPaM = CursorWordLeft( aPaM ); - break; - case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE: - bSelect = true; // fallthrough intentional - case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE: - aPaM = CursorStartOfLine( aPaM ); - break; - case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE: - bSelect = true; // fallthrough intentional - case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE: - aPaM = CursorEndOfLine( aPaM ); - break; - case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH: - bSelect = true; // falltthrough intentional - case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH: - aPaM = CursorStartOfParagraph( aPaM ); - break; - case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH: - bSelect = true; // falltthrough intentional - case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH: - aPaM = CursorEndOfParagraph( aPaM ); - break; - case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT: - bSelect = true; // falltthrough intentional - case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT: - aPaM = CursorStartOfDoc(); - break; - case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT: - bSelect = true; // falltthrough intentional - case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT: - aPaM = CursorEndOfDoc(); - break; - } - - // Bewirkt evtl. ein CreateAnchor oder Deselection all - mpImpl->mpSelEngine->CursorPosChanging( bSelect, aTranslatedKeyEvent.GetKeyCode().IsMod1() ); - - if ( aOldEnd != aPaM ) - { - mpImpl->mpTextEngine->CursorMoved( aOldEnd.GetPara() ); - - TextSelection aNewSelection( mpImpl->maSelection ); - aNewSelection.GetEnd() = aPaM; - if ( bSelect ) - { - // Dann wird die Selektion erweitert... - ImpSetSelection( aNewSelection ); - ShowSelection( TextSelection( aOldEnd, aPaM ) ); - } - else - { - aNewSelection.GetStart() = aPaM; - ImpSetSelection( aNewSelection ); - } - } - - return mpImpl->maSelection; -} - -void TextView::InsertText( const XubString& rStr, sal_Bool bSelect ) -{ - InsertNewText( rStr, bSelect ); -} - -void TextView::InsertNewText( const rtl::OUString& rStr, sal_Bool bSelect ) -{ -// HideSelection(); - mpImpl->mpTextEngine->UndoActionStart(); - - /* #i87633# - break inserted text into chunks that fit into the underlying String - based API (which has a maximum length of 65534 elements - - note: this will of course still cause problems for lines longer than those - 65534 elements, but those cases will hopefully be few. - In the long run someone should switch the TextEngine to OUString instead of String - */ - sal_Int32 nLen = rStr.getLength(); - sal_Int32 nPos = 0; - do - { - sal_Int32 nChunkLen = nLen > 65534 ? 65534 : nLen; - String aChunk( rStr.copy( nPos, nChunkLen ) ); - - TextSelection aNewSel( mpImpl->maSelection ); - - TextPaM aPaM = mpImpl->mpTextEngine->ImpInsertText( mpImpl->maSelection, aChunk ); - - if ( bSelect ) - { - aNewSel.Justify(); - aNewSel.GetEnd() = aPaM; - } - else - { - aNewSel = aPaM; - } - - ImpSetSelection( aNewSel ); - nLen -= nChunkLen; - nPos += nChunkLen; - } - while( nLen ); - - mpImpl->mpTextEngine->UndoActionEnd(); - - mpImpl->mpTextEngine->FormatAndUpdate( this ); -} - -TextPaM TextView::CursorLeft( const TextPaM& rPaM, sal_uInt16 nCharacterIteratorMode ) -{ - TextPaM aPaM( rPaM ); - - if ( aPaM.GetIndex() ) - { - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - sal_Int32 nCount = 1; - aPaM.GetIndex() = (sal_uInt16)xBI->previousCharacters( pNode->GetText(), aPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), nCharacterIteratorMode, nCount, nCount ); - } - else if ( aPaM.GetPara() ) - { - aPaM.GetPara()--; - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - aPaM.GetIndex() = pNode->GetText().Len(); - } - return aPaM; -} - -TextPaM TextView::CursorRight( const TextPaM& rPaM, sal_uInt16 nCharacterIteratorMode ) -{ - TextPaM aPaM( rPaM ); - - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - if ( aPaM.GetIndex() < pNode->GetText().Len() ) - { - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - sal_Int32 nCount = 1; - aPaM.GetIndex() = (sal_uInt16)xBI->nextCharacters( pNode->GetText(), aPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), nCharacterIteratorMode, nCount, nCount ); - } - else if ( aPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count()-1) ) - { - aPaM.GetPara()++; - aPaM.GetIndex() = 0; - } - - return aPaM; -} - - -TextPaM TextView::CursorWordLeft( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - - if ( aPaM.GetIndex() ) - { - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), rPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True ); - if ( aBoundary.startPos >= rPaM.GetIndex() ) - aBoundary = xBI->previousWord( pNode->GetText(), rPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES ); - aPaM.GetIndex() = ( aBoundary.startPos != -1 ) ? (sal_uInt16)aBoundary.startPos : 0; - } - else if ( aPaM.GetPara() ) - { - aPaM.GetPara()--; - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - aPaM.GetIndex() = pNode->GetText().Len(); - } - return aPaM; -} - - -TextPaM TextView::CursorWordRight( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - if ( aPaM.GetIndex() < pNode->GetText().Len() ) - { - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - i18n::Boundary aBoundary = xBI->nextWord( pNode->GetText(), aPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES ); - aPaM.GetIndex() = (sal_uInt16)aBoundary.startPos; - } - else if ( aPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count()-1) ) - { - aPaM.GetPara()++; - aPaM.GetIndex() = 0; - } - - return aPaM; -} - -TextPaM TextView::ImpDelete( sal_uInt8 nMode, sal_uInt8 nDelMode ) -{ - if ( mpImpl->maSelection.HasRange() ) // dann nur Sel. loeschen - return mpImpl->mpTextEngine->ImpDeleteText( mpImpl->maSelection ); - - TextPaM aStartPaM = mpImpl->maSelection.GetStart(); - TextPaM aEndPaM = aStartPaM; - if ( nMode == DEL_LEFT ) - { - if ( nDelMode == DELMODE_SIMPLE ) - { - aEndPaM = CursorLeft( aEndPaM, (sal_uInt16)i18n::CharacterIteratorMode::SKIPCHARACTER ); - } - else if ( nDelMode == DELMODE_RESTOFWORD ) - { - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aEndPaM.GetPara() ); - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True ); - if ( aBoundary.startPos == mpImpl->maSelection.GetEnd().GetIndex() ) - aBoundary = xBI->previousWord( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES ); - // #i63506# startPos is -1 when the paragraph starts with a tab - aEndPaM.GetIndex() = (aBoundary.startPos >= 0) ? (sal_uInt16)aBoundary.startPos : 0; - } - else // DELMODE_RESTOFCONTENT - { - if ( aEndPaM.GetIndex() != 0 ) - aEndPaM.GetIndex() = 0; - else if ( aEndPaM.GetPara() ) - { - // Absatz davor - aEndPaM.GetPara()--; - aEndPaM.GetIndex() = 0; - } - } - } - else - { - if ( nDelMode == DELMODE_SIMPLE ) - { - aEndPaM = CursorRight( aEndPaM, (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL ); - } - else if ( nDelMode == DELMODE_RESTOFWORD ) - { - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aEndPaM.GetPara() ); - uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator(); - i18n::Boundary aBoundary = xBI->nextWord( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES ); - aEndPaM.GetIndex() = (sal_uInt16)aBoundary.startPos; - } - else // DELMODE_RESTOFCONTENT - { - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aEndPaM.GetPara() ); - if ( aEndPaM.GetIndex() < pNode->GetText().Len() ) - aEndPaM.GetIndex() = pNode->GetText().Len(); - else if ( aEndPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count() - 1 ) ) - { - // Absatz danach - aEndPaM.GetPara()++; - TextNode* pNextNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aEndPaM.GetPara() ); - aEndPaM.GetIndex() = pNextNode->GetText().Len(); - } - } - } - - return mpImpl->mpTextEngine->ImpDeleteText( TextSelection( aStartPaM, aEndPaM ) ); -} - - - -TextPaM TextView::CursorUp( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - - long nX; - if ( mpImpl->mnTravelXPos == TRAVEL_X_DONTKNOW ) - { - nX = mpImpl->mpTextEngine->GetEditCursor( rPaM, sal_False ).Left(); - mpImpl->mnTravelXPos = (sal_uInt16)nX+1; - } - else - nX = mpImpl->mnTravelXPos; - - TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() ); - sal_uInt16 nLine = pPPortion->GetLineNumber( rPaM.GetIndex(), sal_False ); - if ( nLine ) // gleicher Absatz - { - sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( rPaM.GetPara(), nLine-1, nX ); - aPaM.GetIndex() = nCharPos; - // Wenn davor eine autom.Umgebrochene Zeile, und ich muss genau an das - // Ende dieser Zeile, landet der Cursor in der aktuellen Zeile am Anfang - // Siehe Problem: Letztes Zeichen einer autom.umgebr. Zeile = Cursor - TextLine* pLine = pPPortion->GetLines()[ nLine - 1 ]; - if ( aPaM.GetIndex() && ( aPaM.GetIndex() == pLine->GetEnd() ) ) - aPaM.GetIndex()--; - } - else if ( rPaM.GetPara() ) // vorheriger Absatz - { - aPaM.GetPara()--; - pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() ); - sal_uInt16 nL = pPPortion->GetLines().size() - 1; - sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( aPaM.GetPara(), nL, nX+1 ); - aPaM.GetIndex() = nCharPos; - } - - return aPaM; -} - -TextPaM TextView::CursorDown( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - - long nX; - if ( mpImpl->mnTravelXPos == TRAVEL_X_DONTKNOW ) - { - nX = mpImpl->mpTextEngine->GetEditCursor( rPaM, sal_False ).Left(); - mpImpl->mnTravelXPos = (sal_uInt16)nX+1; - } - else - nX = mpImpl->mnTravelXPos; - - TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() ); - sal_uInt16 nLine = pPPortion->GetLineNumber( rPaM.GetIndex(), sal_False ); - if ( nLine < ( pPPortion->GetLines().size() - 1 ) ) - { - sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( rPaM.GetPara(), nLine+1, nX ); - aPaM.GetIndex() = nCharPos; - - // Sonderbehandlung siehe CursorUp... - TextLine* pLine = pPPortion->GetLines()[ nLine + 1 ]; - if ( ( aPaM.GetIndex() == pLine->GetEnd() ) && ( aPaM.GetIndex() > pLine->GetStart() ) && aPaM.GetIndex() < pPPortion->GetNode()->GetText().Len() ) - aPaM.GetIndex()--; - } - else if ( rPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count() - 1 ) ) // naechster Absatz - { - aPaM.GetPara()++; - pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() ); - sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( aPaM.GetPara(), 0, nX+1 ); - aPaM.GetIndex() = nCharPos; - TextLine* pLine = pPPortion->GetLines().front(); - if ( ( aPaM.GetIndex() == pLine->GetEnd() ) && ( aPaM.GetIndex() > pLine->GetStart() ) && ( pPPortion->GetLines().size() > 1 ) ) - aPaM.GetIndex()--; - } - - return aPaM; -} - -TextPaM TextView::CursorStartOfLine( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - - TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() ); - sal_uInt16 nLine = pPPortion->GetLineNumber( aPaM.GetIndex(), sal_False ); - TextLine* pLine = pPPortion->GetLines()[ nLine ]; - aPaM.GetIndex() = pLine->GetStart(); - - return aPaM; -} - -TextPaM TextView::CursorEndOfLine( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - - TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() ); - sal_uInt16 nLine = pPPortion->GetLineNumber( aPaM.GetIndex(), sal_False ); - TextLine* pLine = pPPortion->GetLines()[ nLine ]; - aPaM.GetIndex() = pLine->GetEnd(); - - if ( pLine->GetEnd() > pLine->GetStart() ) // Leerzeile - { - xub_Unicode cLastChar = pPPortion->GetNode()->GetText().GetChar((sal_uInt16)(aPaM.GetIndex()-1) ); - if ( ( cLastChar == ' ' ) && ( aPaM.GetIndex() != pPPortion->GetNode()->GetText().Len() ) ) - { - // Bei einem Blank in einer autom. umgebrochenen Zeile macht es Sinn, - // davor zu stehen, da der Anwender hinter das Wort will. - // Wenn diese geaendert wird, Sonderbehandlung fuer Pos1 nach End! - aPaM.GetIndex()--; - } - } - return aPaM; -} - -TextPaM TextView::CursorStartOfParagraph( const TextPaM& rPaM ) -{ - TextPaM aPaM( rPaM ); - aPaM.GetIndex() = 0; - return aPaM; -} - -TextPaM TextView::CursorEndOfParagraph( const TextPaM& rPaM ) -{ - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( rPaM.GetPara() ); - TextPaM aPaM( rPaM ); - aPaM.GetIndex() = pNode->GetText().Len(); - return aPaM; -} - -TextPaM TextView::CursorStartOfDoc() -{ - TextPaM aPaM( 0, 0 ); - return aPaM; -} - -TextPaM TextView::CursorEndOfDoc() -{ - sal_uLong nNode = mpImpl->mpTextEngine->mpDoc->GetNodes().Count() - 1; - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( nNode ); - TextPaM aPaM( nNode, pNode->GetText().Len() ); - return aPaM; -} - -TextPaM TextView::PageUp( const TextPaM& rPaM ) -{ - Rectangle aRec = mpImpl->mpTextEngine->PaMtoEditCursor( rPaM ); - Point aTopLeft = aRec.TopLeft(); - aTopLeft.Y() -= mpImpl->mpWindow->GetOutputSizePixel().Height() * 9/10; - aTopLeft.X() += 1; - if ( aTopLeft.Y() < 0 ) - aTopLeft.Y() = 0; - - TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aTopLeft ); - return aPaM; -} - -TextPaM TextView::PageDown( const TextPaM& rPaM ) -{ - Rectangle aRec = mpImpl->mpTextEngine->PaMtoEditCursor( rPaM ); - Point aBottomRight = aRec.BottomRight(); - aBottomRight.Y() += mpImpl->mpWindow->GetOutputSizePixel().Height() * 9/10; - aBottomRight.X() += 1; - long nHeight = mpImpl->mpTextEngine->GetTextHeight(); - if ( aBottomRight.Y() > nHeight ) - aBottomRight.Y() = nHeight-1; - - TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aBottomRight ); - return aPaM; -} - -void TextView::ImpShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor, sal_Bool bSpecial ) -{ - if ( mpImpl->mpTextEngine->IsFormatting() ) - return; - if ( mpImpl->mpTextEngine->GetUpdateMode() == sal_False ) - return; - if ( mpImpl->mpTextEngine->IsInUndo() ) - return; - - mpImpl->mpTextEngine->CheckIdleFormatter(); - if ( !mpImpl->mpTextEngine->IsFormatted() ) - mpImpl->mpTextEngine->FormatAndUpdate( this ); - - - TextPaM aPaM( mpImpl->maSelection.GetEnd() ); - Rectangle aEditCursor = mpImpl->mpTextEngine->PaMtoEditCursor( aPaM, bSpecial ); - - // Remember that we placed the cursor behind the last character of a line - mpImpl->mbCursorAtEndOfLine = false; - if( bSpecial ) - { - TEParaPortion* pParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() ); - mpImpl->mbCursorAtEndOfLine = - pParaPortion->GetLineNumber( aPaM.GetIndex(), sal_True ) != pParaPortion->GetLineNumber( aPaM.GetIndex(), sal_False ); - } - - if ( !IsInsertMode() && !mpImpl->maSelection.HasRange() ) - { - TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() ); - if ( pNode->GetText().Len() && ( aPaM.GetIndex() < pNode->GetText().Len() ) ) - { - // If we are behind a portion, and the next portion has other direction, we must change position... - aEditCursor.Left() = aEditCursor.Right() = mpImpl->mpTextEngine->GetEditCursor( aPaM, sal_False, sal_True ).Left(); - - TEParaPortion* pParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() ); - - sal_uInt16 nTextPortionStart = 0; - sal_uInt16 nTextPortion = pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, sal_True ); - TETextPortion* pTextPortion = pParaPortion->GetTextPortions()[ nTextPortion ]; - if ( pTextPortion->GetKind() == PORTIONKIND_TAB ) - { - if ( mpImpl->mpTextEngine->IsRightToLeft() ) - { - - } - aEditCursor.Right() += pTextPortion->GetWidth(); - } - else - { - TextPaM aNext = CursorRight( TextPaM( aPaM.GetPara(), aPaM.GetIndex() ), (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL ); - aEditCursor.Right() = mpImpl->mpTextEngine->GetEditCursor( aNext, sal_True ).Left(); - } - } - } - - Size aOutSz = mpImpl->mpWindow->GetOutputSizePixel(); - if ( aEditCursor.GetHeight() > aOutSz.Height() ) - aEditCursor.Bottom() = aEditCursor.Top() + aOutSz.Height() - 1; - - aEditCursor.Left() -= 1; - - if ( bGotoCursor - // #i81283# protext maStartDocPos against initialization problems - && aOutSz.Width() && aOutSz.Height() - ) - { - long nVisStartY = mpImpl->maStartDocPos.Y(); - long nVisEndY = mpImpl->maStartDocPos.Y() + aOutSz.Height(); - long nVisStartX = mpImpl->maStartDocPos.X(); - long nVisEndX = mpImpl->maStartDocPos.X() + aOutSz.Width(); - long nMoreX = aOutSz.Width() / 4; - - Point aNewStartPos( mpImpl->maStartDocPos ); - - if ( aEditCursor.Bottom() > nVisEndY ) - { - aNewStartPos.Y() += ( aEditCursor.Bottom() - nVisEndY ); - } - else if ( aEditCursor.Top() < nVisStartY ) - { - aNewStartPos.Y() -= ( nVisStartY - aEditCursor.Top() ); - } - - if ( aEditCursor.Right() >= nVisEndX ) - { - aNewStartPos.X() += ( aEditCursor.Right() - nVisEndX ); - - // Darfs ein bischen mehr sein? - aNewStartPos.X() += nMoreX; - } - else if ( aEditCursor.Left() <= nVisStartX ) - { - aNewStartPos.X() -= ( nVisStartX - aEditCursor.Left() ); - - // Darfs ein bischen mehr sein? - aNewStartPos.X() -= nMoreX; - } - - // X kann durch das 'bischen mehr' falsch sein: -// sal_uLong nMaxTextWidth = mpImpl->mpTextEngine->GetMaxTextWidth(); -// if ( !nMaxTextWidth || ( nMaxTextWidth > 0x7FFFFFFF ) ) -// nMaxTextWidth = 0x7FFFFFFF; -// long nMaxX = (long)nMaxTextWidth - aOutSz.Width(); - long nMaxX = mpImpl->mpTextEngine->CalcTextWidth() - aOutSz.Width(); - if ( nMaxX < 0 ) - nMaxX = 0; - - if ( aNewStartPos.X() < 0 ) - aNewStartPos.X() = 0; - else if ( aNewStartPos.X() > nMaxX ) - aNewStartPos.X() = nMaxX; - - // Y sollte nicht weiter unten als noetig liegen: - long nYMax = mpImpl->mpTextEngine->GetTextHeight() - aOutSz.Height(); - if ( nYMax < 0 ) - nYMax = 0; - if ( aNewStartPos.Y() > nYMax ) - aNewStartPos.Y() = nYMax; - - if ( aNewStartPos != mpImpl->maStartDocPos ) - Scroll( -(aNewStartPos.X() - mpImpl->maStartDocPos.X()), -(aNewStartPos.Y() - mpImpl->maStartDocPos.Y()) ); - } - - if ( aEditCursor.Right() < aEditCursor.Left() ) - { - long n = aEditCursor.Left(); - aEditCursor.Left() = aEditCursor.Right(); - aEditCursor.Right() = n; - } - - Point aPoint( GetWindowPos( !mpImpl->mpTextEngine->IsRightToLeft() ? aEditCursor.TopLeft() : aEditCursor.TopRight() ) ); - mpImpl->mpCursor->SetPos( aPoint ); - mpImpl->mpCursor->SetSize( aEditCursor.GetSize() ); - if ( bForceVisCursor && mpImpl->mbCursorEnabled ) - mpImpl->mpCursor->Show(); -} - -sal_Bool TextView::SetCursorAtPoint( const Point& rPosPixel ) -{ - mpImpl->mpTextEngine->CheckIdleFormatter(); - - Point aDocPos = GetDocPos( rPosPixel ); - - TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aDocPos ); - - // aTmpNewSel: Diff zwischen alt und neu, nicht die neue Selektion - TextSelection aTmpNewSel( mpImpl->maSelection.GetEnd(), aPaM ); - TextSelection aNewSel( mpImpl->maSelection ); - aNewSel.GetEnd() = aPaM; - - if ( !mpImpl->mpSelEngine->HasAnchor() ) - { - if ( mpImpl->maSelection.GetStart() != aPaM ) - mpImpl->mpTextEngine->CursorMoved( mpImpl->maSelection.GetStart().GetPara() ); - aNewSel.GetStart() = aPaM; - ImpSetSelection( aNewSel ); - } - else - { - ImpSetSelection( aNewSel ); - ShowSelection( aTmpNewSel ); - } - - sal_Bool bForceCursor = mpImpl->mpDDInfo ? sal_False : sal_True; // && !mbInSelection - ImpShowCursor( mpImpl->mbAutoScroll, bForceCursor, sal_False ); - return sal_True; -} - -sal_Bool TextView::IsSelectionAtPoint( const Point& rPosPixel ) -{ -// if ( !Rectangle( Point(), mpImpl->mpWindow->GetOutputSizePixel() ).IsInside( rPosPixel ) && !mbInSelection ) -// return sal_False; - - Point aDocPos = GetDocPos( rPosPixel ); - TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aDocPos, sal_False ); - // Bei Hyperlinks D&D auch ohne Selektion starten. - // BeginDrag wird aber nur gerufen, wenn IsSelectionAtPoint() - // Problem: IsSelectionAtPoint wird bei Command() nicht gerufen, - // wenn vorher im MBDown schon sal_False returnt wurde. - return ( IsInSelection( aPaM ) || - ( /* mpImpl->mpSelEngine->IsInCommand() && */ mpImpl->mpTextEngine->FindAttrib( aPaM, TEXTATTR_HYPERLINK ) ) ); -} - -sal_Bool TextView::IsInSelection( const TextPaM& rPaM ) -{ - TextSelection aSel = mpImpl->maSelection; - aSel.Justify(); - - sal_uLong nStartNode = aSel.GetStart().GetPara(); - sal_uLong nEndNode = aSel.GetEnd().GetPara(); - sal_uLong nCurNode = rPaM.GetPara(); - - if ( ( nCurNode > nStartNode ) && ( nCurNode < nEndNode ) ) - return sal_True; - - if ( nStartNode == nEndNode ) - { - if ( nCurNode == nStartNode ) - if ( ( rPaM.GetIndex() >= aSel.GetStart().GetIndex() ) && ( rPaM.GetIndex() < aSel.GetEnd().GetIndex() ) ) - return sal_True; - } - else if ( ( nCurNode == nStartNode ) && ( rPaM.GetIndex() >= aSel.GetStart().GetIndex() ) ) - return sal_True; - else if ( ( nCurNode == nEndNode ) && ( rPaM.GetIndex() < aSel.GetEnd().GetIndex() ) ) - return sal_True; - - return sal_False; -} - -void TextView::ImpHideDDCursor() -{ - if ( mpImpl->mpDDInfo && mpImpl->mpDDInfo->mbVisCursor ) - { - mpImpl->mpDDInfo->maCursor.Hide(); - mpImpl->mpDDInfo->mbVisCursor = sal_False; - } -} - -void TextView::ImpShowDDCursor() -{ - if ( !mpImpl->mpDDInfo->mbVisCursor ) - { - Rectangle aCursor = mpImpl->mpTextEngine->PaMtoEditCursor( mpImpl->mpDDInfo->maDropPos, sal_True ); - aCursor.Right()++; - aCursor.SetPos( GetWindowPos( aCursor.TopLeft() ) ); - - mpImpl->mpDDInfo->maCursor.SetWindow( mpImpl->mpWindow ); - mpImpl->mpDDInfo->maCursor.SetPos( aCursor.TopLeft() ); - mpImpl->mpDDInfo->maCursor.SetSize( aCursor.GetSize() ); - mpImpl->mpDDInfo->maCursor.Show(); - mpImpl->mpDDInfo->mbVisCursor = sal_True; - } -} - -void TextView::SetPaintSelection( sal_Bool bPaint ) -{ - if ( bPaint != mpImpl->mbPaintSelection ) - { - mpImpl->mbPaintSelection = bPaint; - ShowSelection( mpImpl->maSelection ); - } -} - -sal_Bool TextView::Read( SvStream& rInput ) -{ - sal_Bool bDone = mpImpl->mpTextEngine->Read( rInput, &mpImpl->maSelection ); - ShowCursor(); - return bDone; -} - -bool TextView::ImplTruncateNewText( rtl::OUString& rNewText ) const -{ - bool bTruncated = false; - - if( rNewText.getLength() > 65534 ) // limit to String API - { - rNewText = rNewText.copy( 0, 65534 ); - bTruncated = true; - } - - sal_uLong nMaxLen = mpImpl->mpTextEngine->GetMaxTextLen(); - // 0 means unlimited, there is just the String API limit handled above - if( nMaxLen != 0 ) - { - sal_uLong nCurLen = mpImpl->mpTextEngine->GetTextLen(); - - sal_uInt32 nNewLen = rNewText.getLength(); - if ( nCurLen + nNewLen > nMaxLen ) - { - // see how much text will be replaced - sal_uLong nSelLen = mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection ); - if ( nCurLen + nNewLen - nSelLen > nMaxLen ) - { - sal_uInt32 nTruncatedLen = static_cast<sal_uInt32>(nMaxLen - (nCurLen - nSelLen)); - rNewText = rNewText.copy( 0, nTruncatedLen ); - bTruncated = true; - } - } - } - return bTruncated; -} - -sal_Bool TextView::ImplCheckTextLen( const String& rNewText ) -{ - sal_Bool bOK = sal_True; - if ( mpImpl->mpTextEngine->GetMaxTextLen() ) - { - sal_uLong n = mpImpl->mpTextEngine->GetTextLen(); - n += rNewText.Len(); - if ( n > mpImpl->mpTextEngine->GetMaxTextLen() ) - { - // nur dann noch ermitteln, wie viel Text geloescht wird - n -= mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection ); - if ( n > mpImpl->mpTextEngine->GetMaxTextLen() ) - bOK = sal_False; - } - } - return bOK; -} - -void TextView::dragGestureRecognized( const ::com::sun::star::datatransfer::dnd::DragGestureEvent& rDGE ) throw (::com::sun::star::uno::RuntimeException) -{ - if ( mpImpl->mbClickedInSelection ) - { - SolarMutexGuard aVclGuard; - - DBG_ASSERT( mpImpl->maSelection.HasRange(), "TextView::dragGestureRecognized: mpImpl->mbClickedInSelection, but no selection?" ); - - delete mpImpl->mpDDInfo; - mpImpl->mpDDInfo = new TextDDInfo; - mpImpl->mpDDInfo->mbStarterOfDD = sal_True; - - TETextDataObject* pDataObj = new TETextDataObject( GetSelected() ); - - if ( mpImpl->mpTextEngine->HasAttrib( TEXTATTR_HYPERLINK ) ) // Dann auch als HTML - mpImpl->mpTextEngine->Write( pDataObj->GetHTMLStream(), &mpImpl->maSelection, sal_True ); - - - /* - // D&D eines Hyperlinks. - // Besser waere es im MBDown sich den MBDownPaM zu merken, - // ist dann aber inkompatibel => spaeter mal umstellen. - TextPaM aPaM( mpImpl->mpTextEngine->GetPaM( GetDocPos( GetWindow()->GetPointerPosPixel() ) ) ); - const TextCharAttrib* pAttr = mpImpl->mpTextEngine->FindCharAttrib( aPaM, TEXTATTR_HYPERLINK ); - if ( pAttr ) - { - aSel = aPaM; - aSel.GetStart().GetIndex() = pAttr->GetStart(); - aSel.GetEnd().GetIndex() = pAttr->GetEnd(); - - const TextAttribHyperLink& rLink = (const TextAttribHyperLink&)pAttr->GetAttr(); - String aText( rLink.GetDescription() ); - if ( !aText.Len() ) - aText = mpImpl->mpTextEngine->GetText( aSel ); - INetBookmark aBookmark( rLink.GetURL(), aText ); - aBookmark.CopyDragServer(); - } - */ - - mpImpl->mpCursor->Hide(); - - sal_Int8 nActions = datatransfer::dnd::DNDConstants::ACTION_COPY; - if ( !IsReadOnly() ) - nActions |= datatransfer::dnd::DNDConstants::ACTION_MOVE; - rDGE.DragSource->startDrag( rDGE, nActions, 0 /*cursor*/, 0 /*image*/, pDataObj, mpImpl->mxDnDListener ); - } -} - -void TextView::dragDropEnd( const ::com::sun::star::datatransfer::dnd::DragSourceDropEvent& ) throw (::com::sun::star::uno::RuntimeException) -{ - ImpHideDDCursor(); - delete mpImpl->mpDDInfo; - mpImpl->mpDDInfo = NULL; -} - -void TextView::drop( const ::com::sun::star::datatransfer::dnd::DropTargetDropEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aVclGuard; - - sal_Bool bChanges = sal_False; - if ( !mpImpl->mbReadOnly && mpImpl->mpDDInfo ) - { - ImpHideDDCursor(); - - // Daten fuer das loeschen nach einem DROP_MOVE: - TextSelection aPrevSel( mpImpl->maSelection ); - aPrevSel.Justify(); - sal_uLong nPrevParaCount = mpImpl->mpTextEngine->GetParagraphCount(); - sal_uInt16 nPrevStartParaLen = mpImpl->mpTextEngine->GetTextLen( aPrevSel.GetStart().GetPara() ); - - sal_Bool bStarterOfDD = sal_False; - for ( sal_uInt16 nView = mpImpl->mpTextEngine->GetViewCount(); nView && !bStarterOfDD; ) - bStarterOfDD = mpImpl->mpTextEngine->GetView( --nView )->mpImpl->mpDDInfo ? mpImpl->mpTextEngine->GetView( nView )->mpImpl->mpDDInfo->mbStarterOfDD : sal_False; - - HideSelection(); - ImpSetSelection( mpImpl->mpDDInfo->maDropPos ); - - mpImpl->mpTextEngine->UndoActionStart(); - - String aText; - uno::Reference< datatransfer::XTransferable > xDataObj = rDTDE.Transferable; - if ( xDataObj.is() ) - { - datatransfer::DataFlavor aFlavor; - SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor ); - if ( xDataObj->isDataFlavorSupported( aFlavor ) ) - { - uno::Any aData = xDataObj->getTransferData( aFlavor ); - ::rtl::OUString aOUString; - aData >>= aOUString; - aText = convertLineEnd(aOUString, LINEEND_LF); - } - } - - if ( aText.Len() && ( aText.GetChar( aText.Len()-1 ) == LINE_SEP ) ) - aText.Erase( aText.Len()-1 ); - - TextPaM aTempStart = mpImpl->maSelection.GetStart(); - if ( ImplCheckTextLen( aText ) ) - ImpSetSelection( mpImpl->mpTextEngine->ImpInsertText( mpImpl->mpDDInfo->maDropPos, aText ) ); - if(mpImpl->mbSupportProtectAttribute) - { - mpImpl->mpTextEngine->SetAttrib( TextAttribProtect(), - aTempStart.GetPara(), - aTempStart.GetIndex(), - mpImpl->maSelection.GetEnd().GetIndex(), sal_False ); - } - - if ( aPrevSel.HasRange() && - !mpImpl->mbSupportProtectAttribute && // don't remove currently selected element - (( rDTDE.DropAction & datatransfer::dnd::DNDConstants::ACTION_MOVE ) || !bStarterOfDD) ) - { - // ggf. Selection anpasssen: - if ( ( mpImpl->mpDDInfo->maDropPos.GetPara() < aPrevSel.GetStart().GetPara() ) || - ( ( mpImpl->mpDDInfo->maDropPos.GetPara() == aPrevSel.GetStart().GetPara() ) - && ( mpImpl->mpDDInfo->maDropPos.GetIndex() < aPrevSel.GetStart().GetIndex() ) ) ) - { - sal_uLong nNewParasBeforeSelection = - mpImpl->mpTextEngine->GetParagraphCount() - nPrevParaCount; - - aPrevSel.GetStart().GetPara() += nNewParasBeforeSelection; - aPrevSel.GetEnd().GetPara() += nNewParasBeforeSelection; - - if ( mpImpl->mpDDInfo->maDropPos.GetPara() == aPrevSel.GetStart().GetPara() ) - { - sal_uInt16 nNewChars = - mpImpl->mpTextEngine->GetTextLen( aPrevSel.GetStart().GetPara() ) - nPrevStartParaLen; - - aPrevSel.GetStart().GetIndex() = - aPrevSel.GetStart().GetIndex() + nNewChars; - if ( aPrevSel.GetStart().GetPara() == aPrevSel.GetEnd().GetPara() ) - aPrevSel.GetEnd().GetIndex() = - aPrevSel.GetEnd().GetIndex() + nNewChars; - } - } - else - { - // aktuelle Selektion anpassen - TextPaM aPaM = mpImpl->maSelection.GetStart(); - aPaM.GetPara() -= ( aPrevSel.GetEnd().GetPara() - aPrevSel.GetStart().GetPara() ); - if ( aPrevSel.GetEnd().GetPara() == mpImpl->mpDDInfo->maDropPos.GetPara() ) - { - aPaM.GetIndex() = - aPaM.GetIndex() - aPrevSel.GetEnd().GetIndex(); - if ( aPrevSel.GetStart().GetPara() == mpImpl->mpDDInfo->maDropPos.GetPara() ) - aPaM.GetIndex() = - aPaM.GetIndex() + aPrevSel.GetStart().GetIndex(); - } - ImpSetSelection( aPaM ); - - } - mpImpl->mpTextEngine->ImpDeleteText( aPrevSel ); - } - - mpImpl->mpTextEngine->UndoActionEnd(); - - delete mpImpl->mpDDInfo; - mpImpl->mpDDInfo = 0; - - mpImpl->mpTextEngine->FormatAndUpdate( this ); - - mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); - } - rDTDE.Context->dropComplete( bChanges ); -} - -void TextView::dragEnter( const ::com::sun::star::datatransfer::dnd::DropTargetDragEnterEvent& ) throw (::com::sun::star::uno::RuntimeException) -{ -} - -void TextView::dragExit( const ::com::sun::star::datatransfer::dnd::DropTargetEvent& ) throw (::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aVclGuard; - ImpHideDDCursor(); -} - -void TextView::dragOver( const ::com::sun::star::datatransfer::dnd::DropTargetDragEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aVclGuard; - - if ( !mpImpl->mpDDInfo ) - mpImpl->mpDDInfo = new TextDDInfo; - - TextPaM aPrevDropPos = mpImpl->mpDDInfo->maDropPos; - Point aMousePos( rDTDE.LocationX, rDTDE.LocationY ); - Point aDocPos = GetDocPos( aMousePos ); - mpImpl->mpDDInfo->maDropPos = mpImpl->mpTextEngine->GetPaM( aDocPos ); - - sal_Bool bProtected = sal_False; - if(mpImpl->mbSupportProtectAttribute) - { - const TextCharAttrib* pStartAttr = mpImpl->mpTextEngine->FindCharAttrib( - mpImpl->mpDDInfo->maDropPos, - TEXTATTR_PROTECTED ); - bProtected = pStartAttr != 0 && - pStartAttr->GetStart() != mpImpl->mpDDInfo->maDropPos.GetIndex() && - pStartAttr->GetEnd() != mpImpl->mpDDInfo->maDropPos.GetIndex(); - } - // Don't drop in selection or in read only engine - if ( IsReadOnly() || IsInSelection( mpImpl->mpDDInfo->maDropPos ) || bProtected) - { - ImpHideDDCursor(); - rDTDE.Context->rejectDrag(); - } - else - { - // Alten Cursor wegzeichnen... - if ( !mpImpl->mpDDInfo->mbVisCursor || ( aPrevDropPos != mpImpl->mpDDInfo->maDropPos ) ) - { - ImpHideDDCursor(); - ImpShowDDCursor(); - } - rDTDE.Context->acceptDrag( rDTDE.DropAction ); - } -} - -Point TextView::ImpGetOutputStartPos( const Point& rStartDocPos ) const -{ - Point aStartPos( -rStartDocPos.X(), -rStartDocPos.Y() ); - if ( mpImpl->mpTextEngine->IsRightToLeft() ) - { - Size aSz = mpImpl->mpWindow->GetOutputSizePixel(); - aStartPos.X() = rStartDocPos.X() + aSz.Width() - 1; // -1: Start is 0 - } - return aStartPos; -} - -Point TextView::GetDocPos( const Point& rWindowPos ) const -{ - // Fensterposition => Dokumentposition - - Point aPoint; - - aPoint.Y() = rWindowPos.Y() + mpImpl->maStartDocPos.Y(); - - if ( !mpImpl->mpTextEngine->IsRightToLeft() ) - { - aPoint.X() = rWindowPos.X() + mpImpl->maStartDocPos.X(); - } - else - { - Size aSz = mpImpl->mpWindow->GetOutputSizePixel(); - aPoint.X() = ( aSz.Width() - 1 ) - rWindowPos.X() + mpImpl->maStartDocPos.X(); - } - - return aPoint; -} - -Point TextView::GetWindowPos( const Point& rDocPos ) const -{ - // Dokumentposition => Fensterposition - - Point aPoint; - - aPoint.Y() = rDocPos.Y() - mpImpl->maStartDocPos.Y(); - - if ( !mpImpl->mpTextEngine->IsRightToLeft() ) - { - aPoint.X() = rDocPos.X() - mpImpl->maStartDocPos.X(); - } - else - { - Size aSz = mpImpl->mpWindow->GetOutputSizePixel(); - aPoint.X() = ( aSz.Width() - 1 ) - ( rDocPos.X() - mpImpl->maStartDocPos.X() ); - } - - return aPoint; -} - -sal_Int32 TextView::GetLineNumberOfCursorInSelection() const -{ - // PROGRESS - sal_Int32 nLineNo = -1; - if( mpImpl->mbCursorEnabled ) - { - TextPaM aPaM = GetSelection().GetEnd(); - TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() ); - nLineNo = pPPortion->GetLineNumber( aPaM.GetIndex(), sal_False ); - if( mpImpl->mbCursorAtEndOfLine ) - --nLineNo; - } - return nLineNo; -} - - -// ------------------------------------------------------------------------- -// (+) class TextSelFunctionSet -// ------------------------------------------------------------------------- -TextSelFunctionSet::TextSelFunctionSet( TextView* pView ) -{ - mpView = pView; -} - -void TextSelFunctionSet::BeginDrag() -{ -} - -void TextSelFunctionSet::CreateAnchor() -{ -// TextSelection aSel( mpView->GetSelection() ); -// aSel.GetStart() = aSel.GetEnd(); -// mpView->SetSelection( aSel ); - - // Es darf kein ShowCursor folgen: - mpView->HideSelection(); - mpView->ImpSetSelection( mpView->mpImpl->maSelection.GetEnd() ); -} - -sal_Bool TextSelFunctionSet::SetCursorAtPoint( const Point& rPointPixel, sal_Bool ) -{ - return mpView->SetCursorAtPoint( rPointPixel ); -} - -sal_Bool TextSelFunctionSet::IsSelectionAtPoint( const Point& rPointPixel ) -{ - return mpView->IsSelectionAtPoint( rPointPixel ); -} - -void TextSelFunctionSet::DeselectAll() -{ - CreateAnchor(); -} - -void TextSelFunctionSet::DeselectAtPoint( const Point& ) -{ - // Nur bei Mehrfachselektion -} - -void TextSelFunctionSet::DestroyAnchor() -{ - // Nur bei Mehrfachselektion -} -TextEngine* TextView::GetTextEngine() const -{ return mpImpl->mpTextEngine; } -Window* TextView::GetWindow() const -{ return mpImpl->mpWindow; } -void TextView::EnableCursor( sal_Bool bEnable ) -{ mpImpl->mbCursorEnabled = bEnable; } -sal_Bool TextView::IsCursorEnabled() const -{ return mpImpl->mbCursorEnabled; } -void TextView::SetStartDocPos( const Point& rPos ) -{ mpImpl->maStartDocPos = rPos; } -const Point& TextView::GetStartDocPos() const -{ return mpImpl->maStartDocPos; } -void TextView::SetAutoIndentMode( sal_Bool bAutoIndent ) -{ mpImpl->mbAutoIndent = bAutoIndent; } -sal_Bool TextView::IsReadOnly() const -{ return mpImpl->mbReadOnly; } -void TextView::SetAutoScroll( sal_Bool bAutoScroll ) -{ mpImpl->mbAutoScroll = bAutoScroll; } -sal_Bool TextView::IsAutoScroll() const -{ return mpImpl->mbAutoScroll; } -sal_Bool TextView::HasSelection() const -{ return mpImpl->maSelection.HasRange(); } -sal_Bool TextView::IsInsertMode() const -{ return mpImpl->mbInsertMode; } -void TextView::SupportProtectAttribute(sal_Bool bSupport) -{ mpImpl->mbSupportProtectAttribute = bSupport;} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/textwindowpeer.cxx b/svtools/source/edit/textwindowpeer.cxx index 36090632b817..59eee86937c3 100644 --- a/svtools/source/edit/textwindowpeer.cxx +++ b/svtools/source/edit/textwindowpeer.cxx @@ -19,7 +19,7 @@ #include <svtools/textwindowpeer.hxx> -#include <svtools/textview.hxx> +#include <vcl/textview.hxx> #include "svtaccessiblefactory.hxx" namespace css = ::com::sun::star; diff --git a/svtools/source/edit/txtattr.cxx b/svtools/source/edit/txtattr.cxx deleted file mode 100644 index a3324828e951..000000000000 --- a/svtools/source/edit/txtattr.cxx +++ /dev/null @@ -1,164 +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. - * - ************************************************************************/ - - -#include <svtools/txtattr.hxx> -#include <vcl/font.hxx> - - - - -TextAttrib::~TextAttrib() -{ -} - -int TextAttrib::operator==( const TextAttrib& rAttr ) const -{ - return mnWhich == rAttr.mnWhich; -} - - -TextAttribFontColor::TextAttribFontColor( const Color& rColor ) - : TextAttrib( TEXTATTR_FONTCOLOR ), maColor( rColor ) -{ -} - -TextAttribFontColor::TextAttribFontColor( const TextAttribFontColor& rAttr ) - : TextAttrib( rAttr ), maColor( rAttr.maColor ) -{ -} - -TextAttribFontColor::~TextAttribFontColor() -{ -} - -void TextAttribFontColor::SetFont( Font& rFont ) const -{ - rFont.SetColor( maColor ); -} - -TextAttrib* TextAttribFontColor::Clone() const -{ - return new TextAttribFontColor( *this ); -} - -int TextAttribFontColor::operator==( const TextAttrib& rAttr ) const -{ - return ( ( TextAttrib::operator==(rAttr ) ) && - ( maColor == ((const TextAttribFontColor&)rAttr).maColor ) ); -} - -TextAttribFontWeight::TextAttribFontWeight( FontWeight eWeight ) - : TextAttrib( TEXTATTR_FONTWEIGHT ), meWeight( eWeight ) -{ -} - -TextAttribFontWeight::TextAttribFontWeight( const TextAttribFontWeight& rAttr ) - : TextAttrib( rAttr ), meWeight( rAttr.meWeight ) -{ -} - -TextAttribFontWeight::~TextAttribFontWeight() -{ -} - -void TextAttribFontWeight::SetFont( Font& rFont ) const -{ - rFont.SetWeight( meWeight ); -} - -TextAttrib* TextAttribFontWeight::Clone() const -{ - return new TextAttribFontWeight( *this ); -} - -int TextAttribFontWeight::operator==( const TextAttrib& rAttr ) const -{ - return ( ( TextAttrib::operator==(rAttr ) ) && - ( meWeight == ((const TextAttribFontWeight&)rAttr).meWeight ) ); -} - - -TextAttribHyperLink::TextAttribHyperLink( const TextAttribHyperLink& rAttr ) - : TextAttrib( rAttr ), maURL( rAttr.maURL ), maDescription( rAttr.maDescription ) -{ - maColor = rAttr.maColor; -} - -TextAttribHyperLink::~TextAttribHyperLink() -{ -} - -void TextAttribHyperLink::SetFont( Font& rFont ) const -{ - rFont.SetColor( maColor ); - rFont.SetUnderline( UNDERLINE_SINGLE ); -} - -TextAttrib* TextAttribHyperLink::Clone() const -{ - return new TextAttribHyperLink( *this ); -} - -int TextAttribHyperLink::operator==( const TextAttrib& rAttr ) const -{ - return ( ( TextAttrib::operator==(rAttr ) ) && - ( maURL == ((const TextAttribHyperLink&)rAttr).maURL ) && - ( maDescription == ((const TextAttribHyperLink&)rAttr).maDescription ) && - ( maColor == ((const TextAttribHyperLink&)rAttr).maColor ) ); -} - -TextAttribProtect::TextAttribProtect() : - TextAttrib( TEXTATTR_PROTECTED ) -{ -} - -TextAttribProtect::TextAttribProtect( const TextAttribProtect&) : - TextAttrib( TEXTATTR_PROTECTED ) -{ -} - -TextAttribProtect::~TextAttribProtect() -{ -} - -void TextAttribProtect::SetFont( Font& ) const -{ -} - -TextAttrib* TextAttribProtect::Clone() const -{ - return new TextAttribProtect(); -} - -int TextAttribProtect::operator==( const TextAttrib& rAttr ) const -{ - return ( TextAttrib::operator==(rAttr ) ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/edit/xtextedt.cxx b/svtools/source/edit/xtextedt.cxx deleted file mode 100644 index a02f6aa4b84a..000000000000 --- a/svtools/source/edit/xtextedt.cxx +++ /dev/null @@ -1,421 +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. - * - ************************************************************************/ - - -#include <svtools/xtextedt.hxx> -#include <vcl/svapp.hxx> // International -#include <unotools/textsearch.hxx> -#include <com/sun/star/util/SearchOptions.hpp> -#include <com/sun/star/util/SearchFlags.hpp> - -using namespace ::com::sun::star; - - - -// ------------------------------------------------------------------------- -// class ExtTextEngine -// ------------------------------------------------------------------------- -ExtTextEngine::ExtTextEngine() : maGroupChars(rtl::OUString("(){}[]")) -{ -} - -ExtTextEngine::~ExtTextEngine() -{ -} - -TextSelection ExtTextEngine::MatchGroup( const TextPaM& rCursor ) const -{ - TextSelection aSel( rCursor ); - sal_uInt16 nPos = rCursor.GetIndex(); - sal_uLong nPara = rCursor.GetPara(); - sal_uLong nParas = GetParagraphCount(); - if ( ( nPara < nParas ) && ( nPos < GetTextLen( nPara ) ) ) - { - sal_uInt16 nMatchChar = maGroupChars.Search( GetText( rCursor.GetPara() ).GetChar( nPos ) ); - if ( nMatchChar != STRING_NOTFOUND ) - { - if ( ( nMatchChar % 2 ) == 0 ) - { - // Vorwaerts suchen... - sal_Unicode nSC = maGroupChars.GetChar( nMatchChar ); - sal_Unicode nEC = maGroupChars.GetChar( nMatchChar+1 ); - - sal_uInt16 nCur = nPos+1; - sal_uInt16 nLevel = 1; - while ( nLevel && ( nPara < nParas ) ) - { - XubString aStr = GetText( nPara ); - while ( nCur < aStr.Len() ) - { - if ( aStr.GetChar( nCur ) == nSC ) - nLevel++; - else if ( aStr.GetChar( nCur ) == nEC ) - { - nLevel--; - if ( !nLevel ) - break; // while nCur... - } - nCur++; - } - - if ( nLevel ) - { - nPara++; - nCur = 0; - } - } - if ( nLevel == 0 ) // gefunden - { - aSel.GetStart() = rCursor; - aSel.GetEnd() = TextPaM( nPara, nCur+1 ); - } - } - else - { - // Rueckwaerts suchen... - xub_Unicode nEC = maGroupChars.GetChar( nMatchChar ); - xub_Unicode nSC = maGroupChars.GetChar( nMatchChar-1 ); - - sal_uInt16 nCur = rCursor.GetIndex()-1; - sal_uInt16 nLevel = 1; - while ( nLevel ) - { - if ( GetTextLen( nPara ) ) - { - XubString aStr = GetText( nPara ); - while ( nCur ) - { - if ( aStr.GetChar( nCur ) == nSC ) - { - nLevel--; - if ( !nLevel ) - break; // while nCur... - } - else if ( aStr.GetChar( nCur ) == nEC ) - nLevel++; - - nCur--; - } - } - - if ( nLevel ) - { - if ( nPara ) - { - nPara--; - nCur = GetTextLen( nPara )-1; // egal ob negativ, weil if Len() - } - else - break; - } - } - - if ( nLevel == 0 ) // gefunden - { - aSel.GetStart() = rCursor; - aSel.GetStart().GetIndex()++; // hinter das Zeichen - aSel.GetEnd() = TextPaM( nPara, nCur ); - } - } - } - } - return aSel; -} - -sal_Bool ExtTextEngine::Search( TextSelection& rSel, const util::SearchOptions& rSearchOptions, sal_Bool bForward ) -{ - TextSelection aSel( rSel ); - aSel.Justify(); - - sal_Bool bSearchInSelection = (0 != (rSearchOptions.searchFlag & util::SearchFlags::REG_NOT_BEGINOFLINE) ); - - TextPaM aStartPaM( aSel.GetEnd() ); - if ( aSel.HasRange() && ( ( bSearchInSelection && bForward ) || ( !bSearchInSelection && !bForward ) ) ) - { - aStartPaM = aSel.GetStart(); - } - - bool bFound = false; - sal_uLong nStartNode, nEndNode; - - if ( bSearchInSelection ) - nEndNode = bForward ? aSel.GetEnd().GetPara() : aSel.GetStart().GetPara(); - else - nEndNode = bForward ? (GetParagraphCount()-1) : 0; - - nStartNode = aStartPaM.GetPara(); - - util::SearchOptions aOptions( rSearchOptions ); - aOptions.Locale = Application::GetSettings().GetLocale(); - utl::TextSearch aSearcher( rSearchOptions ); - - // ueber die Absaetze iterieren... - for ( sal_uLong nNode = nStartNode; - bForward ? ( nNode <= nEndNode) : ( nNode >= nEndNode ); - bForward ? nNode++ : nNode-- ) - { - String aText = GetText( nNode ); - sal_uInt16 nStartPos = 0; - sal_uInt16 nEndPos = aText.Len(); - if ( nNode == nStartNode ) - { - if ( bForward ) - nStartPos = aStartPaM.GetIndex(); - else - nEndPos = aStartPaM.GetIndex(); - } - if ( ( nNode == nEndNode ) && bSearchInSelection ) - { - if ( bForward ) - nEndPos = aSel.GetEnd().GetIndex(); - else - nStartPos = aSel.GetStart().GetIndex(); - } - - if ( bForward ) - bFound = aSearcher.SearchFrwrd( aText, &nStartPos, &nEndPos ); - else - bFound = aSearcher.SearchBkwrd( aText, &nEndPos, &nStartPos ); - - if ( bFound ) - { - rSel.GetStart().GetPara() = nNode; - rSel.GetStart().GetIndex() = nStartPos; - rSel.GetEnd().GetPara() = nNode; - rSel.GetEnd().GetIndex() = nEndPos; - // Ueber den Absatz selektieren? - // Select over the paragraph? - // FIXME This should be max long... - if( nEndPos == sal::static_int_cast<sal_uInt16>(-1) ) // sal_uInt16 for 0 and -1 ! - { - if ( (rSel.GetEnd().GetPara()+1) < GetParagraphCount() ) - { - rSel.GetEnd().GetPara()++; - rSel.GetEnd().GetIndex() = 0; - } - else - { - rSel.GetEnd().GetIndex() = nStartPos; - bFound = false; - } - } - - break; - } - - if ( !bForward && !nNode ) // Bei rueckwaertsuche, wenn nEndNode = 0: - break; - } - - return bFound; -} - - -// ------------------------------------------------------------------------- -// class ExtTextView -// ------------------------------------------------------------------------- -ExtTextView::ExtTextView( ExtTextEngine* pEng, Window* pWindow ) - : TextView( pEng, pWindow ) -{ -} - -ExtTextView::~ExtTextView() -{ -} - -sal_Bool ExtTextView::MatchGroup() -{ - TextSelection aTmpSel( GetSelection() ); - aTmpSel.Justify(); - if ( ( aTmpSel.GetStart().GetPara() != aTmpSel.GetEnd().GetPara() ) || - ( ( aTmpSel.GetEnd().GetIndex() - aTmpSel.GetStart().GetIndex() ) > 1 ) ) - { - return sal_False; - } - - TextSelection aMatchSel = ((ExtTextEngine*)GetTextEngine())->MatchGroup( aTmpSel.GetStart() ); - if ( aMatchSel.HasRange() ) - SetSelection( aMatchSel ); - - return aMatchSel.HasRange() ? sal_True : sal_False; -} - -sal_Bool ExtTextView::Search( const util::SearchOptions& rSearchOptions, sal_Bool bForward ) -{ - sal_Bool bFound = sal_False; - TextSelection aSel( GetSelection() ); - if ( ((ExtTextEngine*)GetTextEngine())->Search( aSel, rSearchOptions, bForward ) ) - { - bFound = sal_True; - // Erstmal den Anfang des Wortes als Selektion einstellen, - // damit das ganze Wort in den sichtbaren Bereich kommt. - SetSelection( aSel.GetStart() ); - ShowCursor( sal_True, sal_False ); - } - else - { - aSel = GetSelection().GetEnd(); - } - - SetSelection( aSel ); - ShowCursor(); - - return bFound; -} - -sal_uInt16 ExtTextView::Replace( const util::SearchOptions& rSearchOptions, sal_Bool bAll, sal_Bool bForward ) -{ - sal_uInt16 nFound = 0; - - if ( !bAll ) - { - if ( GetSelection().HasRange() ) - { - InsertText( rSearchOptions.replaceString ); - nFound = 1; - Search( rSearchOptions, bForward ); // gleich zum naechsten - } - else - { - if( Search( rSearchOptions, bForward ) ) - nFound = 1; - } - } - else - { - // Der Writer ersetzt alle, vom Anfang bis Ende... - - ExtTextEngine* pTextEngine = (ExtTextEngine*)GetTextEngine(); - - // HideSelection(); - TextSelection aSel; - - sal_Bool bSearchInSelection = (0 != (rSearchOptions.searchFlag & util::SearchFlags::REG_NOT_BEGINOFLINE) ); - if ( bSearchInSelection ) - { - aSel = GetSelection(); - aSel.Justify(); - } - - TextSelection aSearchSel( aSel ); - - sal_Bool bFound = pTextEngine->Search( aSel, rSearchOptions, sal_True ); - if ( bFound ) - pTextEngine->UndoActionStart(); - while ( bFound ) - { - nFound++; - - TextPaM aNewStart = pTextEngine->ImpInsertText( aSel, rSearchOptions.replaceString ); - aSel = aSearchSel; - aSel.GetStart() = aNewStart; - bFound = pTextEngine->Search( aSel, rSearchOptions, sal_True ); - } - if ( nFound ) - { - SetSelection( aSel.GetStart() ); - pTextEngine->FormatAndUpdate( this ); - pTextEngine->UndoActionEnd(); - } - } - return nFound; -} - -sal_Bool ExtTextView::ImpIndentBlock( sal_Bool bRight ) -{ - sal_Bool bDone = sal_False; - - TextSelection aSel = GetSelection(); - aSel.Justify(); - - HideSelection(); - GetTextEngine()->UndoActionStart(); - - sal_uLong nStartPara = aSel.GetStart().GetPara(); - sal_uLong nEndPara = aSel.GetEnd().GetPara(); - if ( aSel.HasRange() && !aSel.GetEnd().GetIndex() ) - { - nEndPara--; // den dann nicht einruecken... - } - - for ( sal_uLong nPara = nStartPara; nPara <= nEndPara; nPara++ ) - { - if ( bRight ) - { - // Tabs hinzufuegen - GetTextEngine()->ImpInsertText( TextPaM( nPara, 0 ), '\t' ); - bDone = sal_True; - } - else - { - // Tabs/Blanks entfernen - String aText = GetTextEngine()->GetText( nPara ); - if ( aText.Len() && ( - ( aText.GetChar( 0 ) == '\t' ) || - ( aText.GetChar( 0 ) == ' ' ) ) ) - { - GetTextEngine()->ImpDeleteText( TextSelection( TextPaM( nPara, 0 ), TextPaM( nPara, 1 ) ) ); - bDone = sal_True; - } - } - } - - GetTextEngine()->UndoActionEnd(); - - sal_Bool bRange = aSel.HasRange(); - if ( bRight ) - { - aSel.GetStart().GetIndex()++; - if ( bRange && ( aSel.GetEnd().GetPara() == nEndPara ) ) - aSel.GetEnd().GetIndex()++; - } - else - { - if ( aSel.GetStart().GetIndex() ) - aSel.GetStart().GetIndex()--; - if ( bRange && aSel.GetEnd().GetIndex() ) - aSel.GetEnd().GetIndex()--; - } - - ImpSetSelection( aSel ); - GetTextEngine()->FormatAndUpdate( this ); - - return bDone; -} - -sal_Bool ExtTextView::IndentBlock() -{ - return ImpIndentBlock( sal_True ); -} - -sal_Bool ExtTextView::UnindentBlock() -{ - return ImpIndentBlock( sal_False ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |