LCOV - code coverage report
Current view: top level - libreoffice/sw/source/ui/ribbar - inputwin.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 325 0.3 %
Date: 2012-12-27 Functions: 2 29 6.9 %
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             : 
      32             : #include "swtypes.hxx"
      33             : #include "cmdid.h"
      34             : #include "swmodule.hxx"
      35             : #include "wrtsh.hxx"
      36             : #include "view.hxx"
      37             : #include "calc.hxx"
      38             : #include "inputwin.hxx"
      39             : #include "fldbas.hxx"
      40             : #include "fldmgr.hxx"
      41             : #include "frmfmt.hxx"
      42             : #include "cellatr.hxx"
      43             : #include "edtwin.hxx"
      44             : #include "helpid.h"
      45             : 
      46             : // nur fuers UpdateRange - Box in dem der gestackte Cursor sthet loeschen
      47             : #include "pam.hxx"
      48             : 
      49             : #include "swundo.hxx"
      50             : #include "ribbar.hrc"
      51             : #include "inputwin.hrc"
      52             : 
      53             : #include <IDocumentContentOperations.hxx>
      54             : 
      55         136 : SFX_IMPL_POS_CHILDWINDOW_WITHID( SwInputChild, FN_EDIT_FORMULA, SFX_OBJECTBAR_OBJECT )
      56             : 
      57             : //==================================================================
      58             : 
      59           0 : SwInputWindow::SwInputWindow( Window* pParent, SfxBindings* pBind )
      60             :     : ToolBox(  pParent ,   SW_RES( RID_TBX_FORMULA )),
      61             :     aPos(       this,       SW_RES(ED_POS)),
      62             :     aEdit(      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(aEmptyStr)
      69             :     , m_bDoesUndo(true)
      70             :     , m_bResetUndo(false)
      71           0 :     , m_bCallUndo(false)
      72             : {
      73           0 :     bFirst = sal_True;
      74           0 :     bActive = bIsTable = bDelSel = sal_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, 0, 0);
      87           0 :     InsertSeparator ( 1 );
      88           0 :     InsertSeparator ();
      89           0 :     InsertWindow( ED_FORMULA, &aEdit);
      90           0 :     SetHelpId(ED_FORMULA, HID_EDIT_FORMULA);
      91             : 
      92           0 :     SetItemImage( FN_FORMULA_CALC,   pManager->GetImage(FN_FORMULA_CALC   ));
      93           0 :     SetItemImage( FN_FORMULA_CANCEL, pManager->GetImage(FN_FORMULA_CANCEL ));
      94           0 :     SetItemImage( FN_FORMULA_APPLY,  pManager->GetImage(FN_FORMULA_APPLY  ));
      95             : 
      96           0 :     SetItemBits( FN_FORMULA_CALC, GetItemBits( FN_FORMULA_CALC ) | TIB_DROPDOWNONLY );
      97           0 :     SetDropdownClickHdl( LINK( this, SwInputWindow, DropdownClickHdl ));
      98             : 
      99           0 :     Size    aSizeTbx = CalcWindowSizePixel();
     100           0 :     Size    aEditSize = aEdit.GetSizePixel();
     101           0 :     Rectangle aItemRect( GetItemRect(FN_FORMULA_CALC) );
     102           0 :     long nMaxHeight = (aEditSize.Height() > aItemRect.GetHeight()) ? aEditSize.Height() : aItemRect.GetHeight();
     103           0 :     if( nMaxHeight+2 > aSizeTbx.Height() )
     104           0 :         aSizeTbx.Height() = nMaxHeight+2;
     105           0 :     Size aSize = GetSizePixel();
     106           0 :     aSize.Height() = aSizeTbx.Height();
     107           0 :     SetSizePixel( aSize );
     108             : 
     109             :     // align edit and item vcentered
     110           0 :     Size    aPosSize = aPos.GetSizePixel();
     111           0 :     aPosSize.Height()  = nMaxHeight;
     112           0 :     aEditSize.Height() = nMaxHeight;
     113           0 :     Point aPosPos  = aPos.GetPosPixel();
     114           0 :     Point aEditPos = aEdit.GetPosPixel();
     115           0 :     aPosPos.Y()    = (aSize.Height() - nMaxHeight)/2 + 1;
     116           0 :     aEditPos.Y()   = (aSize.Height() - nMaxHeight)/2 + 1;
     117           0 :     aPos.SetPosSizePixel( aPosPos, aPosSize );
     118           0 :     aEdit.SetPosSizePixel( aEditPos, aEditSize );
     119             : 
     120           0 :     aPopMenu.SetSelectHdl(LINK( this, SwInputWindow, MenuHdl ));
     121           0 : }
     122             : 
     123             : //==================================================================
     124             : 
     125           0 : SwInputWindow::~SwInputWindow()
     126             : {
     127           0 :     SfxImageManager::GetImageManager( SW_MOD() )->ReleaseToolBox(this);
     128             : 
     129             :     //Lineale aufwecken
     130           0 :     if(pView)
     131             :     {
     132           0 :         pView->GetHLineal().SetActive( sal_True );
     133           0 :         pView->GetVLineal().SetActive( sal_True );
     134             :     }
     135           0 :     delete pMgr;
     136           0 :     if(pWrtShell)
     137           0 :         pWrtShell->EndSelTblCells();
     138             : 
     139           0 :     CleanupUglyHackWithUndo();
     140           0 : }
     141             : 
     142           0 : void SwInputWindow::CleanupUglyHackWithUndo()
     143             : {
     144           0 :     if (m_bResetUndo)
     145             :     {
     146           0 :         DelBoxCntnt();
     147           0 :         pWrtShell->DoUndo(m_bDoesUndo);
     148           0 :         if (m_bCallUndo)
     149             :         {
     150           0 :             pWrtShell->Undo();
     151             :         }
     152           0 :         m_bResetUndo = false; // #i117122# once is enough :)
     153             :     }
     154           0 : }
     155             : 
     156             : 
     157             : //==================================================================
     158             : 
     159           0 : void SwInputWindow::DataChanged( const DataChangedEvent& rDCEvt )
     160             : {
     161           0 :     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
     162             :     {
     163             :         //      update item images
     164           0 :         SwModule *pMod  = SW_MOD();
     165           0 :         SfxImageManager *pImgMgr = SfxImageManager::GetImageManager( pMod );
     166           0 :         SetItemImage( FN_FORMULA_CALC,   pImgMgr->GetImage(FN_FORMULA_CALC   ));
     167           0 :         SetItemImage( FN_FORMULA_CANCEL, pImgMgr->GetImage(FN_FORMULA_CANCEL ));
     168           0 :         SetItemImage( FN_FORMULA_APPLY,  pImgMgr->GetImage(FN_FORMULA_APPLY  ));
     169             :     }
     170             : 
     171           0 :     ToolBox::DataChanged( rDCEvt );
     172           0 : }
     173             : 
     174             : //==================================================================
     175             : 
     176           0 : void SwInputWindow::Resize()
     177             : {
     178           0 :     ToolBox::Resize();
     179             : 
     180           0 :     long    nWidth      = GetSizePixel().Width();
     181           0 :     long    nLeft       = aEdit.GetPosPixel().X();
     182           0 :     Size    aEditSize   = aEdit.GetSizePixel();
     183             : 
     184           0 :     aEditSize.Width() = Max( ((long)(nWidth - nLeft - 5)), (long)0 );
     185           0 :     aEdit.SetSizePixel( aEditSize );
     186           0 :     aEdit.Invalidate();
     187           0 : }
     188             : 
     189             : //==================================================================
     190             : 
     191           0 : void SwInputWindow::ShowWin()
     192             : {
     193           0 :     bIsTable = sal_False;
     194             :     //Lineale anhalten
     195           0 :     if(pView)
     196             :     {
     197           0 :         pView->GetHLineal().SetActive( sal_False );
     198           0 :         pView->GetVLineal().SetActive( sal_False );
     199             : 
     200             :         OSL_ENSURE(pWrtShell, "no WrtShell!");
     201             :         // Cursor in Tabelle
     202           0 :         bIsTable = pWrtShell->IsCrsrInTbl() ? sal_True : sal_False;
     203             : 
     204           0 :         if( bFirst )
     205             :             pWrtShell->SelTblCells( LINK( this, SwInputWindow,
     206           0 :                                                 SelTblCellsNotify) );
     207           0 :         if( bIsTable )
     208             :         {
     209           0 :             const String& rPos = pWrtShell->GetBoxNms();
     210           0 :             sal_uInt16 nPos = 0;
     211           0 :             short nSrch = -1;
     212           0 :             while( (nPos = rPos.Search( ':',nPos + 1 ) ) != STRING_NOTFOUND )
     213           0 :                 nSrch = (short) nPos;
     214           0 :             aPos.SetText( rPos.Copy( ++nSrch ) );
     215           0 :             aAktTableName = pWrtShell->GetTableFmt()->GetName();
     216             :         }
     217             :         else
     218           0 :             aPos.SetText(SW_RESSTR(STR_TBL_FORMULA));
     219             : 
     220             :         // Aktuelles Feld bearbeiten
     221             :         OSL_ENSURE(pMgr == 0, "FieldManager not deleted");
     222           0 :         pMgr = new SwFldMgr;
     223             : 
     224             :         // Formel soll immer mit einem "=" beginnen, hier
     225             :         // also setzen
     226           0 :         String sEdit = rtl::OUString('=');
     227           0 :         if( pMgr->GetCurFld() && TYP_FORMELFLD == pMgr->GetCurTypeId() )
     228             :         {
     229           0 :             sEdit += pMgr->GetCurFldPar2();
     230             :         }
     231           0 :         else if( bFirst )
     232             :         {
     233           0 :             if( bIsTable )
     234             :             {
     235           0 :                 m_bResetUndo = true;
     236             :                 SAL_WARN_IF(
     237             :                     officecfg::Office::Common::Undo::Steps::get() <= 0,
     238             :                     "sw", "/org.openoffice.Office.Common/Undo/Steps <= 0");
     239             : 
     240           0 :                 m_bDoesUndo = pWrtShell->DoesUndo();
     241           0 :                 if( !m_bDoesUndo )
     242             :                 {
     243           0 :                     pWrtShell->DoUndo( sal_True );
     244             :                 }
     245             : 
     246           0 :                 if( !pWrtShell->SwCrsrShell::HasSelection() )
     247             :                 {
     248           0 :                     pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
     249           0 :                     pWrtShell->SetMark();
     250           0 :                     pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
     251             :                 }
     252           0 :                 if( pWrtShell->SwCrsrShell::HasSelection() )
     253             :                 {
     254           0 :                     pWrtShell->StartUndo( UNDO_DELETE );
     255           0 :                     pWrtShell->Delete();
     256           0 :                     if( 0 != pWrtShell->EndUndo( UNDO_DELETE ))
     257             :                     {
     258           0 :                         m_bCallUndo = true;
     259             :                     }
     260             :                 }
     261           0 :                 pWrtShell->DoUndo(false);
     262             : 
     263           0 :                 SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
     264           0 :                 if( pWrtShell->GetTblBoxFormulaAttrs( aSet ))
     265           0 :                     sEdit += ((SwTblBoxFormula&)aSet.Get( RES_BOXATR_FORMULA )).GetFormula();
     266             :             }
     267             :         }
     268             : 
     269           0 :         if( bFirst )
     270             :         {
     271             :             // WrtShell Flags richtig setzen
     272           0 :             pWrtShell->SttSelect();
     273           0 :             pWrtShell->EndSelect();
     274             :         }
     275             : 
     276           0 :         bFirst = sal_False;
     277             : 
     278           0 :         aEdit.SetModifyHdl( LINK( this, SwInputWindow, ModifyHdl ));
     279             : 
     280           0 :         aEdit.SetText( sEdit );
     281           0 :         aEdit.SetSelection( Selection( sEdit.Len(), sEdit.Len() ) );
     282           0 :         sOldFml = sEdit;
     283             : 
     284           0 :         aEdit.Invalidate();
     285           0 :         aEdit.Update();
     286           0 :         aEdit.GrabFocus();
     287             :         // UserInterface fuer die Eingabe abklemmen
     288             : 
     289           0 :         pView->GetEditWin().LockKeyInput(sal_True);
     290           0 :         pView->GetViewFrame()->GetDispatcher()->Lock(sal_True);
     291           0 :         pWrtShell->Push();
     292             :     }
     293           0 :     ToolBox::Show();
     294           0 : }
     295             : //==================================================================
     296             : 
     297           0 : IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu )
     298             : {
     299             : static const char * const aStrArr[] = {
     300             :     sCalc_Phd,
     301             :     sCalc_Sqrt,
     302             :     sCalc_Or,
     303             :     sCalc_Xor,
     304             :     sCalc_And,
     305             :     sCalc_Not,
     306             :     sCalc_Eq,
     307             :     sCalc_Neq,
     308             :     sCalc_Leq,
     309             :     sCalc_Geq,
     310             :     sCalc_L,
     311             :     sCalc_G,
     312             :     sCalc_Sum,
     313             :     sCalc_Mean,
     314             :     sCalc_Min,
     315             :     sCalc_Max,
     316             :     sCalc_Sin,
     317             :     sCalc_Cos,
     318             :     sCalc_Tan,
     319             :     sCalc_Asin,
     320             :     sCalc_Acos,
     321             :     sCalc_Atan,
     322             :     sCalc_Pow,
     323             :     "|",
     324             :     sCalc_Round
     325             : };
     326             : 
     327           0 :     sal_uInt16 nId = pMenu->GetCurItemId();
     328           0 :     if ( nId <= MN_CALC_ROUND )
     329             :     {
     330           0 :         String aTmp( rtl::OUString::createFromAscii(aStrArr[nId - 1]) );
     331           0 :         aTmp += ' ';
     332           0 :         aEdit.ReplaceSelected( aTmp );
     333             :     }
     334           0 :     return 0;
     335             : }
     336             : 
     337           0 : IMPL_LINK_NOARG(SwInputWindow, DropdownClickHdl)
     338             : {
     339           0 :     sal_uInt16 nCurID = GetCurItemId();
     340           0 :     EndSelection(); // setzt CurItemId zurueck !
     341           0 :     switch ( nCurID )
     342             :     {
     343             :         case FN_FORMULA_CALC :
     344             :         {
     345           0 :             aPopMenu.Execute( this, GetItemRect( FN_FORMULA_CALC ), POPUPMENU_NOMOUSEUPCLOSE );
     346           0 :             break;
     347             :         default:
     348           0 :             break;
     349             :         }
     350             :     }
     351             : 
     352           0 :     return sal_True;
     353             : }
     354             : 
     355             : //==================================================================
     356             : 
     357             : 
     358           0 : void SwInputWindow::Click( )
     359             : {
     360           0 :     sal_uInt16 nCurID = GetCurItemId();
     361           0 :     EndSelection(); // setzt CurItemId zurueck !
     362           0 :     switch ( nCurID )
     363             :     {
     364             :         case FN_FORMULA_CANCEL:
     365             :         {
     366           0 :             CancelFormula();
     367             :         }
     368           0 :         break;
     369             :         case FN_FORMULA_APPLY:
     370             :         {
     371           0 :             ApplyFormula();
     372             :         }
     373           0 :         break;
     374             :    }
     375           0 : }
     376             : 
     377             : //==================================================================
     378             : 
     379           0 : void  SwInputWindow::ApplyFormula()
     380             : {
     381           0 :     pView->GetViewFrame()->GetDispatcher()->Lock(sal_False);
     382           0 :     pView->GetEditWin().LockKeyInput(sal_False);
     383           0 :     CleanupUglyHackWithUndo();
     384           0 :     pWrtShell->Pop( sal_False );
     385             : 
     386             :     // Formel soll immer mit einem "=" beginnen, hier
     387             :     // also wieder entfernen
     388           0 :     String sEdit(comphelper::string::strip(aEdit.GetText(), ' '));
     389           0 :     if( sEdit.Len() && '=' == sEdit.GetChar( 0 ) )
     390           0 :         sEdit.Erase( 0, 1 );
     391           0 :     SfxStringItem aParam(FN_EDIT_FORMULA, sEdit);
     392             : 
     393           0 :     pWrtShell->EndSelTblCells();
     394           0 :     pView->GetEditWin().GrabFocus();
     395             :     const SfxPoolItem* aArgs[2];
     396           0 :     aArgs[0] = &aParam;
     397           0 :     aArgs[1] = 0;
     398           0 :     pView->GetViewFrame()->GetBindings().Execute( FN_EDIT_FORMULA, aArgs, 0, SFX_CALLMODE_ASYNCHRON );
     399           0 : }
     400             : 
     401             : //==================================================================
     402             : 
     403           0 : void  SwInputWindow::CancelFormula()
     404             : {
     405           0 :     if(pView)
     406             :     {
     407           0 :         pView->GetViewFrame()->GetDispatcher()->Lock( sal_False );
     408           0 :         pView->GetEditWin().LockKeyInput(sal_False);
     409           0 :         CleanupUglyHackWithUndo();
     410           0 :         pWrtShell->Pop( sal_False );
     411             : 
     412           0 :         if( bDelSel )
     413           0 :             pWrtShell->EnterStdMode();
     414             : 
     415           0 :         pWrtShell->EndSelTblCells();
     416             : 
     417           0 :         pView->GetEditWin().GrabFocus();
     418             :     }
     419           0 :     pView->GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FORMULA, SFX_CALLMODE_ASYNCHRON);
     420           0 : }
     421             : //==================================================================
     422             : 
     423             : const sal_Unicode CH_LRE = 0x202a;
     424             : const sal_Unicode CH_PDF = 0x202c;
     425             : 
     426           0 : IMPL_LINK( SwInputWindow, SelTblCellsNotify, SwWrtShell *, pCaller )
     427             : {
     428           0 :     if(bIsTable)
     429             :     {
     430           0 :         SwFrmFmt* pTblFmt = pCaller->GetTableFmt();
     431           0 :         String sBoxNms( pCaller->GetBoxNms() );
     432           0 :         String sTblNm;
     433           0 :         if( pTblFmt && aAktTableName != pTblFmt->GetName() )
     434           0 :             sTblNm = pTblFmt->GetName();
     435             : 
     436           0 :         aEdit.UpdateRange( sBoxNms, sTblNm );
     437             : 
     438           0 :         String sNew;
     439           0 :         sNew += CH_LRE;
     440           0 :         sNew += aEdit.GetText();
     441           0 :         sNew += CH_PDF;
     442             : 
     443           0 :         if( sNew != sOldFml )
     444             :         {
     445             :             // Die WrtShell ist in der Tabellen Selektion
     446             :             // dann die Tabellen Selektion wieder aufheben, sonst steht der
     447             :             // Cursor "im Wald" und das LiveUpdate funktioniert nicht!
     448           0 :             pWrtShell->StartAllAction();
     449             : 
     450           0 :             SwPaM aPam( *pWrtShell->GetStkCrsr()->GetPoint() );
     451           0 :             aPam.Move( fnMoveBackward, fnGoSection );
     452           0 :             aPam.SetMark();
     453           0 :             aPam.Move( fnMoveForward, fnGoSection );
     454             : 
     455           0 :             IDocumentContentOperations* pIDCO = pWrtShell->getIDocumentContentOperations();
     456           0 :             pIDCO->DeleteRange( aPam );
     457           0 :             pIDCO->InsertString( aPam, sNew );
     458           0 :             pWrtShell->EndAllAction();
     459           0 :             sOldFml = sNew;
     460           0 :         }
     461             :     }
     462             :     else
     463           0 :         aEdit.GrabFocus();
     464           0 :     return 0;
     465             : }
     466             : 
     467             : 
     468           0 : void SwInputWindow::SetFormula( const String& rFormula, sal_Bool bDelFlag )
     469             : {
     470           0 :     String sEdit = rtl::OUString('=');
     471           0 :     if( rFormula.Len() )
     472             :     {
     473           0 :         if( '=' == rFormula.GetChar( 0 ) )
     474           0 :             sEdit = rFormula;
     475             :         else
     476           0 :             sEdit += rFormula;
     477             :     }
     478           0 :     aEdit.SetText( sEdit );
     479           0 :     aEdit.SetSelection( Selection( sEdit.Len(), sEdit.Len() ) );
     480           0 :     aEdit.Invalidate();
     481           0 :     bDelSel = bDelFlag;
     482           0 : }
     483             : 
     484           0 : IMPL_LINK_NOARG(SwInputWindow, ModifyHdl)
     485             : {
     486           0 :     if (bIsTable && m_bResetUndo)
     487             :     {
     488           0 :         pWrtShell->StartAllAction();
     489           0 :         DelBoxCntnt();
     490           0 :         String sNew;
     491           0 :         sNew += CH_LRE;
     492           0 :         sNew += aEdit.GetText();
     493           0 :         sNew += CH_PDF;
     494           0 :         pWrtShell->SwEditShell::Insert2( sNew );
     495           0 :         pWrtShell->EndAllAction();
     496           0 :         sOldFml = sNew;
     497             :     }
     498           0 :     return 0;
     499             : }
     500             : 
     501             : 
     502           0 : void SwInputWindow::DelBoxCntnt()
     503             : {
     504           0 :     if( bIsTable )
     505             :     {
     506           0 :         pWrtShell->StartAllAction();
     507           0 :         pWrtShell->ClearMark();
     508           0 :         pWrtShell->Pop( sal_False );
     509           0 :         pWrtShell->Push();
     510           0 :         pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
     511           0 :         pWrtShell->SetMark();
     512           0 :         pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
     513           0 :         pWrtShell->SwEditShell::Delete();
     514           0 :         pWrtShell->EndAllAction();
     515             :     }
     516           0 : }
     517             : 
     518             : //==================================================================
     519             : 
     520           0 : void InputEdit::KeyInput(const KeyEvent& rEvent)
     521             : {
     522           0 :     const KeyCode aCode = rEvent.GetKeyCode();
     523           0 :     if(aCode == KEY_RETURN || aCode == KEY_F2 )
     524           0 :         ((SwInputWindow*)GetParent())->ApplyFormula();
     525           0 :     else if(aCode == KEY_ESCAPE )
     526           0 :         ((SwInputWindow*)GetParent())->CancelFormula();
     527             :     else
     528           0 :         Edit::KeyInput(rEvent);
     529           0 : }
     530             : 
     531             : //==================================================================
     532             : 
     533           0 : void InputEdit::UpdateRange(const String& rBoxes,
     534             :                                     const String& rName )
     535             : {
     536           0 :     if( !rBoxes.Len() )
     537             :     {
     538           0 :         GrabFocus();
     539           0 :         return;
     540             :     }
     541           0 :     const sal_Unicode   cOpen = '<', cClose = '>',
     542           0 :                 cOpenBracket = '(';
     543           0 :     String aPrefix = rName;
     544           0 :     if(rName.Len())
     545           0 :         aPrefix += '.';
     546           0 :     String aBoxes = aPrefix;
     547           0 :     aBoxes += rBoxes;
     548           0 :     Selection aSelection(GetSelection());
     549           0 :     sal_uInt16 nSel = (sal_uInt16) aSelection.Len();
     550             :     //OS: mit dem folgenden Ausdruck wird sichergestellt, dass im overwrite-Modus
     551             :     //die selektierte schliessende Klammer nicht geloescht wird
     552           0 :     if( nSel && ( nSel > 1 ||
     553           0 :         GetText().GetChar( (sal_uInt16)aSelection.Min() ) != cClose ) )
     554           0 :         Cut();
     555             :     else
     556           0 :         aSelection.Max() = aSelection.Min();
     557           0 :     String aActText(GetText());
     558           0 :     const sal_uInt16 nLen = aActText.Len();
     559           0 :     if( !nLen )
     560             :     {
     561             :         String aStr = rtl::OUStringBuffer().
     562           0 :             append(cOpen).append(aBoxes).append(cClose).
     563           0 :             makeStringAndClear();
     564           0 :         SetText(aStr);
     565           0 :         sal_uInt16 nPos = aStr.Search( cClose );
     566             :         OSL_ENSURE(nPos < aStr.Len(), "delimiter not found");
     567           0 :         ++nPos;
     568           0 :         SetSelection( Selection( nPos, nPos ));
     569             :     }
     570             :     else
     571             :     {
     572           0 :         sal_Bool bFound = sal_False;
     573             :         sal_Unicode cCh;
     574           0 :         sal_uInt16 nPos, nEndPos = 0, nStartPos = (sal_uInt16) aSelection.Min();
     575           0 :         if( nStartPos-- )
     576             :         {
     577           0 :             do {
     578           0 :                 if( cOpen  == (cCh = aActText.GetChar( nStartPos ) ) ||
     579             :                     cOpenBracket == cCh )
     580             :                 {
     581           0 :                     bFound = cCh == cOpen;
     582           0 :                     break;
     583             :                 }
     584             :             } while( nStartPos-- > 0 );
     585             :         }
     586           0 :         if( bFound )
     587             :         {
     588           0 :             bFound = sal_False;
     589           0 :             nEndPos = nStartPos;
     590           0 :             while( nEndPos < nLen )
     591             :             {
     592           0 :                 if( cClose == (cCh = aActText.GetChar( nEndPos )))
     593             :                 {
     594           0 :                     bFound = sal_True;
     595           0 :                     break;
     596             :                 }
     597           0 :                 ++nEndPos;
     598             :             }
     599             :             // nur wenn akt. Pos im Breich oder direkt dahinter liegt
     600           0 :             if( bFound && !( nStartPos < (sal_uInt16)aSelection.Max() &&
     601           0 :                              (sal_uInt16)aSelection.Max() <= nEndPos + 1 ))
     602           0 :                 bFound = sal_False;
     603             :         }
     604           0 :         if( bFound )
     605             :         {
     606           0 :             nPos = ++nStartPos + 1; // wir wollen dahinter
     607           0 :             aActText.Erase( nStartPos, nEndPos - nStartPos );
     608           0 :             aActText.Insert( aBoxes, nStartPos );
     609           0 :             nPos = nPos + aBoxes.Len();
     610             :         }
     611             :         else
     612             :         {
     613             :             rtl::OUString aTmp = rtl::OUStringBuffer().
     614           0 :                 append(cOpen).append(aBoxes).append(cClose).
     615           0 :                 makeStringAndClear();
     616           0 :             nPos = (sal_uInt16)aSelection.Min();
     617           0 :             aActText.Insert( aTmp, nPos );
     618           0 :             nPos = nPos + aTmp.getLength();
     619             :         }
     620           0 :         if( GetText() != aActText )
     621             :         {
     622           0 :             SetText( aActText );
     623           0 :             SetSelection( Selection( nPos, nPos ) );
     624             :         }
     625             :     }
     626           0 :     GrabFocus();
     627             : 
     628             : }
     629             : //==================================================================
     630             : 
     631           0 : SwInputChild::SwInputChild(Window* _pParent,
     632             :                                 sal_uInt16 nId,
     633             :                                 SfxBindings* pBindings,
     634             :                                 SfxChildWinInfo* ) :
     635           0 :                                 SfxChildWindow( _pParent, nId )
     636             : {
     637           0 :     pDispatch = pBindings->GetDispatcher();
     638           0 :     pWindow = new SwInputWindow( _pParent, pBindings );
     639           0 :     ((SwInputWindow*)pWindow)->ShowWin();
     640           0 :     eChildAlignment = SFX_ALIGN_LOWESTTOP;
     641           0 : }
     642             : 
     643             : 
     644           0 : SwInputChild::~SwInputChild()
     645             : {
     646           0 :     if(pDispatch)
     647           0 :         pDispatch->Lock(sal_False);
     648           0 : }
     649             : 
     650             : 
     651           0 : SfxChildWinInfo SwInputChild::GetInfo() const
     652             : {
     653           0 :     SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
     654           0 :     return aInfo;
     655             : }
     656             : 
     657             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10