blob: 66fd4b4264b060c0cd020ed62bd46b74b80cc3c6 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _TEXTENG_HXX
#define _TEXTENG_HXX
#include "svtools/svtdllapi.h"
class TextDoc;
class TextView;
class TextPaM;
class TextSelection;
class TextViews;
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>
#ifndef _COM_SUN_STAR_LOCALE_LOCALE_HPP_
#include <com/sun/star/lang/Locale.hpp>
#endif
#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 };
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, Timer * );
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 SetUpdateMode( sal_Bool bUp, TextView* pCurView, sal_Bool bForceUpdate );
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; }
void SetDefTab( sal_uInt16 nDefTab );
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 DoesKeyMoveCursor( const KeyEvent& rKeyEvent );
static sal_Bool IsSimpleCharInput( const KeyEvent& rKeyEvent );
Color GetTextColor() {return maTextColor; };
};
#endif // _TEXTENG_HXX