LCOV - code coverage report
Current view: top level - sw/source/ui/docvw - srcedtw.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 504 0.0 %
Date: 2012-08-25 Functions: 0 36 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 675 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : #include "sal/config.h"
      30                 :            : 
      31                 :            : #include <hintids.hxx>
      32                 :            : #include <cmdid.h>
      33                 :            : 
      34                 :            : #include <com/sun/star/beans/XMultiPropertySet.hpp>
      35                 :            : #include <com/sun/star/beans/XPropertiesChangeListener.hpp>
      36                 :            : #include <cppuhelper/implbase1.hxx>
      37                 :            : #include <officecfg/Office/Common.hxx>
      38                 :            : #include <rtl/oustringostreaminserter.hxx>
      39                 :            : #include <rtl/ustring.hxx>
      40                 :            : #include <sal/log.hxx>
      41                 :            : #include <vcl/textview.hxx>
      42                 :            : #include <svx/svxids.hrc>
      43                 :            : #include <vcl/scrbar.hxx>
      44                 :            : #include <sfx2/dispatch.hxx>
      45                 :            : #include <sfx2/app.hxx>
      46                 :            : #include <svtools/htmltokn.h>
      47                 :            : #include <vcl/txtattr.hxx>
      48                 :            : #include <svtools/colorcfg.hxx>
      49                 :            : #include <editeng/flstitem.hxx>
      50                 :            : #include <vcl/metric.hxx>
      51                 :            : #include <svtools/ctrltool.hxx>
      52                 :            : #include <tools/time.hxx>
      53                 :            : #include <swmodule.hxx>
      54                 :            : #include <docsh.hxx>
      55                 :            : #include <srcview.hxx>
      56                 :            : #include <helpid.h>
      57                 :            : #include <deque>
      58                 :            : 
      59                 :            : namespace {
      60                 :            : 
      61                 :            : namespace css = com::sun::star;
      62                 :            : 
      63                 :            : }
      64                 :            : 
      65                 :            : struct SwTextPortion
      66                 :            : {
      67                 :            :     sal_uInt16 nLine;
      68                 :            :     sal_uInt16 nStart, nEnd;
      69                 :            :     svtools::ColorConfigEntry eType;
      70                 :            : };
      71                 :            : 
      72                 :            : #define MAX_SYNTAX_HIGHLIGHT 20
      73                 :            : #define MAX_HIGHLIGHTTIME 200
      74                 :            : #define SYNTAX_HIGHLIGHT_TIMEOUT 200
      75                 :            : 
      76                 :            : typedef std::deque<SwTextPortion> SwTextPortions;
      77                 :            : 
      78                 :          0 : static void lcl_Highlight(const String& rSource, SwTextPortions& aPortionList)
      79                 :            : {
      80                 :          0 :     const sal_Unicode cOpenBracket = '<';
      81                 :          0 :     const sal_Unicode cCloseBracket= '>';
      82                 :          0 :     const sal_Unicode cSlash        = '/';
      83                 :          0 :     const sal_Unicode cExclamation = '!';
      84                 :          0 :     const sal_Unicode cMinus        = '-';
      85                 :          0 :     const sal_Unicode cSpace        = ' ';
      86                 :          0 :     const sal_Unicode cTab          = 0x09;
      87                 :          0 :     const sal_Unicode cLF          = 0x0a;
      88                 :          0 :     const sal_Unicode cCR          = 0x0d;
      89                 :            : 
      90                 :            : 
      91                 :          0 :     const sal_uInt16 nStrLen = rSource.Len();
      92                 :          0 :     sal_uInt16 nInsert = 0;         // number of inserted portions
      93                 :          0 :     sal_uInt16 nActPos = 0;         // position, where '<' was found
      94                 :          0 :     sal_uInt16 nOffset = 0;         // Offset of nActPos to '<'
      95                 :          0 :     sal_uInt16 nPortStart = USHRT_MAX;  // for the TextPortion
      96                 :          0 :     sal_uInt16 nPortEnd  =  0;          //
      97                 :            :     SwTextPortion aText;
      98         [ #  # ]:          0 :     while(nActPos < nStrLen)
      99                 :            :     {
     100                 :          0 :         svtools::ColorConfigEntry eFoundType = svtools::HTMLUNKNOWN;
     101 [ #  # ][ #  # ]:          0 :         if(rSource.GetChar(nActPos) == cOpenBracket && nActPos < nStrLen - 2 )
                 [ #  # ]
     102                 :            :         {
     103                 :            :             // insert 'empty' portion
     104         [ #  # ]:          0 :             if(nPortEnd < nActPos - 1 )
     105                 :            :             {
     106                 :          0 :                 aText.nLine = 0;
     107                 :            :                 // don't move at the beginning
     108                 :          0 :                 aText.nStart = nPortEnd;
     109         [ #  # ]:          0 :                 if(nInsert)
     110                 :          0 :                     aText.nStart += 1;
     111                 :          0 :                 aText.nEnd = nActPos - 1;
     112                 :          0 :                 aText.eType = svtools::HTMLUNKNOWN;
     113         [ #  # ]:          0 :                 aPortionList.push_back( aText );
     114                 :          0 :                 nInsert++;
     115                 :            :             }
     116                 :          0 :             sal_Unicode cFollowFirst = rSource.GetChar((xub_StrLen)(nActPos + 1));
     117                 :          0 :             sal_Unicode cFollowNext = rSource.GetChar((xub_StrLen)(nActPos + 2));
     118         [ #  # ]:          0 :             if(cExclamation == cFollowFirst)
     119                 :            :             {
     120                 :            :                 // "<!" SGML or comment
     121         [ #  # ]:          0 :                 if(cMinus == cFollowNext &&
           [ #  #  #  # ]
                 [ #  # ]
     122                 :          0 :                     nActPos < nStrLen - 3 && cMinus == rSource.GetChar((xub_StrLen)(nActPos + 3)))
     123                 :            :                 {
     124                 :          0 :                     eFoundType = svtools::HTMLCOMMENT;
     125                 :            :                 }
     126                 :            :                 else
     127                 :          0 :                     eFoundType = svtools::HTMLSGML;
     128                 :          0 :                 nPortStart = nActPos;
     129                 :          0 :                 nPortEnd = nActPos + 1;
     130                 :            :             }
     131         [ #  # ]:          0 :             else if(cSlash == cFollowFirst)
     132                 :            :             {
     133                 :            :                 // "</" ignore slash
     134                 :          0 :                 nPortStart = nActPos;
     135                 :          0 :                 nActPos++;
     136                 :          0 :                 nOffset++;
     137                 :            :             }
     138         [ #  # ]:          0 :             if(svtools::HTMLUNKNOWN == eFoundType)
     139                 :            :             {
     140                 :            :                 // now here a keyword could follow
     141                 :          0 :                 sal_uInt16 nSrchPos = nActPos;
     142         [ #  # ]:          0 :                 while(++nSrchPos < nStrLen - 1)
     143                 :            :                 {
     144                 :          0 :                     sal_Unicode cNext = rSource.GetChar(nSrchPos);
     145 [ #  # ][ #  # ]:          0 :                     if( cNext == cSpace ||
         [ #  # ][ #  # ]
     146                 :            :                         cNext == cTab   ||
     147                 :            :                         cNext == cLF    ||
     148                 :            :                         cNext == cCR)
     149                 :          0 :                         break;
     150         [ #  # ]:          0 :                     else if(cNext == cCloseBracket)
     151                 :            :                     {
     152                 :          0 :                         break;
     153                 :            :                     }
     154                 :            :                 }
     155         [ #  # ]:          0 :                 if(nSrchPos > nActPos + 1)
     156                 :            :                 {
     157                 :            :                     // some string was found
     158         [ #  # ]:          0 :                     String sToken = rSource.Copy(nActPos + 1, nSrchPos - nActPos - 1 );
     159         [ #  # ]:          0 :                     sToken.ToUpperAscii();
     160         [ #  # ]:          0 :                     int nToken = ::GetHTMLToken(sToken);
     161         [ #  # ]:          0 :                     if(nToken)
     162                 :            :                     {
     163                 :            :                         // Token was found
     164                 :          0 :                         eFoundType = svtools::HTMLKEYWORD;
     165                 :          0 :                         nPortEnd = nSrchPos;
     166                 :          0 :                         nPortStart = nActPos;
     167                 :            :                     }
     168                 :            :                     else
     169                 :            :                     {
     170                 :            :                         // what was that?
     171                 :            :                         SAL_WARN(
     172                 :            :                             "sw.level2",
     173                 :            :                             "Token " << rtl::OUString(sToken)
     174                 :            :                                 << " not recognised!");
     175         [ #  # ]:          0 :                     }
     176                 :            : 
     177                 :            :                 }
     178                 :            :             }
     179                 :            :             // now we still have to look for '>'
     180         [ #  # ]:          0 :             if(svtools::HTMLUNKNOWN != eFoundType)
     181                 :            :             {
     182                 :          0 :                 sal_Bool bFound = sal_False;
     183         [ #  # ]:          0 :                 for(sal_uInt16 i = nPortEnd; i < nStrLen; i++)
     184         [ #  # ]:          0 :                     if(cCloseBracket == rSource.GetChar(i))
     185                 :            :                     {
     186                 :          0 :                         bFound = sal_True;
     187                 :          0 :                         nPortEnd = i;
     188                 :          0 :                         break;
     189                 :            :                     }
     190 [ #  # ][ #  # ]:          0 :                 if(!bFound && (eFoundType == svtools::HTMLCOMMENT))
     191                 :            :                 {
     192                 :            :                     // comment without ending in this line
     193                 :          0 :                     bFound  = sal_True;
     194                 :          0 :                     nPortEnd = nStrLen - 1;
     195                 :            :                 }
     196                 :            : 
     197 [ #  # ][ #  # ]:          0 :                 if(bFound ||(eFoundType == svtools::HTMLCOMMENT))
     198                 :            :                 {
     199                 :            :                     SwTextPortion aTextPortion;
     200                 :          0 :                     aTextPortion.nLine = 0;
     201                 :          0 :                     aTextPortion.nStart = nPortStart + 1;
     202                 :          0 :                     aTextPortion.nEnd = nPortEnd;
     203                 :          0 :                     aTextPortion.eType = eFoundType;
     204         [ #  # ]:          0 :                     aPortionList.push_back( aTextPortion );
     205                 :          0 :                     nInsert++;
     206                 :          0 :                     eFoundType = svtools::HTMLUNKNOWN;
     207                 :            :                 }
     208                 :            : 
     209                 :            :             }
     210                 :            :         }
     211                 :          0 :         nActPos++;
     212                 :            :     }
     213 [ #  # ][ #  # ]:          0 :     if(nInsert && nPortEnd < nActPos - 1)
     214                 :            :     {
     215                 :          0 :         aText.nLine = 0;
     216                 :          0 :         aText.nStart = nPortEnd + 1;
     217                 :          0 :         aText.nEnd = nActPos - 1;
     218                 :          0 :         aText.eType = svtools::HTMLUNKNOWN;
     219         [ #  # ]:          0 :         aPortionList.push_back( aText );
     220                 :          0 :         nInsert++;
     221                 :            :     }
     222                 :          0 : }
     223                 :            : 
     224                 :            : class SwSrcEditWindow::ChangesListener:
     225                 :            :     public cppu::WeakImplHelper1< css::beans::XPropertiesChangeListener >
     226                 :            : {
     227                 :            : public:
     228                 :          0 :     ChangesListener(SwSrcEditWindow & editor): editor_(editor) {}
     229                 :            : 
     230                 :            : private:
     231         [ #  # ]:          0 :     virtual ~ChangesListener() {}
     232                 :            : 
     233                 :          0 :     virtual void SAL_CALL disposing(css::lang::EventObject const &)
     234                 :            :         throw (css::uno::RuntimeException)
     235                 :            :     {
     236         [ #  # ]:          0 :         osl::MutexGuard g(editor_.mutex_);
     237         [ #  # ]:          0 :         editor_.notifier_.clear();
     238                 :          0 :     }
     239                 :            : 
     240                 :          0 :     virtual void SAL_CALL propertiesChange(
     241                 :            :         css::uno::Sequence< css::beans::PropertyChangeEvent > const &)
     242                 :            :         throw (css::uno::RuntimeException)
     243                 :            :     {
     244         [ #  # ]:          0 :         SolarMutexGuard g;
     245 [ #  # ][ #  # ]:          0 :         editor_.SetFont();
     246                 :          0 :     }
     247                 :            : 
     248                 :            :     SwSrcEditWindow & editor_;
     249                 :            : };
     250                 :            : 
     251                 :          0 : SwSrcEditWindow::SwSrcEditWindow( Window* pParent, SwSrcView* pParentView ) :
     252                 :            :     Window( pParent, WB_BORDER|WB_CLIPCHILDREN ),
     253                 :            : 
     254                 :            :     pTextEngine(0),
     255                 :            : 
     256                 :            :     pOutWin(0),
     257                 :            :     pHScrollbar(0),
     258                 :            :     pVScrollbar(0),
     259                 :            : 
     260                 :            :     pSrcView(pParentView),
     261                 :            : 
     262                 :            :     nCurTextWidth(0),
     263                 :            :     nStartLine(USHRT_MAX),
     264         [ #  # ]:          0 :     eSourceEncoding(osl_getThreadTextEncoding()),
     265                 :            :     bDoSyntaxHighlight(sal_True),
     266 [ #  # ][ #  # ]:          0 :     bHighlighting(sal_False)
         [ #  # ][ #  # ]
     267                 :            : {
     268         [ #  # ]:          0 :     SetHelpId(HID_SOURCE_EDITWIN);
     269         [ #  # ]:          0 :     CreateTextEngine();
     270                 :            : 
     271                 :            :     // Using "this" in ctor is a little fishy, but should work here at least as
     272                 :            :     // long as there are no derivations:
     273 [ #  # ][ #  # ]:          0 :     listener_ = new ChangesListener(*this);
     274                 :            :     css::uno::Reference< css::beans::XMultiPropertySet > n(
     275                 :            :         officecfg::Office::Common::Font::SourceViewFont::get(),
     276 [ #  # ][ #  # ]:          0 :         css::uno::UNO_QUERY_THROW);
                 [ #  # ]
     277                 :            :     {
     278         [ #  # ]:          0 :         osl::MutexGuard g(mutex_);
     279 [ #  # ][ #  # ]:          0 :         notifier_ = n;
     280                 :            :     }
     281         [ #  # ]:          0 :     css::uno::Sequence< rtl::OUString > s(2);
     282 [ #  # ][ #  # ]:          0 :     s[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FontHeight"));
     283 [ #  # ][ #  # ]:          0 :     s[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FontName"));
     284 [ #  # ][ #  # ]:          0 :     n->addPropertiesChangeListener(s, listener_.get());
         [ #  # ][ #  # ]
                 [ #  # ]
     285                 :          0 : }
     286                 :            : 
     287 [ #  # ][ #  # ]:          0 :  SwSrcEditWindow::~SwSrcEditWindow()
                 [ #  # ]
     288                 :            : {
     289                 :          0 :     css::uno::Reference< css::beans::XMultiPropertySet > n;
     290                 :            :     {
     291         [ #  # ]:          0 :         osl::MutexGuard g(mutex_);
     292 [ #  # ][ #  # ]:          0 :         n = notifier_;
     293                 :            :     }
     294         [ #  # ]:          0 :     if (n.is()) {
     295 [ #  # ][ #  # ]:          0 :         n->removePropertiesChangeListener(listener_.get());
         [ #  # ][ #  # ]
     296                 :            :     }
     297         [ #  # ]:          0 :     aSyntaxIdleTimer.Stop();
     298         [ #  # ]:          0 :     if ( pTextEngine )
     299                 :            :     {
     300         [ #  # ]:          0 :         EndListening( *pTextEngine );
     301         [ #  # ]:          0 :         pTextEngine->RemoveView( pTextView );
     302                 :            : 
     303 [ #  # ][ #  # ]:          0 :         delete pHScrollbar;
     304 [ #  # ][ #  # ]:          0 :         delete pVScrollbar;
     305                 :            : 
     306 [ #  # ][ #  # ]:          0 :         delete pTextView;
     307 [ #  # ][ #  # ]:          0 :         delete pTextEngine;
     308                 :            :     }
     309 [ #  # ][ #  # ]:          0 :     delete pOutWin;
     310         [ #  # ]:          0 : }
     311                 :            : 
     312                 :          0 : void SwSrcEditWindow::DataChanged( const DataChangedEvent& rDCEvt )
     313                 :            : {
     314                 :          0 :     Window::DataChanged( rDCEvt );
     315                 :            : 
     316         [ #  # ]:          0 :     switch ( rDCEvt.GetType() )
     317                 :            :     {
     318                 :            :     case DATACHANGED_SETTINGS:
     319                 :            :         // newly rearrange ScrollBars or trigger Resize, because
     320                 :            :         // ScrollBar size could have changed. For this, in the
     321                 :            :         // Resize handler the size of ScrollBars has to be queried
     322                 :            :         // from the settings as well.
     323         [ #  # ]:          0 :         if( rDCEvt.GetFlags() & SETTINGS_STYLE )
     324                 :          0 :             Resize();
     325                 :          0 :         break;
     326                 :            :     }
     327                 :          0 : }
     328                 :            : 
     329                 :          0 : void  SwSrcEditWindow::Resize()
     330                 :            : {
     331                 :            :     // ScrollBars, etc. happens in Adjust...
     332         [ #  # ]:          0 :     if ( pTextView )
     333                 :            :     {
     334         [ #  # ]:          0 :         long nVisY = pTextView->GetStartDocPos().Y();
     335         [ #  # ]:          0 :         pTextView->ShowCursor();
     336                 :          0 :         Size aOutSz( GetOutputSizePixel() );
     337 [ #  # ][ #  # ]:          0 :         long nMaxVisAreaStart = pTextView->GetTextEngine()->GetTextHeight() - aOutSz.Height();
     338         [ #  # ]:          0 :         if ( nMaxVisAreaStart < 0 )
     339                 :          0 :             nMaxVisAreaStart = 0;
     340 [ #  # ][ #  # ]:          0 :         if ( pTextView->GetStartDocPos().Y() > nMaxVisAreaStart )
     341                 :            :         {
     342         [ #  # ]:          0 :             Point aStartDocPos( pTextView->GetStartDocPos() );
     343                 :          0 :             aStartDocPos.Y() = nMaxVisAreaStart;
     344         [ #  # ]:          0 :             pTextView->SetStartDocPos( aStartDocPos );
     345         [ #  # ]:          0 :             pTextView->ShowCursor();
     346                 :            :         }
     347                 :          0 :         long nScrollStd = GetSettings().GetStyleSettings().GetScrollBarSize();
     348                 :          0 :         Size aScrollSz(aOutSz.Width() - nScrollStd, nScrollStd );
     349                 :          0 :         Point aScrollPos(0, aOutSz.Height() - nScrollStd);
     350                 :            : 
     351         [ #  # ]:          0 :         pHScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
     352                 :            : 
     353                 :          0 :         aScrollSz.Width() = aScrollSz.Height();
     354                 :          0 :         aScrollSz.Height() = aOutSz.Height();
     355                 :          0 :         aScrollPos = Point(aOutSz.Width() - nScrollStd, 0);
     356                 :            : 
     357         [ #  # ]:          0 :         pVScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
     358                 :          0 :         aOutSz.Width()  -= nScrollStd;
     359                 :          0 :         aOutSz.Height()     -= nScrollStd;
     360         [ #  # ]:          0 :         pOutWin->SetOutputSizePixel(aOutSz);
     361         [ #  # ]:          0 :         InitScrollBars();
     362                 :            : 
     363                 :            :         // set line in first Resize
     364         [ #  # ]:          0 :         if(USHRT_MAX != nStartLine)
     365                 :            :         {
     366 [ #  # ][ #  # ]:          0 :             if(nStartLine < pTextEngine->GetParagraphCount())
     367                 :            :             {
     368         [ #  # ]:          0 :                 TextSelection aSel(TextPaM( nStartLine, 0 ), TextPaM( nStartLine, 0x0 ));
     369         [ #  # ]:          0 :                 pTextView->SetSelection(aSel);
     370         [ #  # ]:          0 :                 pTextView->ShowCursor();
     371                 :            :             }
     372                 :          0 :             nStartLine = USHRT_MAX;
     373                 :            :         }
     374                 :            : 
     375 [ #  # ][ #  # ]:          0 :         if ( nVisY != pTextView->GetStartDocPos().Y() )
     376         [ #  # ]:          0 :             Invalidate();
     377                 :            :     }
     378                 :            : 
     379                 :          0 : }
     380                 :            : 
     381                 :          0 : void TextViewOutWin::DataChanged( const DataChangedEvent& rDCEvt )
     382                 :            : {
     383                 :          0 :     Window::DataChanged( rDCEvt );
     384                 :            : 
     385         [ #  # ]:          0 :     switch( rDCEvt.GetType() )
     386                 :            :     {
     387                 :            :     case DATACHANGED_SETTINGS:
     388                 :            :         // query settings
     389         [ #  # ]:          0 :         if( rDCEvt.GetFlags() & SETTINGS_STYLE )
     390                 :            :         {
     391                 :          0 :             const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
     392 [ #  # ][ #  # ]:          0 :             SetBackground( rCol );
                 [ #  # ]
     393 [ #  # ][ #  # ]:          0 :             Font aFont( pTextView->GetTextEngine()->GetFont() );
     394         [ #  # ]:          0 :             aFont.SetFillColor( rCol );
     395 [ #  # ][ #  # ]:          0 :             pTextView->GetTextEngine()->SetFont( aFont );
                 [ #  # ]
     396                 :            :         }
     397                 :          0 :         break;
     398                 :            :     }
     399                 :          0 : }
     400                 :            : 
     401                 :          0 : void  TextViewOutWin::MouseMove( const MouseEvent &rEvt )
     402                 :            : {
     403         [ #  # ]:          0 :     if ( pTextView )
     404                 :          0 :         pTextView->MouseMove( rEvt );
     405                 :          0 : }
     406                 :            : 
     407                 :          0 : void  TextViewOutWin::MouseButtonUp( const MouseEvent &rEvt )
     408                 :            : {
     409         [ #  # ]:          0 :     if ( pTextView )
     410                 :            :     {
     411                 :          0 :         pTextView->MouseButtonUp( rEvt );
     412                 :          0 :         SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
     413                 :          0 :         rBindings.Invalidate( SID_TABLE_CELL );
     414                 :          0 :         rBindings.Invalidate( SID_CUT );
     415                 :          0 :         rBindings.Invalidate( SID_COPY );
     416                 :            :     }
     417                 :          0 : }
     418                 :            : 
     419                 :          0 : void  TextViewOutWin::MouseButtonDown( const MouseEvent &rEvt )
     420                 :            : {
     421                 :          0 :     GrabFocus();
     422         [ #  # ]:          0 :     if ( pTextView )
     423                 :          0 :         pTextView->MouseButtonDown( rEvt );
     424                 :          0 : }
     425                 :            : 
     426                 :          0 : void  TextViewOutWin::Command( const CommandEvent& rCEvt )
     427                 :            : {
     428      [ #  #  # ]:          0 :     switch(rCEvt.GetCommand())
     429                 :            :     {
     430                 :            :         case COMMAND_CONTEXTMENU:
     431                 :          0 :             ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->
     432                 :          0 :                 GetDispatcher()->ExecutePopup();
     433                 :          0 :         break;
     434                 :            :         case COMMAND_WHEEL:
     435                 :            :         case COMMAND_STARTAUTOSCROLL:
     436                 :            :         case COMMAND_AUTOSCROLL:
     437                 :            :         {
     438                 :          0 :             const CommandWheelData* pWData = rCEvt.GetWheelData();
     439 [ #  # ][ #  # ]:          0 :             if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
                 [ #  # ]
     440                 :            :             {
     441                 :          0 :                 ((SwSrcEditWindow*)GetParent())->HandleWheelCommand( rCEvt );
     442                 :            :             }
     443                 :            :         }
     444                 :          0 :         break;
     445                 :            : 
     446                 :            :         default:
     447         [ #  # ]:          0 :             if ( pTextView )
     448                 :          0 :             pTextView->Command( rCEvt );
     449                 :            :         else
     450                 :          0 :             Window::Command(rCEvt);
     451                 :            :     }
     452                 :          0 : }
     453                 :            : 
     454                 :          0 : void  TextViewOutWin::KeyInput( const KeyEvent& rKEvt )
     455                 :            : {
     456                 :          0 :     sal_Bool bDone = sal_False;
     457                 :          0 :     SwSrcEditWindow* pSrcEditWin = (SwSrcEditWindow*)GetParent();
     458 [ #  # ][ #  # ]:          0 :     sal_Bool bChange = !pSrcEditWin->IsReadonly() || !TextEngine::DoesKeyChangeText( rKEvt );
     459         [ #  # ]:          0 :     if(bChange)
     460                 :          0 :         bDone = pTextView->KeyInput( rKEvt );
     461                 :            : 
     462                 :          0 :     SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
     463         [ #  # ]:          0 :     if ( !bDone )
     464                 :            :     {
     465         [ #  # ]:          0 :         if ( !SfxViewShell::Current()->KeyInput( rKEvt ) )
     466                 :          0 :             Window::KeyInput( rKEvt );
     467                 :            :     }
     468                 :            :     else
     469                 :            :     {
     470                 :          0 :         rBindings.Invalidate( SID_TABLE_CELL );
     471         [ #  # ]:          0 :         if ( rKEvt.GetKeyCode().GetGroup() == KEYGROUP_CURSOR )
     472                 :          0 :             rBindings.Update( SID_BASICIDE_STAT_POS );
     473         [ #  # ]:          0 :         if (pSrcEditWin->GetTextEngine()->IsModified() )
     474                 :            :         {
     475                 :          0 :             rBindings.Invalidate( SID_SAVEDOC );
     476                 :          0 :             rBindings.Invalidate( SID_DOC_MODIFIED );
     477                 :            :         }
     478         [ #  # ]:          0 :         if( rKEvt.GetKeyCode().GetCode() == KEY_INSERT )
     479                 :          0 :             rBindings.Invalidate( SID_ATTR_INSERT );
     480                 :            :     }
     481                 :            : 
     482                 :          0 :     rBindings.Invalidate( SID_CUT );
     483                 :          0 :     rBindings.Invalidate( SID_COPY );
     484                 :            : 
     485                 :          0 :     SwDocShell* pDocShell = pSrcEditWin->GetSrcView()->GetDocShell();
     486         [ #  # ]:          0 :     if(pSrcEditWin->GetTextEngine()->IsModified())
     487                 :            :     {
     488                 :          0 :         pDocShell->SetModified();
     489                 :            :     }
     490                 :          0 : }
     491                 :            : 
     492                 :          0 : void  TextViewOutWin::Paint( const Rectangle& rRect )
     493                 :            : {
     494                 :          0 :     pTextView->Paint( rRect );
     495                 :          0 : }
     496                 :            : 
     497                 :          0 : void SwSrcEditWindow::CreateTextEngine()
     498                 :            : {
     499                 :          0 :     const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
     500 [ #  # ][ #  # ]:          0 :     pOutWin = new TextViewOutWin(this, 0);
     501 [ #  # ][ #  # ]:          0 :     pOutWin->SetBackground(Wallpaper(rCol));
                 [ #  # ]
     502         [ #  # ]:          0 :     pOutWin->SetPointer(Pointer(POINTER_TEXT));
     503         [ #  # ]:          0 :     pOutWin->Show();
     504                 :            : 
     505                 :            :     // create Scrollbars
     506 [ #  # ][ #  # ]:          0 :     pHScrollbar = new ScrollBar(this, WB_3DLOOK |WB_HSCROLL|WB_DRAG);
     507         [ #  # ]:          0 :         pHScrollbar->EnableRTL( false ); // --- RTL --- no mirroring for scrollbars
     508         [ #  # ]:          0 :     pHScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
     509         [ #  # ]:          0 :     pHScrollbar->Show();
     510                 :            : 
     511 [ #  # ][ #  # ]:          0 :     pVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
     512         [ #  # ]:          0 :         pVScrollbar->EnableRTL( false ); // --- RTL --- no mirroring for scrollbars
     513         [ #  # ]:          0 :     pVScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
     514                 :          0 :     pHScrollbar->EnableDrag();
     515         [ #  # ]:          0 :     pVScrollbar->Show();
     516                 :            : 
     517 [ #  # ][ #  # ]:          0 :     pTextEngine = new ExtTextEngine;
     518 [ #  # ][ #  # ]:          0 :     pTextView = new ExtTextView( pTextEngine, pOutWin );
     519         [ #  # ]:          0 :     pTextView->SetAutoIndentMode(sal_True);
     520                 :          0 :     pOutWin->SetTextView(pTextView);
     521                 :            : 
     522         [ #  # ]:          0 :     pTextEngine->SetUpdateMode( sal_False );
     523         [ #  # ]:          0 :     pTextEngine->InsertView( pTextView );
     524                 :            : 
     525         [ #  # ]:          0 :     Font aFont;
     526         [ #  # ]:          0 :     aFont.SetTransparent( sal_False );
     527         [ #  # ]:          0 :     aFont.SetFillColor( rCol );
     528         [ #  # ]:          0 :     SetPointFont( aFont );
     529         [ #  # ]:          0 :     aFont = GetFont();
     530         [ #  # ]:          0 :     aFont.SetFillColor( rCol );
     531         [ #  # ]:          0 :     pOutWin->SetFont( aFont );
     532         [ #  # ]:          0 :     pTextEngine->SetFont( aFont );
     533                 :            : 
     534         [ #  # ]:          0 :     aSyntaxIdleTimer.SetTimeout( SYNTAX_HIGHLIGHT_TIMEOUT );
     535         [ #  # ]:          0 :     aSyntaxIdleTimer.SetTimeoutHdl( LINK( this, SwSrcEditWindow, SyntaxTimerHdl ) );
     536                 :            : 
     537         [ #  # ]:          0 :     pTextEngine->EnableUndo( sal_True );
     538         [ #  # ]:          0 :     pTextEngine->SetUpdateMode( sal_True );
     539                 :            : 
     540         [ #  # ]:          0 :     pTextView->ShowCursor( sal_True, sal_True );
     541         [ #  # ]:          0 :     InitScrollBars();
     542         [ #  # ]:          0 :     StartListening( *pTextEngine );
     543                 :            : 
     544                 :          0 :     SfxBindings& rBind = GetSrcView()->GetViewFrame()->GetBindings();
     545 [ #  # ][ #  # ]:          0 :     rBind.Invalidate( SID_TABLE_CELL );
     546                 :          0 : }
     547                 :            : 
     548                 :          0 : void SwSrcEditWindow::SetScrollBarRanges()
     549                 :            : {
     550                 :            :     // Extra method, not InitScrollBars, because also for TextEngine events.
     551                 :            : 
     552         [ #  # ]:          0 :     pHScrollbar->SetRange( Range( 0, nCurTextWidth-1 ) );
     553         [ #  # ]:          0 :     pVScrollbar->SetRange( Range(0, pTextEngine->GetTextHeight()-1) );
     554                 :          0 : }
     555                 :            : 
     556                 :          0 : void SwSrcEditWindow::InitScrollBars()
     557                 :            : {
     558         [ #  # ]:          0 :     SetScrollBarRanges();
     559                 :            : 
     560                 :          0 :     Size aOutSz( pOutWin->GetOutputSizePixel() );
     561         [ #  # ]:          0 :     pVScrollbar->SetVisibleSize( aOutSz.Height() );
     562                 :          0 :     pVScrollbar->SetPageSize(  aOutSz.Height() * 8 / 10 );
     563         [ #  # ]:          0 :     pVScrollbar->SetLineSize( pOutWin->GetTextHeight() );
     564 [ #  # ][ #  # ]:          0 :     pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
     565         [ #  # ]:          0 :     pHScrollbar->SetVisibleSize( aOutSz.Width() );
     566                 :          0 :     pHScrollbar->SetPageSize( aOutSz.Width() * 8 / 10 );
     567 [ #  # ][ #  # ]:          0 :     pHScrollbar->SetLineSize( pOutWin->GetTextWidth(rtl::OUString('x')) );
                 [ #  # ]
     568 [ #  # ][ #  # ]:          0 :     pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
     569                 :            : 
     570                 :          0 : }
     571                 :            : 
     572                 :          0 : IMPL_LINK(SwSrcEditWindow, ScrollHdl, ScrollBar*, pScroll)
     573                 :            : {
     574         [ #  # ]:          0 :     if(pScroll == pVScrollbar)
     575                 :            :     {
     576                 :          0 :         long nDiff = pTextView->GetStartDocPos().Y() - pScroll->GetThumbPos();
     577                 :          0 :         GetTextView()->Scroll( 0, nDiff );
     578                 :          0 :         pTextView->ShowCursor( sal_False, sal_True );
     579                 :          0 :         pScroll->SetThumbPos( pTextView->GetStartDocPos().Y() );
     580                 :            :     }
     581                 :            :     else
     582                 :            :     {
     583                 :          0 :         long nDiff = pTextView->GetStartDocPos().X() - pScroll->GetThumbPos();
     584                 :          0 :         GetTextView()->Scroll( nDiff, 0 );
     585                 :          0 :         pTextView->ShowCursor( sal_False, sal_True );
     586                 :          0 :         pScroll->SetThumbPos( pTextView->GetStartDocPos().X() );
     587                 :            :     }
     588                 :          0 :     GetSrcView()->GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );
     589                 :          0 :     return 0;
     590                 :            : }
     591                 :            : 
     592                 :          0 : IMPL_LINK( SwSrcEditWindow, SyntaxTimerHdl, Timer *, pTimer )
     593                 :            : {
     594         [ #  # ]:          0 :     Time aSyntaxCheckStart( Time::SYSTEM );
     595                 :            :     SAL_WARN_IF(pTextView == 0, "sw", "No View yet, but syntax highlighting?!");
     596                 :            : 
     597                 :          0 :     bHighlighting = sal_True;
     598                 :          0 :     sal_uInt16 nCount  = 0;
     599                 :            :     // at first the region around the cursor is processed
     600         [ #  # ]:          0 :     TextSelection aSel = pTextView->GetSelection();
     601                 :          0 :     sal_uInt16 nCur = (sal_uInt16)aSel.GetStart().GetPara();
     602         [ #  # ]:          0 :     if(nCur > 40)
     603                 :          0 :         nCur -= 40;
     604                 :            :     else
     605                 :          0 :         nCur = 0;
     606         [ #  # ]:          0 :     if(!aSyntaxLineTable.empty())
     607 [ #  # ][ #  # ]:          0 :         for(sal_uInt16 i = 0; i < 80 && nCount < 40; i++, nCur++)
                 [ #  # ]
     608                 :            :         {
     609 [ #  # ][ #  # ]:          0 :             if(aSyntaxLineTable.find(nCur) != aSyntaxLineTable.end())
                 [ #  # ]
     610                 :            :             {
     611         [ #  # ]:          0 :                 DoSyntaxHighlight( nCur );
     612         [ #  # ]:          0 :                 aSyntaxLineTable.erase( nCur );
     613                 :          0 :                 nCount++;
     614         [ #  # ]:          0 :                 if(aSyntaxLineTable.empty())
     615                 :          0 :                     break;
     616 [ #  # ][ #  # ]:          0 :                 if((Time( Time::SYSTEM ).GetTime() - aSyntaxCheckStart.GetTime()) > MAX_HIGHLIGHTTIME )
     617                 :            :                 {
     618         [ #  # ]:          0 :                     pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
     619                 :          0 :                     break;
     620                 :            :                 }
     621                 :            :             }
     622                 :            :         }
     623                 :            : 
     624                 :            :     // when there is still anything left by then, go on from the beginning
     625 [ #  # ][ #  # ]:          0 :     while ( !aSyntaxLineTable.empty() && nCount < MAX_SYNTAX_HIGHLIGHT)
                 [ #  # ]
     626                 :            :     {
     627         [ #  # ]:          0 :         sal_uInt16 nLine = *aSyntaxLineTable.begin();
     628         [ #  # ]:          0 :         DoSyntaxHighlight( nLine );
     629         [ #  # ]:          0 :         aSyntaxLineTable.erase(nLine);
     630                 :          0 :         nCount ++;
     631 [ #  # ][ #  # ]:          0 :         if(Time( Time::SYSTEM ).GetTime() - aSyntaxCheckStart.GetTime() > MAX_HIGHLIGHTTIME)
     632                 :            :         {
     633         [ #  # ]:          0 :             pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
     634                 :            :             break;
     635                 :            :         }
     636                 :            :     }
     637                 :            : 
     638 [ #  # ][ #  # ]:          0 :     if(!aSyntaxLineTable.empty() && !pTimer->IsActive())
                 [ #  # ]
     639         [ #  # ]:          0 :         pTimer->Start();
     640                 :            :     // SyntaxTimerHdl is called when text changed
     641                 :            :     // => good opportunity to determine text width!
     642                 :          0 :     long nPrevTextWidth = nCurTextWidth;
     643         [ #  # ]:          0 :     nCurTextWidth = pTextEngine->CalcTextWidth() + 25;  // kleine Toleranz
     644         [ #  # ]:          0 :     if ( nCurTextWidth != nPrevTextWidth )
     645         [ #  # ]:          0 :         SetScrollBarRanges();
     646                 :          0 :     bHighlighting = sal_False;
     647                 :            : 
     648                 :          0 :     return 0;
     649                 :            : }
     650                 :            : 
     651                 :          0 : void SwSrcEditWindow::DoSyntaxHighlight( sal_uInt16 nPara )
     652                 :            : {
     653                 :            :     // Because of DelayedSyntaxHighlight it could happen,
     654                 :            :     // that the line doesn't exist anymore!
     655         [ #  # ]:          0 :     if ( nPara < pTextEngine->GetParagraphCount() )
     656                 :            :     {
     657                 :          0 :         sal_Bool bTempModified = IsModified();
     658         [ #  # ]:          0 :         pTextEngine->RemoveAttribs( nPara, (sal_Bool)sal_True );
     659         [ #  # ]:          0 :         String aSource( pTextEngine->GetText( nPara ) );
     660         [ #  # ]:          0 :         pTextEngine->SetUpdateMode( sal_False );
     661         [ #  # ]:          0 :         ImpDoHighlight( aSource, nPara );
     662         [ #  # ]:          0 :         TextView* pTmp = pTextEngine->GetActiveView();
     663         [ #  # ]:          0 :         pTmp->SetAutoScroll(sal_False);
     664         [ #  # ]:          0 :         pTextEngine->SetActiveView(0);
     665         [ #  # ]:          0 :         pTextEngine->SetUpdateMode( sal_True );
     666         [ #  # ]:          0 :         pTextEngine->SetActiveView(pTmp);
     667         [ #  # ]:          0 :         pTmp->SetAutoScroll(sal_True);
     668         [ #  # ]:          0 :         pTmp->ShowCursor( sal_False/*pTmp->IsAutoScroll()*/ );
     669                 :            : 
     670         [ #  # ]:          0 :         if(!bTempModified)
     671         [ #  # ]:          0 :             ClearModifyFlag();
     672                 :            :     }
     673                 :          0 : }
     674                 :            : 
     675                 :          0 : void SwSrcEditWindow::DoDelayedSyntaxHighlight( sal_uInt16 nPara )
     676                 :            : {
     677 [ #  # ][ #  # ]:          0 :     if ( !bHighlighting && bDoSyntaxHighlight )
     678                 :            :     {
     679                 :          0 :         aSyntaxLineTable.insert( nPara );
     680                 :          0 :         aSyntaxIdleTimer.Start();
     681                 :            :     }
     682                 :          0 : }
     683                 :            : 
     684                 :          0 : void SwSrcEditWindow::ImpDoHighlight( const String& rSource, sal_uInt16 nLineOff )
     685                 :            : {
     686         [ #  # ]:          0 :     SwTextPortions aPortionList;
     687         [ #  # ]:          0 :     lcl_Highlight(rSource, aPortionList);
     688                 :            : 
     689                 :          0 :     size_t nCount = aPortionList.size();
     690         [ #  # ]:          0 :     if ( !nCount )
     691                 :            :         return;
     692                 :            : 
     693         [ #  # ]:          0 :     SwTextPortion& rLast = aPortionList[nCount-1];
     694         [ #  # ]:          0 :     if ( rLast.nStart > rLast.nEnd )    // Only until Bug from MD is resolved
     695                 :            :     {
     696                 :          0 :         nCount--;
     697         [ #  # ]:          0 :         aPortionList.pop_back();
     698         [ #  # ]:          0 :         if ( !nCount )
     699                 :            :             return;
     700                 :            :     }
     701                 :            : 
     702                 :            :     // maybe optimize:
     703                 :            :     // If frequently the same color, blank without color in between,
     704                 :            :     // maybe summarize or at least the blank; for less attributes
     705                 :          0 :     sal_Bool bOptimizeHighlight = sal_True; // war in der BasicIDE static
     706         [ #  # ]:          0 :     if ( bOptimizeHighlight )
     707                 :            :     {
     708                 :            :         // Only blanks and tabs have to be attributed along.
     709                 :            :         // When two identical attributes are placed consecutively,
     710                 :            :         // it optimises the TextEngine.
     711                 :          0 :         sal_uInt16 nLastEnd = 0;
     712                 :            : 
     713         [ #  # ]:          0 :         for ( size_t i = 0; i < nCount; i++ )
     714                 :            :         {
     715         [ #  # ]:          0 :             SwTextPortion& r = aPortionList[i];
     716                 :            :             SAL_WARN_IF(
     717                 :            :                 r.nLine != aPortionList[0].nLine, "sw.level2",
     718                 :            :                 "multiple lines after all?");
     719         [ #  # ]:          0 :             if ( r.nStart > r.nEnd )    // only until Bug from MD is resolved
     720                 :          0 :                 continue;
     721                 :            : 
     722         [ #  # ]:          0 :             if ( r.nStart > nLastEnd )
     723                 :            :             {
     724                 :            :                 // Can I rely on the fact that all except blank and tab
     725                 :            :                 // are being highlighted?!
     726                 :          0 :                 r.nStart = nLastEnd;
     727                 :            :             }
     728                 :          0 :             nLastEnd = r.nEnd+1;
     729 [ #  # ][ #  # ]:          0 :             if ( ( i == (nCount-1) ) && ( r.nEnd < rSource.Len() ) )
                 [ #  # ]
     730                 :          0 :                 r.nEnd = rSource.Len();
     731                 :            :         }
     732                 :            :     }
     733                 :            : 
     734         [ #  # ]:          0 :     for ( size_t i = 0; i < aPortionList.size(); i++ )
     735                 :            :     {
     736         [ #  # ]:          0 :         SwTextPortion& r = aPortionList[i];
     737         [ #  # ]:          0 :         if ( r.nStart > r.nEnd )    // only until Bug from MD is resolved
     738                 :          0 :             continue;
     739 [ #  # ][ #  # ]:          0 :         if(r.eType !=  svtools::HTMLSGML    &&
         [ #  # ][ #  # ]
     740                 :            :             r.eType != svtools::HTMLCOMMENT &&
     741                 :            :             r.eType != svtools::HTMLKEYWORD &&
     742                 :            :             r.eType != svtools::HTMLUNKNOWN)
     743                 :          0 :                 r.eType = svtools::HTMLUNKNOWN;
     744 [ #  # ][ #  # ]:          0 :         Color aColor((ColorData)SW_MOD()->GetColorConfig().GetColorValue((svtools::ColorConfigEntry)r.eType).nColor);
                 [ #  # ]
     745                 :          0 :         sal_uInt16 nLine = nLineOff+r.nLine; //
     746 [ #  # ][ #  # ]:          0 :         pTextEngine->SetAttrib( TextAttribFontColor( aColor ), nLine, r.nStart, r.nEnd+1, sal_True );
                 [ #  # ]
     747         [ #  # ]:          0 :     }
     748                 :            : }
     749                 :            : 
     750                 :          0 : void SwSrcEditWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
     751                 :            : {
     752         [ #  # ]:          0 :     if ( rHint.ISA( TextHint ) )
     753                 :            :     {
     754                 :          0 :         const TextHint& rTextHint = (const TextHint&)rHint;
     755         [ #  # ]:          0 :         if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED )
     756                 :            :         {
     757                 :          0 :             pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
     758                 :          0 :             pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
     759                 :            :         }
     760         [ #  # ]:          0 :         else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED )
     761                 :            :         {
     762         [ #  # ]:          0 :             if ( (long)pTextEngine->GetTextHeight() < pOutWin->GetOutputSizePixel().Height() )
     763                 :          0 :                 pTextView->Scroll( 0, pTextView->GetStartDocPos().Y() );
     764                 :          0 :             pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
     765                 :          0 :             SetScrollBarRanges();
     766                 :            :         }
     767   [ #  #  #  # ]:          0 :         else if( ( rTextHint.GetId() == TEXT_HINT_PARAINSERTED ) ||
                 [ #  # ]
     768                 :          0 :                  ( rTextHint.GetId() == TEXT_HINT_PARACONTENTCHANGED ) )
     769                 :            :         {
     770                 :          0 :             DoDelayedSyntaxHighlight( (sal_uInt16)rTextHint.GetValue() );
     771                 :            :         }
     772                 :            :     }
     773                 :          0 : }
     774                 :            : 
     775                 :          0 : void    SwSrcEditWindow::Invalidate(sal_uInt16 )
     776                 :            : {
     777                 :          0 :     pOutWin->Invalidate();
     778                 :          0 :     Window::Invalidate();
     779                 :            : 
     780                 :          0 : }
     781                 :            : 
     782                 :          0 : void SwSrcEditWindow::Command( const CommandEvent& rCEvt )
     783                 :            : {
     784         [ #  # ]:          0 :     switch(rCEvt.GetCommand())
     785                 :            :     {
     786                 :            :         case COMMAND_WHEEL:
     787                 :            :         case COMMAND_STARTAUTOSCROLL:
     788                 :            :         case COMMAND_AUTOSCROLL:
     789                 :            :         {
     790                 :          0 :             const CommandWheelData* pWData = rCEvt.GetWheelData();
     791 [ #  # ][ #  # ]:          0 :             if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
                 [ #  # ]
     792                 :          0 :                 HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
     793                 :            :         }
     794                 :          0 :         break;
     795                 :            :         default:
     796                 :          0 :             Window::Command(rCEvt);
     797                 :            :     }
     798                 :          0 : }
     799                 :            : 
     800                 :          0 : void SwSrcEditWindow::HandleWheelCommand( const CommandEvent& rCEvt )
     801                 :            : {
     802                 :          0 :     pTextView->Command(rCEvt);
     803                 :          0 :     HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
     804                 :          0 : }
     805                 :            : 
     806                 :          0 : void SwSrcEditWindow::GetFocus()
     807                 :            : {
     808                 :          0 :     pOutWin->GrabFocus();
     809                 :          0 : }
     810                 :            : 
     811                 :          0 : sal_Bool  lcl_GetLanguagesForEncoding(rtl_TextEncoding eEnc, LanguageType aLanguages[])
     812                 :            : {
     813   [ #  #  #  #  :          0 :     switch(eEnc)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     814                 :            :     {
     815                 :            :         case RTL_TEXTENCODING_UTF7             :
     816                 :            :         case RTL_TEXTENCODING_UTF8             :
     817                 :            :             // don#t fill - all LANGUAGE_SYSTEM means unicode font has to be used
     818                 :          0 :         break;
     819                 :            : 
     820                 :            : 
     821                 :            :         case RTL_TEXTENCODING_ISO_8859_3:
     822                 :            :         case RTL_TEXTENCODING_ISO_8859_1  :
     823                 :            :         case RTL_TEXTENCODING_MS_1252     :
     824                 :            :         case RTL_TEXTENCODING_APPLE_ROMAN :
     825                 :            :         case RTL_TEXTENCODING_IBM_850     :
     826                 :            :         case RTL_TEXTENCODING_ISO_8859_14 :
     827                 :            :         case RTL_TEXTENCODING_ISO_8859_15 :
     828                 :            :             //fill with western languages
     829                 :          0 :             aLanguages[0] = LANGUAGE_GERMAN;
     830                 :          0 :             aLanguages[1] = LANGUAGE_FRENCH;
     831                 :          0 :             aLanguages[2] = LANGUAGE_ITALIAN;
     832                 :          0 :             aLanguages[3] = LANGUAGE_SPANISH;
     833                 :          0 :         break;
     834                 :            : 
     835                 :            :         case RTL_TEXTENCODING_IBM_865     :
     836                 :            :             //scandinavian
     837                 :          0 :             aLanguages[0] = LANGUAGE_FINNISH;
     838                 :          0 :             aLanguages[1] = LANGUAGE_NORWEGIAN;
     839                 :          0 :             aLanguages[2] = LANGUAGE_SWEDISH;
     840                 :          0 :             aLanguages[3] = LANGUAGE_DANISH;
     841                 :          0 :         break;
     842                 :            : 
     843                 :            :         case RTL_TEXTENCODING_ISO_8859_10      :
     844                 :            :         case RTL_TEXTENCODING_ISO_8859_13      :
     845                 :            :         case RTL_TEXTENCODING_ISO_8859_2  :
     846                 :            :         case RTL_TEXTENCODING_IBM_852     :
     847                 :            :         case RTL_TEXTENCODING_MS_1250     :
     848                 :            :         case RTL_TEXTENCODING_APPLE_CENTEURO   :
     849                 :          0 :             aLanguages[0] = LANGUAGE_POLISH;
     850                 :          0 :             aLanguages[1] = LANGUAGE_CZECH;
     851                 :          0 :             aLanguages[2] = LANGUAGE_HUNGARIAN;
     852                 :          0 :             aLanguages[3] = LANGUAGE_SLOVAK;
     853                 :          0 :         break;
     854                 :            : 
     855                 :            :         case RTL_TEXTENCODING_ISO_8859_4  :
     856                 :            :         case RTL_TEXTENCODING_IBM_775     :
     857                 :            :         case RTL_TEXTENCODING_MS_1257          :
     858                 :          0 :             aLanguages[0] = LANGUAGE_LATVIAN   ;
     859                 :          0 :             aLanguages[1] = LANGUAGE_LITHUANIAN;
     860                 :          0 :             aLanguages[2] = LANGUAGE_ESTONIAN  ;
     861                 :          0 :         break;
     862                 :            : 
     863                 :          0 :         case RTL_TEXTENCODING_IBM_863       : aLanguages[0] = LANGUAGE_FRENCH_CANADIAN; break;
     864                 :          0 :         case RTL_TEXTENCODING_APPLE_FARSI   : aLanguages[0] = LANGUAGE_FARSI; break;
     865                 :          0 :         case RTL_TEXTENCODING_APPLE_ROMANIAN:aLanguages[0] = LANGUAGE_ROMANIAN; break;
     866                 :            : 
     867                 :            :         case RTL_TEXTENCODING_IBM_861     :
     868                 :            :         case RTL_TEXTENCODING_APPLE_ICELAND    :
     869                 :          0 :             aLanguages[0] = LANGUAGE_ICELANDIC;
     870                 :          0 :         break;
     871                 :            : 
     872                 :          0 :         case RTL_TEXTENCODING_APPLE_CROATIAN:aLanguages[0] = LANGUAGE_CROATIAN; break;
     873                 :            : 
     874                 :            :         case RTL_TEXTENCODING_IBM_437     :
     875                 :          0 :         case RTL_TEXTENCODING_ASCII_US    : aLanguages[0] = LANGUAGE_ENGLISH; break;
     876                 :            : 
     877                 :            :         case RTL_TEXTENCODING_IBM_862     :
     878                 :            :         case RTL_TEXTENCODING_MS_1255     :
     879                 :            :         case RTL_TEXTENCODING_APPLE_HEBREW     :
     880                 :            :         case RTL_TEXTENCODING_ISO_8859_8  :
     881                 :          0 :             aLanguages[0] = LANGUAGE_HEBREW;
     882                 :          0 :         break;
     883                 :            : 
     884                 :            :         case RTL_TEXTENCODING_IBM_857     :
     885                 :            :         case RTL_TEXTENCODING_MS_1254     :
     886                 :            :         case RTL_TEXTENCODING_APPLE_TURKISH:
     887                 :            :         case RTL_TEXTENCODING_ISO_8859_9  :
     888                 :          0 :             aLanguages[0] = LANGUAGE_TURKISH;
     889                 :          0 :         break;
     890                 :            : 
     891                 :            :         case RTL_TEXTENCODING_IBM_860     :
     892                 :          0 :             aLanguages[0] = LANGUAGE_PORTUGUESE;
     893                 :          0 :         break;
     894                 :            : 
     895                 :            :         case RTL_TEXTENCODING_IBM_869     :
     896                 :            :         case RTL_TEXTENCODING_MS_1253     :
     897                 :            :         case RTL_TEXTENCODING_APPLE_GREEK :
     898                 :            :         case RTL_TEXTENCODING_ISO_8859_7  :
     899                 :            :         case RTL_TEXTENCODING_IBM_737     :
     900                 :          0 :             aLanguages[0] = LANGUAGE_GREEK;
     901                 :          0 :         break;
     902                 :            : 
     903                 :            :         case RTL_TEXTENCODING_KOI8_R      :
     904                 :            :         case RTL_TEXTENCODING_ISO_8859_5  :
     905                 :            :         case RTL_TEXTENCODING_IBM_855     :
     906                 :            :         case RTL_TEXTENCODING_MS_1251     :
     907                 :            :         case RTL_TEXTENCODING_IBM_866     :
     908                 :            :         case RTL_TEXTENCODING_APPLE_CYRILLIC   :
     909                 :          0 :             aLanguages[0] = LANGUAGE_RUSSIAN;
     910                 :          0 :         break;
     911                 :            : 
     912                 :            :         case RTL_TEXTENCODING_APPLE_UKRAINIAN:
     913                 :            :         case RTL_TEXTENCODING_KOI8_U:
     914                 :          0 :             aLanguages[0] = LANGUAGE_UKRAINIAN;
     915                 :          0 :             break;
     916                 :            : 
     917                 :            :         case RTL_TEXTENCODING_IBM_864     :
     918                 :            :         case RTL_TEXTENCODING_MS_1256          :
     919                 :            :         case RTL_TEXTENCODING_ISO_8859_6  :
     920                 :            :         case RTL_TEXTENCODING_APPLE_ARABIC :
     921                 :          0 :             aLanguages[0] = LANGUAGE_ARABIC_SAUDI_ARABIA;
     922                 :          0 :          break;
     923                 :            : 
     924                 :            :         case RTL_TEXTENCODING_APPLE_CHINTRAD   :
     925                 :            :         case RTL_TEXTENCODING_MS_950           :
     926                 :            :         case RTL_TEXTENCODING_GBT_12345        :
     927                 :            :         case RTL_TEXTENCODING_BIG5             :
     928                 :            :         case RTL_TEXTENCODING_EUC_TW           :
     929                 :            :         case RTL_TEXTENCODING_BIG5_HKSCS       :
     930                 :          0 :             aLanguages[0] = LANGUAGE_CHINESE_TRADITIONAL;
     931                 :          0 :         break;
     932                 :            : 
     933                 :            :         case RTL_TEXTENCODING_EUC_JP           :
     934                 :            :         case RTL_TEXTENCODING_ISO_2022_JP      :
     935                 :            :         case RTL_TEXTENCODING_JIS_X_0201       :
     936                 :            :         case RTL_TEXTENCODING_JIS_X_0208       :
     937                 :            :         case RTL_TEXTENCODING_JIS_X_0212       :
     938                 :            :         case RTL_TEXTENCODING_APPLE_JAPANESE   :
     939                 :            :         case RTL_TEXTENCODING_MS_932           :
     940                 :            :         case RTL_TEXTENCODING_SHIFT_JIS        :
     941                 :          0 :             aLanguages[0] = LANGUAGE_JAPANESE;
     942                 :          0 :         break;
     943                 :            : 
     944                 :            :         case RTL_TEXTENCODING_GB_2312          :
     945                 :            :         case RTL_TEXTENCODING_MS_936           :
     946                 :            :         case RTL_TEXTENCODING_GBK              :
     947                 :            :         case RTL_TEXTENCODING_GB_18030         :
     948                 :            :         case RTL_TEXTENCODING_APPLE_CHINSIMP   :
     949                 :            :         case RTL_TEXTENCODING_EUC_CN           :
     950                 :            :         case RTL_TEXTENCODING_ISO_2022_CN      :
     951                 :          0 :             aLanguages[0] = LANGUAGE_CHINESE_SIMPLIFIED;
     952                 :          0 :         break;
     953                 :            : 
     954                 :            :         case RTL_TEXTENCODING_APPLE_KOREAN     :
     955                 :            :         case RTL_TEXTENCODING_MS_949           :
     956                 :            :         case RTL_TEXTENCODING_EUC_KR           :
     957                 :            :         case RTL_TEXTENCODING_ISO_2022_KR      :
     958                 :            :         case RTL_TEXTENCODING_MS_1361          :
     959                 :          0 :             aLanguages[0] = LANGUAGE_KOREAN;
     960                 :          0 :         break;
     961                 :            : 
     962                 :            :         case RTL_TEXTENCODING_APPLE_THAI       :
     963                 :            :         case RTL_TEXTENCODING_MS_874      :
     964                 :            :         case RTL_TEXTENCODING_TIS_620          :
     965                 :          0 :             aLanguages[0] = LANGUAGE_THAI;
     966                 :          0 :         break;
     967                 :          0 :         default: aLanguages[0] = Application::GetSettings().GetUILanguage();
     968                 :            :     }
     969                 :          0 :     return aLanguages[0] != LANGUAGE_SYSTEM;
     970                 :            : }
     971                 :          0 : void SwSrcEditWindow::SetFont()
     972                 :            : {
     973                 :            :     rtl::OUString sFontName(
     974                 :            :         officecfg::Office::Common::Font::SourceViewFont::FontName::get().
     975 [ #  # ][ #  # ]:          0 :         get_value_or(rtl::OUString()));
         [ #  # ][ #  # ]
     976         [ #  # ]:          0 :     if(sFontName.isEmpty())
     977                 :            :     {
     978                 :            :         LanguageType aLanguages[5] =
     979                 :            :         {
     980                 :            :             LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM
     981                 :          0 :         };
     982         [ #  # ]:          0 :         Font aFont;
     983 [ #  # ][ #  # ]:          0 :         if(lcl_GetLanguagesForEncoding(eSourceEncoding, aLanguages))
     984                 :            :         {
     985                 :            :             //TODO: check for multiple languages
     986 [ #  # ][ #  # ]:          0 :             aFont = OutputDevice::GetDefaultFont(DEFAULTFONT_FIXED, aLanguages[0], 0, this);
                 [ #  # ]
     987                 :            :         }
     988                 :            :         else
     989                 :            :             aFont = OutputDevice::GetDefaultFont(DEFAULTFONT_SANS_UNICODE,
     990 [ #  # ][ #  # ]:          0 :                         Application::GetSettings().GetLanguage(), 0, this);
         [ #  # ][ #  # ]
                 [ #  # ]
     991 [ #  # ][ #  # ]:          0 :         sFontName = aFont.GetName();
                 [ #  # ]
     992                 :            :     }
     993                 :            :     const SvxFontListItem* pFontListItem =
     994 [ #  # ][ #  # ]:          0 :         (const SvxFontListItem* )pSrcView->GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST );
     995                 :          0 :     const FontList*  pList = pFontListItem->GetFontList();
     996 [ #  # ][ #  # ]:          0 :     FontInfo aInfo = pList->Get(sFontName,WEIGHT_NORMAL, ITALIC_NONE);
                 [ #  # ]
     997                 :            : 
     998                 :          0 :     const Font& rFont = GetTextEngine()->GetFont();
     999         [ #  # ]:          0 :     Font aFont(aInfo);
    1000         [ #  # ]:          0 :     Size aSize(rFont.GetSize());
    1001                 :            :     //font height is stored in point and set in twip
    1002                 :          0 :     aSize.Height() =
    1003                 :          0 :         officecfg::Office::Common::Font::SourceViewFont::FontHeight::get() * 20;
    1004 [ #  # ][ #  # ]:          0 :     aFont.SetSize(pOutWin->LogicToPixel(aSize, MAP_TWIP));
         [ #  # ][ #  # ]
    1005         [ #  # ]:          0 :     GetTextEngine()->SetFont( aFont );
    1006 [ #  # ][ #  # ]:          0 :     pOutWin->SetFont(aFont);
                 [ #  # ]
    1007                 :          0 : }
    1008                 :            : 
    1009                 :          0 : void SwSrcEditWindow::SetTextEncoding(rtl_TextEncoding eEncoding)
    1010                 :            : {
    1011                 :          0 :     eSourceEncoding = eEncoding;
    1012                 :          0 :     SetFont();
    1013                 :          0 : }
    1014                 :            : 
    1015                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10