LCOV - code coverage report
Current view: top level - sw/source/uibase/ribbar - inputwin.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 2 338 0.6 %
Date: 2015-06-13 12:38:46 Functions: 4 32 12.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/config.h>
      21             : 
      22             : #include <comphelper/string.hxx>
      23             : #include <officecfg/Office/Common.hxx>
      24             : #include <tools/gen.hxx>
      25             : #include <sfx2/imgmgr.hxx>
      26             : #include <sfx2/viewfrm.hxx>
      27             : #include <sfx2/dispatch.hxx>
      28             : #include <svx/ruler.hxx>
      29             : #include <svl/zforlist.hxx>
      30             : #include <svl/stritem.hxx>
      31             : #include <vcl/settings.hxx>
      32             : 
      33             : #include "swtypes.hxx"
      34             : #include "cmdid.h"
      35             : #include "swmodule.hxx"
      36             : #include "wrtsh.hxx"
      37             : #include "view.hxx"
      38             : #include "calc.hxx"
      39             : #include "inputwin.hxx"
      40             : #include "fldbas.hxx"
      41             : #include "fldmgr.hxx"
      42             : #include "frmfmt.hxx"
      43             : #include "cellatr.hxx"
      44             : #include "edtwin.hxx"
      45             : #include "helpid.h"
      46             : #include "access.hrc"
      47             : 
      48             : // Only for the UpdateRange: Delete the box in which the stacked cursor is positioned.
      49             : #include "pam.hxx"
      50             : 
      51             : #include "swundo.hxx"
      52             : #include "ribbar.hrc"
      53             : #include "inputwin.hrc"
      54             : 
      55             : #include <IDocumentContentOperations.hxx>
      56             : 
      57        5518 : SFX_IMPL_POS_CHILDWINDOW_WITHID( SwInputChild, FN_EDIT_FORMULA, SFX_OBJECTBAR_OBJECT )
      58             : 
      59           0 : SwInputWindow::SwInputWindow( vcl::Window* pParent, SfxBindings* pBind )
      60             :     : ToolBox(  pParent ,   SW_RES( RID_TBX_FORMULA )),
      61             :     aPos(       VclPtr<Edit>::Create(this,       SW_RES(ED_POS))),
      62             :     aEdit(      VclPtr<InputEdit>::Create(this, WB_3DLOOK|WB_TABSTOP|WB_BORDER|WB_NOHIDESELECTION)),
      63             :     aPopMenu(   SW_RES(MN_CALC_POPUP)),
      64             :     pMgr(0),
      65             :     pWrtShell(0),
      66             :     pView(0),
      67             :     pBindings(pBind),
      68             :     aAktTableName(aEmptyOUStr)
      69             :     , m_bDoesUndo(true)
      70             :     , m_bResetUndo(false)
      71           0 :     , m_bCallUndo(false)
      72             : {
      73           0 :     bFirst = true;
      74           0 :     bActive = bIsTable = bDelSel = false;
      75             : 
      76           0 :     FreeResource();
      77             : 
      78           0 :     aEdit->SetSizePixel( aEdit->CalcMinimumSize() );
      79             : 
      80           0 :     SfxImageManager* pManager = SfxImageManager::GetImageManager( *SW_MOD() );
      81           0 :     pManager->RegisterToolBox(this);
      82             : 
      83           0 :     pView = ::GetActiveView();
      84           0 :     pWrtShell = pView ? pView->GetWrtShellPtr() : 0;
      85             : 
      86           0 :     InsertWindow( ED_POS, aPos.get(), ToolBoxItemBits::NONE, 0);
      87           0 :     SetItemText(ED_POS, SW_RESSTR(STR_ACCESS_FORMULA_TYPE));
      88           0 :     aPos->SetAccessibleName(SW_RESSTR(STR_ACCESS_FORMULA_TYPE));
      89           0 :     SetAccessibleName(SW_RESSTR(STR_ACCESS_FORMULA_TOOLBAR));
      90           0 :     InsertSeparator ( 1 );
      91           0 :     InsertSeparator ();
      92           0 :     InsertWindow( ED_FORMULA, aEdit.get());
      93           0 :     SetItemText(ED_FORMULA, SW_RESSTR(STR_ACCESS_FORMULA_TEXT));
      94           0 :     aEdit->SetAccessibleName(SW_RESSTR(STR_ACCESS_FORMULA_TEXT));
      95           0 :     SetHelpId(ED_FORMULA, HID_EDIT_FORMULA);
      96             : 
      97           0 :     SetItemImage( FN_FORMULA_CALC,   pManager->GetImage(FN_FORMULA_CALC   ));
      98           0 :     SetItemImage( FN_FORMULA_CANCEL, pManager->GetImage(FN_FORMULA_CANCEL ));
      99           0 :     SetItemImage( FN_FORMULA_APPLY,  pManager->GetImage(FN_FORMULA_APPLY  ));
     100             : 
     101           0 :     SetItemBits( FN_FORMULA_CALC, GetItemBits( FN_FORMULA_CALC ) | ToolBoxItemBits::DROPDOWNONLY );
     102           0 :     SetDropdownClickHdl( LINK( this, SwInputWindow, DropdownClickHdl ));
     103             : 
     104           0 :     Size    aSizeTbx = CalcWindowSizePixel();
     105           0 :     Size    aEditSize = aEdit->GetSizePixel();
     106           0 :     Rectangle aItemRect( GetItemRect(FN_FORMULA_CALC) );
     107           0 :     long nMaxHeight = (aEditSize.Height() > aItemRect.GetHeight()) ? aEditSize.Height() : aItemRect.GetHeight();
     108           0 :     if( nMaxHeight+2 > aSizeTbx.Height() )
     109           0 :         aSizeTbx.Height() = nMaxHeight+2;
     110           0 :     Size aSize = GetSizePixel();
     111           0 :     aSize.Height() = aSizeTbx.Height();
     112           0 :     SetSizePixel( aSize );
     113             : 
     114             :     // align edit and item vcentered
     115           0 :     Size    aPosSize = aPos->GetSizePixel();
     116           0 :     aPosSize.Height()  = nMaxHeight;
     117           0 :     aEditSize.Height() = nMaxHeight;
     118           0 :     Point aPosPos  = aPos->GetPosPixel();
     119           0 :     Point aEditPos = aEdit->GetPosPixel();
     120           0 :     aPosPos.Y()    = (aSize.Height() - nMaxHeight)/2 + 1;
     121           0 :     aEditPos.Y()   = (aSize.Height() - nMaxHeight)/2 + 1;
     122           0 :     aPos->SetPosSizePixel( aPosPos, aPosSize );
     123           0 :     aEdit->SetPosSizePixel( aEditPos, aEditSize );
     124             : 
     125           0 :     aPopMenu.SetSelectHdl(LINK( this, SwInputWindow, MenuHdl ));
     126           0 : }
     127             : 
     128           0 : SwInputWindow::~SwInputWindow()
     129             : {
     130           0 :     disposeOnce();
     131           0 : }
     132             : 
     133           0 : void SwInputWindow::dispose()
     134             : {
     135           0 :     SfxImageManager::GetImageManager( *SW_MOD() )->ReleaseToolBox(this);
     136             : 
     137             :     // wake rulers
     138           0 :     if(pView)
     139             :     {
     140           0 :         pView->GetHRuler().SetActive( true );
     141           0 :         pView->GetVRuler().SetActive( true );
     142             :     }
     143           0 :     delete pMgr;
     144           0 :     if(pWrtShell)
     145           0 :         pWrtShell->EndSelTableCells();
     146             : 
     147           0 :     CleanupUglyHackWithUndo();
     148             : 
     149           0 :     aPos.disposeAndClear();
     150           0 :     aEdit.disposeAndClear();
     151           0 :     ToolBox::dispose();
     152           0 : }
     153             : 
     154           0 : void SwInputWindow::CleanupUglyHackWithUndo()
     155             : {
     156           0 :     if (m_bResetUndo)
     157             :     {
     158           0 :         if (pWrtShell)
     159             :         {
     160           0 :             DelBoxContent();
     161           0 :             pWrtShell->DoUndo(m_bDoesUndo);
     162           0 :             if (m_bCallUndo)
     163             :             {
     164           0 :                 pWrtShell->Undo();
     165             :             }
     166             :         }
     167           0 :         m_bResetUndo = false; // #i117122# once is enough :)
     168             :     }
     169           0 : }
     170             : 
     171           0 : void SwInputWindow::DataChanged( const DataChangedEvent& rDCEvt )
     172             : {
     173           0 :     if ( rDCEvt.GetType() == DataChangedEventType::SETTINGS && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     174             :     {
     175             :         // update item images
     176           0 :         SwModule *pMod  = SW_MOD();
     177           0 :         SfxImageManager *pImgMgr = SfxImageManager::GetImageManager(*pMod);
     178           0 :         SetItemImage( FN_FORMULA_CALC,   pImgMgr->GetImage(FN_FORMULA_CALC   ));
     179           0 :         SetItemImage( FN_FORMULA_CANCEL, pImgMgr->GetImage(FN_FORMULA_CANCEL ));
     180           0 :         SetItemImage( FN_FORMULA_APPLY,  pImgMgr->GetImage(FN_FORMULA_APPLY  ));
     181             :     }
     182             : 
     183           0 :     ToolBox::DataChanged( rDCEvt );
     184           0 : }
     185             : 
     186           0 : void SwInputWindow::Resize()
     187             : {
     188           0 :     ToolBox::Resize();
     189             : 
     190           0 :     long    nWidth      = GetSizePixel().Width();
     191           0 :     long    nLeft       = aEdit->GetPosPixel().X();
     192           0 :     Size    aEditSize   = aEdit->GetSizePixel();
     193             : 
     194           0 :     aEditSize.Width() = std::max( ((long)(nWidth - nLeft - 5)), (long)0 );
     195           0 :     aEdit->SetSizePixel( aEditSize );
     196           0 :     aEdit->Invalidate();
     197           0 : }
     198             : 
     199           0 : void SwInputWindow::ShowWin()
     200             : {
     201           0 :     bIsTable = false;
     202             :     // stop rulers
     203           0 :     if(pView)
     204             :     {
     205           0 :         pView->GetHRuler().SetActive( false );
     206           0 :         pView->GetVRuler().SetActive( false );
     207             : 
     208             :         OSL_ENSURE(pWrtShell, "no WrtShell!");
     209             :         // Cursor in table
     210           0 :         bIsTable = pWrtShell->IsCrsrInTable();
     211             : 
     212           0 :         if( bFirst )
     213             :             pWrtShell->SelTableCells( LINK( this, SwInputWindow,
     214           0 :                                                 SelTableCellsNotify) );
     215           0 :         if( bIsTable )
     216             :         {
     217           0 :             const OUString& rPos = pWrtShell->GetBoxNms();
     218           0 :             sal_Int32 nPos = 0;
     219           0 :             short nSrch = -1;
     220           0 :             while( (nPos = rPos.indexOf( ':',nPos + 1 ) ) != -1 )
     221           0 :                 nSrch = (short) nPos;
     222           0 :             aPos->SetText( rPos.copy( ++nSrch ) );
     223           0 :             aAktTableName = pWrtShell->GetTableFormat()->GetName();
     224             :         }
     225             :         else
     226           0 :             aPos->SetText(SW_RESSTR(STR_TBL_FORMULA));
     227             : 
     228             :         // Edit current field
     229             :         OSL_ENSURE(pMgr == 0, "FieldManager not deleted");
     230           0 :         pMgr = new SwFieldMgr;
     231             : 
     232             :         // Formular should always begin with "=" , so set here
     233           0 :         OUString sEdit('=');
     234           0 :         if( pMgr->GetCurField() && TYP_FORMELFLD == pMgr->GetCurTypeId() )
     235             :         {
     236           0 :             sEdit += pMgr->GetCurFieldPar2();
     237             :         }
     238           0 :         else if( bFirst )
     239             :         {
     240           0 :             if( bIsTable )
     241             :             {
     242           0 :                 m_bResetUndo = true;
     243             :                 SAL_WARN_IF(
     244             :                     officecfg::Office::Common::Undo::Steps::get() <= 0,
     245             :                     "sw", "/org.openoffice.Office.Common/Undo/Steps <= 0");
     246             : 
     247           0 :                 m_bDoesUndo = pWrtShell->DoesUndo();
     248           0 :                 if( !m_bDoesUndo )
     249             :                 {
     250           0 :                     pWrtShell->DoUndo( true );
     251             :                 }
     252             : 
     253           0 :                 if( !pWrtShell->SwCrsrShell::HasSelection() )
     254             :                 {
     255           0 :                     pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
     256           0 :                     pWrtShell->SetMark();
     257           0 :                     pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
     258             :                 }
     259           0 :                 if( pWrtShell->SwCrsrShell::HasSelection() )
     260             :                 {
     261           0 :                     pWrtShell->StartUndo( UNDO_DELETE );
     262           0 :                     pWrtShell->Delete();
     263           0 :                     if( 0 != pWrtShell->EndUndo( UNDO_DELETE ))
     264             :                     {
     265           0 :                         m_bCallUndo = true;
     266             :                     }
     267             :                 }
     268           0 :                 pWrtShell->DoUndo(false);
     269             : 
     270           0 :                 SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
     271           0 :                 if( pWrtShell->GetTableBoxFormulaAttrs( aSet ))
     272           0 :                     sEdit += static_cast<const SwTableBoxFormula&>(aSet.Get( RES_BOXATR_FORMULA )).GetFormula();
     273             :             }
     274             :         }
     275             : 
     276           0 :         if( bFirst )
     277             :         {
     278             :             // Set WrtShell flags correctly
     279           0 :             pWrtShell->SttSelect();
     280           0 :             pWrtShell->EndSelect();
     281             :         }
     282             : 
     283           0 :         bFirst = false;
     284             : 
     285           0 :         aEdit->SetModifyHdl( LINK( this, SwInputWindow, ModifyHdl ));
     286             : 
     287           0 :         aEdit->SetText( sEdit );
     288           0 :         aEdit->SetSelection( Selection( sEdit.getLength(), sEdit.getLength() ) );
     289           0 :         sOldFormula = sEdit;
     290             : 
     291           0 :         aEdit->Invalidate();
     292           0 :         aEdit->Update();
     293           0 :         aEdit->GrabFocus();
     294             :         // For input cut the UserInterface
     295             : 
     296           0 :         pView->GetEditWin().LockKeyInput(true);
     297           0 :         pView->GetViewFrame()->GetDispatcher()->Lock(true);
     298           0 :         pWrtShell->Push();
     299             :     }
     300           0 :     ToolBox::Show();
     301           0 : }
     302             : 
     303           0 : IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu )
     304             : {
     305             : static const char * const aStrArr[] = {
     306             :     sCalc_Phd,
     307             :     sCalc_Sqrt,
     308             :     sCalc_Or,
     309             :     sCalc_Xor,
     310             :     sCalc_And,
     311             :     sCalc_Not,
     312             :     sCalc_Eq,
     313             :     sCalc_Neq,
     314             :     sCalc_Leq,
     315             :     sCalc_Geq,
     316             :     sCalc_L,
     317             :     sCalc_G,
     318             :     sCalc_Sum,
     319             :     sCalc_Mean,
     320             :     sCalc_Min,
     321             :     sCalc_Max,
     322             :     sCalc_Sin,
     323             :     sCalc_Cos,
     324             :     sCalc_Tan,
     325             :     sCalc_Asin,
     326             :     sCalc_Acos,
     327             :     sCalc_Atan,
     328             :     sCalc_Pow,
     329             :     "|",
     330             :     sCalc_Round
     331             : };
     332             : 
     333           0 :     sal_uInt16 nId = pMenu->GetCurItemId();
     334           0 :     if ( nId <= MN_CALC_ROUND )
     335             :     {
     336           0 :         OUString aTmp( OUString::createFromAscii(aStrArr[nId - 1]) );
     337           0 :         aTmp += " ";
     338           0 :         aEdit->ReplaceSelected( aTmp );
     339             :     }
     340           0 :     return 0;
     341             : }
     342             : 
     343           0 : IMPL_LINK_NOARG_TYPED(SwInputWindow, DropdownClickHdl, ToolBox *, void)
     344             : {
     345           0 :     sal_uInt16 nCurID = GetCurItemId();
     346           0 :     EndSelection(); // reset back CurItemId !
     347           0 :     switch ( nCurID )
     348             :     {
     349             :         case FN_FORMULA_CALC :
     350             :         {
     351           0 :             aPopMenu.Execute( this, GetItemRect( FN_FORMULA_CALC ), PopupMenuFlags::NoMouseUpClose );
     352           0 :             break;
     353             :         default:
     354           0 :             break;
     355             :         }
     356             :     }
     357           0 : }
     358             : 
     359           0 : void SwInputWindow::Click( )
     360             : {
     361           0 :     sal_uInt16 nCurID = GetCurItemId();
     362           0 :     EndSelection(); // reset back CurItemId !
     363           0 :     switch ( nCurID )
     364             :     {
     365             :         case FN_FORMULA_CANCEL:
     366             :         {
     367           0 :             CancelFormula();
     368             :         }
     369           0 :         break;
     370             :         case FN_FORMULA_APPLY:
     371             :         {
     372           0 :             ApplyFormula();
     373             :         }
     374           0 :         break;
     375             :    }
     376           0 : }
     377             : 
     378           0 : void  SwInputWindow::ApplyFormula()
     379             : {
     380           0 :     pView->GetViewFrame()->GetDispatcher()->Lock(false);
     381           0 :     pView->GetEditWin().LockKeyInput(false);
     382           0 :     CleanupUglyHackWithUndo();
     383           0 :     pWrtShell->Pop( false );
     384             : 
     385             :     // Formular should always begin with "=", so remove it here again
     386           0 :     OUString sEdit(comphelper::string::strip(aEdit->GetText(), ' '));
     387           0 :     if( !sEdit.isEmpty() && '=' == sEdit[0] )
     388           0 :         sEdit = sEdit.copy( 1 );
     389           0 :     SfxStringItem aParam(FN_EDIT_FORMULA, sEdit);
     390             : 
     391           0 :     pWrtShell->EndSelTableCells();
     392           0 :     pView->GetEditWin().GrabFocus();
     393             :     const SfxPoolItem* aArgs[2];
     394           0 :     aArgs[0] = &aParam;
     395           0 :     aArgs[1] = 0;
     396           0 :     pView->GetViewFrame()->GetBindings().Execute( FN_EDIT_FORMULA, aArgs, 0, SfxCallMode::ASYNCHRON );
     397           0 : }
     398             : 
     399           0 : void  SwInputWindow::CancelFormula()
     400             : {
     401           0 :     if(pView)
     402             :     {
     403           0 :         pView->GetViewFrame()->GetDispatcher()->Lock( false );
     404           0 :         pView->GetEditWin().LockKeyInput(false);
     405           0 :         CleanupUglyHackWithUndo();
     406           0 :         pWrtShell->Pop( false );
     407             : 
     408           0 :         if( bDelSel )
     409           0 :             pWrtShell->EnterStdMode();
     410             : 
     411           0 :         pWrtShell->EndSelTableCells();
     412             : 
     413           0 :         pView->GetEditWin().GrabFocus();
     414             : 
     415           0 :         pView->GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FORMULA, SfxCallMode::ASYNCHRON);
     416             :     }
     417           0 : }
     418             : 
     419             : const sal_Unicode CH_LRE = 0x202a;
     420             : const sal_Unicode CH_PDF = 0x202c;
     421             : 
     422           0 : IMPL_LINK( SwInputWindow, SelTableCellsNotify, SwWrtShell *, pCaller )
     423             : {
     424           0 :     if(bIsTable)
     425             :     {
     426           0 :         SwFrameFormat* pTableFormat = pCaller->GetTableFormat();
     427           0 :         OUString sBoxNms( pCaller->GetBoxNms() );
     428           0 :         OUString sTableNm;
     429           0 :         if( pTableFormat && aAktTableName != pTableFormat->GetName() )
     430           0 :             sTableNm = pTableFormat->GetName();
     431             : 
     432           0 :         aEdit->UpdateRange( sBoxNms, sTableNm );
     433             : 
     434           0 :         OUString sNew;
     435           0 :         sNew += OUString(CH_LRE);
     436           0 :         sNew += aEdit->GetText();
     437           0 :         sNew += OUString(CH_PDF);
     438             : 
     439           0 :         if( sNew != sOldFormula )
     440             :         {
     441             :             // The WrtShell is in the table selection,
     442             :             // then cancel the table selection otherwise, the cursor is
     443             :             // positioned "in the forest" and the live update does not work!
     444           0 :             pWrtShell->StartAllAction();
     445             : 
     446           0 :             SwPaM aPam( *pWrtShell->GetStkCrsr()->GetPoint() );
     447           0 :             aPam.Move( fnMoveBackward, fnGoSection );
     448           0 :             aPam.SetMark();
     449           0 :             aPam.Move( fnMoveForward, fnGoSection );
     450             : 
     451           0 :             IDocumentContentOperations* pIDCO = pWrtShell->getIDocumentContentOperations();
     452           0 :             pIDCO->DeleteRange( aPam );
     453           0 :             pIDCO->InsertString( aPam, sNew );
     454           0 :             pWrtShell->EndAllAction();
     455           0 :             sOldFormula = sNew;
     456           0 :         }
     457             :     }
     458             :     else
     459           0 :         aEdit->GrabFocus();
     460           0 :     return 0;
     461             : }
     462             : 
     463           0 : void SwInputWindow::SetFormula( const OUString& rFormula, bool bDelFlag )
     464             : {
     465           0 :     OUString sEdit('=');
     466           0 :     if( !rFormula.isEmpty() )
     467             :     {
     468           0 :         if( '=' == rFormula[0] )
     469           0 :             sEdit = rFormula;
     470             :         else
     471           0 :             sEdit += rFormula;
     472             :     }
     473           0 :     aEdit->SetText( sEdit );
     474           0 :     aEdit->SetSelection( Selection( sEdit.getLength(), sEdit.getLength() ) );
     475           0 :     aEdit->Invalidate();
     476           0 :     bDelSel = bDelFlag;
     477           0 : }
     478             : 
     479           0 : IMPL_LINK_NOARG(SwInputWindow, ModifyHdl)
     480             : {
     481           0 :     if (bIsTable && m_bResetUndo)
     482             :     {
     483           0 :         pWrtShell->StartAllAction();
     484           0 :         DelBoxContent();
     485           0 :         OUString sNew;
     486           0 :         sNew += OUString(CH_LRE);
     487           0 :         sNew += aEdit->GetText();
     488           0 :         sNew += OUString(CH_PDF);
     489           0 :         pWrtShell->SwEditShell::Insert2( sNew );
     490           0 :         pWrtShell->EndAllAction();
     491           0 :         sOldFormula = sNew;
     492             :     }
     493           0 :     return 0;
     494             : }
     495             : 
     496           0 : void SwInputWindow::DelBoxContent()
     497             : {
     498           0 :     if( bIsTable )
     499             :     {
     500           0 :         pWrtShell->StartAllAction();
     501           0 :         pWrtShell->ClearMark();
     502           0 :         pWrtShell->Pop( false );
     503           0 :         pWrtShell->Push();
     504           0 :         pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
     505           0 :         pWrtShell->SetMark();
     506           0 :         pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
     507           0 :         pWrtShell->SwEditShell::Delete();
     508           0 :         pWrtShell->EndAllAction();
     509             :     }
     510           0 : }
     511             : 
     512           0 : void InputEdit::KeyInput(const KeyEvent& rEvent)
     513             : {
     514           0 :     const vcl::KeyCode aCode = rEvent.GetKeyCode();
     515           0 :     if(aCode == KEY_RETURN || aCode == KEY_F2 )
     516           0 :         static_cast<SwInputWindow*>(GetParent())->ApplyFormula();
     517           0 :     else if(aCode == KEY_ESCAPE )
     518           0 :         static_cast<SwInputWindow*>(GetParent())->CancelFormula();
     519             :     else
     520           0 :         Edit::KeyInput(rEvent);
     521           0 : }
     522             : 
     523           0 : void InputEdit::UpdateRange(const OUString& rBoxes,
     524             :                                     const OUString& rName )
     525             : {
     526           0 :     if( rBoxes.isEmpty() )
     527             :     {
     528           0 :         GrabFocus();
     529           0 :         return;
     530             :     }
     531           0 :     const sal_Unicode   cOpen = '<', cClose = '>',
     532           0 :                 cOpenBracket = '(';
     533           0 :     OUString aPrefix = rName;
     534           0 :     if(!rName.isEmpty())
     535           0 :         aPrefix += ".";
     536           0 :     OUString aBoxes = aPrefix;
     537           0 :     aBoxes += rBoxes;
     538           0 :     Selection aSelection(GetSelection());
     539           0 :     sal_uInt16 nSel = (sal_uInt16) aSelection.Len();
     540             :     // OS: The following expression ensures that in the overwrite mode,
     541             :     // the selected closing parenthesis will be not deleted.
     542           0 :     if( nSel && ( nSel > 1 ||
     543           0 :                   GetText()[ (sal_uInt16)aSelection.Min() ] != cClose ))
     544           0 :         Cut();
     545             :     else
     546           0 :         aSelection.Max() = aSelection.Min();
     547           0 :     OUString aActText(GetText());
     548           0 :     const sal_uInt16 nLen = aActText.getLength();
     549           0 :     if( !nLen )
     550             :     {
     551             :         OUString aStr = OUStringBuffer().
     552           0 :             append(cOpen).append(aBoxes).append(cClose).
     553           0 :             makeStringAndClear();
     554           0 :         SetText(aStr);
     555           0 :         sal_Int32 nPos = aStr.indexOf( cClose );
     556             :         OSL_ENSURE(nPos != -1, "delimiter not found");
     557           0 :         ++nPos;
     558           0 :         SetSelection( Selection( nPos, nPos ));
     559             :     }
     560             :     else
     561             :     {
     562           0 :         bool bFound = false;
     563             :         sal_Unicode cCh;
     564           0 :         sal_uInt16 nPos, nEndPos = 0, nStartPos = (sal_uInt16) aSelection.Min();
     565           0 :         if( nStartPos-- )
     566             :         {
     567           0 :             do {
     568           0 :                 if( cOpen  == (cCh = aActText[ nStartPos ] ) ||
     569             :                     cOpenBracket == cCh )
     570             :                 {
     571           0 :                     bFound = cCh == cOpen;
     572           0 :                     break;
     573             :                 }
     574           0 :             } while( nStartPos-- > 0 );
     575             :         }
     576           0 :         if( bFound )
     577             :         {
     578           0 :             bFound = false;
     579           0 :             nEndPos = nStartPos;
     580           0 :             while( nEndPos < nLen )
     581             :             {
     582           0 :                 if( cClose == (cCh = aActText[ nEndPos ]))
     583             :                 {
     584           0 :                     bFound = true;
     585           0 :                     break;
     586             :                 }
     587           0 :                 ++nEndPos;
     588             :             }
     589             :             // Only if the current position lies in the range or right behind.
     590           0 :             if( bFound && !( nStartPos < (sal_uInt16)aSelection.Max() &&
     591           0 :                              (sal_uInt16)aSelection.Max() <= nEndPos + 1 ))
     592           0 :                 bFound = false;
     593             :         }
     594           0 :         if( bFound )
     595             :         {
     596           0 :             nPos = ++nStartPos + 1; // We want behind
     597           0 :             aActText = aActText.replaceAt( nStartPos, nEndPos - nStartPos, aBoxes );
     598           0 :             nPos = nPos + aBoxes.getLength();
     599             :         }
     600             :         else
     601             :         {
     602             :             OUString aTmp = OUStringBuffer().
     603           0 :                 append(cOpen).append(aBoxes).append(cClose).
     604           0 :                 makeStringAndClear();
     605           0 :             nPos = (sal_uInt16)aSelection.Min();
     606           0 :             aActText = aActText.replaceAt( nPos, 0, aTmp );
     607           0 :             nPos = nPos + aTmp.getLength();
     608             :         }
     609           0 :         if( GetText() != OUString(aActText) )
     610             :         {
     611           0 :             SetText( aActText );
     612           0 :             SetSelection( Selection( nPos, nPos ) );
     613             :         }
     614             :     }
     615           0 :     GrabFocus();
     616             : 
     617             : }
     618             : 
     619           0 : SwInputChild::SwInputChild(vcl::Window* _pParent,
     620             :                                 sal_uInt16 nId,
     621             :                                 SfxBindings* pBindings,
     622             :                                 SfxChildWinInfo* ) :
     623           0 :                                 SfxChildWindow( _pParent, nId )
     624             : {
     625           0 :     pDispatch = pBindings->GetDispatcher();
     626           0 :     pWindow = VclPtr<SwInputWindow>::Create( _pParent, pBindings );
     627           0 :     static_cast<SwInputWindow*>(pWindow.get())->ShowWin();
     628           0 :     eChildAlignment = SfxChildAlignment::LOWESTTOP;
     629           0 : }
     630             : 
     631           0 : SwInputChild::~SwInputChild()
     632             : {
     633           0 :     if(pDispatch)
     634           0 :         pDispatch->Lock(false);
     635           0 : }
     636             : 
     637           0 : SfxChildWinInfo SwInputChild::GetInfo() const
     638             : {
     639           0 :     SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
     640           0 :     return aInfo;
     641         177 : }
     642             : 
     643             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11