diff options
Diffstat (limited to 'svtools/source/edit/svmedit.cxx')
-rw-r--r-- | svtools/source/edit/svmedit.cxx | 1571 |
1 files changed, 8 insertions, 1563 deletions
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: */ |