1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sw.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <tools/gen.hxx> 33*cdf0e10cSrcweir #include <sfx2/imgmgr.hxx> 34*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 35*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 36*cdf0e10cSrcweir #include <svx/ruler.hxx> 37*cdf0e10cSrcweir #include <svl/zforlist.hxx> 38*cdf0e10cSrcweir #include <svl/stritem.hxx> 39*cdf0e10cSrcweir #include <unotools/undoopt.hxx> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include "swtypes.hxx" 42*cdf0e10cSrcweir #include "cmdid.h" 43*cdf0e10cSrcweir #include "swmodule.hxx" 44*cdf0e10cSrcweir #include "wrtsh.hxx" 45*cdf0e10cSrcweir #include "view.hxx" 46*cdf0e10cSrcweir #include "calc.hxx" 47*cdf0e10cSrcweir #include "inputwin.hxx" 48*cdf0e10cSrcweir #include "fldbas.hxx" 49*cdf0e10cSrcweir #include "fldmgr.hxx" 50*cdf0e10cSrcweir #include "frmfmt.hxx" 51*cdf0e10cSrcweir #include "cellatr.hxx" 52*cdf0e10cSrcweir #include "edtwin.hxx" 53*cdf0e10cSrcweir #include "helpid.h" 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir // nur fuers UpdateRange - Box in dem der gestackte Cursor sthet loeschen 56*cdf0e10cSrcweir #include "pam.hxx" 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir #include "swundo.hxx" 59*cdf0e10cSrcweir #include "ribbar.hrc" 60*cdf0e10cSrcweir #include "inputwin.hrc" 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir #include <IDocumentContentOperations.hxx> 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir SFX_IMPL_POS_CHILDWINDOW( SwInputChild, FN_EDIT_FORMULA, SFX_OBJECTBAR_OBJECT ) 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir //================================================================== 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir SwInputWindow::SwInputWindow( Window* pParent, SfxBindings* pBind ) 69*cdf0e10cSrcweir : ToolBox( pParent , SW_RES( RID_TBX_FORMULA )), 70*cdf0e10cSrcweir aPos( this, SW_RES(ED_POS)), 71*cdf0e10cSrcweir aEdit( this, WB_3DLOOK|WB_TABSTOP|WB_BORDER|WB_NOHIDESELECTION), 72*cdf0e10cSrcweir aPopMenu( SW_RES(MN_CALC_POPUP)), 73*cdf0e10cSrcweir pMgr(0), 74*cdf0e10cSrcweir pWrtShell(0), 75*cdf0e10cSrcweir pView(0), 76*cdf0e10cSrcweir pBindings(pBind), 77*cdf0e10cSrcweir aAktTableName(aEmptyStr) 78*cdf0e10cSrcweir , m_nActionCount(0) 79*cdf0e10cSrcweir , m_bDoesUndo(true) 80*cdf0e10cSrcweir , m_bResetUndo(false) 81*cdf0e10cSrcweir , m_bCallUndo(false) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir bFirst = sal_True; 84*cdf0e10cSrcweir bActive = bIsTable = bDelSel = sal_False; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir FreeResource(); 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir aEdit.SetSizePixel( aEdit.CalcMinimumSize() ); 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir SfxImageManager* pManager = SfxImageManager::GetImageManager( SW_MOD() ); 91*cdf0e10cSrcweir pManager->RegisterToolBox(this); 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir pView = ::GetActiveView(); 94*cdf0e10cSrcweir pWrtShell = pView ? pView->GetWrtShellPtr() : 0; 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir InsertWindow( ED_POS, &aPos, 0, 0); 97*cdf0e10cSrcweir InsertSeparator ( 1 ); 98*cdf0e10cSrcweir InsertSeparator (); 99*cdf0e10cSrcweir InsertWindow( ED_FORMULA, &aEdit); 100*cdf0e10cSrcweir SetHelpId(ED_FORMULA, HID_EDIT_FORMULA); 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); 103*cdf0e10cSrcweir SetItemImage( FN_FORMULA_CALC, pManager->GetImage(FN_FORMULA_CALC, bHC )); 104*cdf0e10cSrcweir SetItemImage( FN_FORMULA_CANCEL, pManager->GetImage(FN_FORMULA_CANCEL, bHC )); 105*cdf0e10cSrcweir SetItemImage( FN_FORMULA_APPLY, pManager->GetImage(FN_FORMULA_APPLY, bHC )); 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir SetItemBits( FN_FORMULA_CALC, GetItemBits( FN_FORMULA_CALC ) | TIB_DROPDOWNONLY ); 108*cdf0e10cSrcweir SetDropdownClickHdl( LINK( this, SwInputWindow, DropdownClickHdl )); 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir Size aSizeTbx = CalcWindowSizePixel(); 111*cdf0e10cSrcweir Size aEditSize = aEdit.GetSizePixel(); 112*cdf0e10cSrcweir Rectangle aItemRect( GetItemRect(FN_FORMULA_CALC) ); 113*cdf0e10cSrcweir long nMaxHeight = (aEditSize.Height() > aItemRect.GetHeight()) ? aEditSize.Height() : aItemRect.GetHeight(); 114*cdf0e10cSrcweir if( nMaxHeight+2 > aSizeTbx.Height() ) 115*cdf0e10cSrcweir aSizeTbx.Height() = nMaxHeight+2; 116*cdf0e10cSrcweir Size aSize = GetSizePixel(); 117*cdf0e10cSrcweir aSize.Height() = aSizeTbx.Height(); 118*cdf0e10cSrcweir SetSizePixel( aSize ); 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir // align edit and item vcentered 121*cdf0e10cSrcweir Size aPosSize = aPos.GetSizePixel(); 122*cdf0e10cSrcweir aPosSize.Height() = nMaxHeight; 123*cdf0e10cSrcweir aEditSize.Height() = nMaxHeight; 124*cdf0e10cSrcweir Point aPosPos = aPos.GetPosPixel(); 125*cdf0e10cSrcweir Point aEditPos = aEdit.GetPosPixel(); 126*cdf0e10cSrcweir aPosPos.Y() = (aSize.Height() - nMaxHeight)/2 + 1; 127*cdf0e10cSrcweir aEditPos.Y() = (aSize.Height() - nMaxHeight)/2 + 1; 128*cdf0e10cSrcweir aPos.SetPosSizePixel( aPosPos, aPosSize ); 129*cdf0e10cSrcweir aEdit.SetPosSizePixel( aEditPos, aEditSize ); 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir aPopMenu.SetSelectHdl(LINK( this, SwInputWindow, MenuHdl )); 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir //================================================================== 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir __EXPORT SwInputWindow::~SwInputWindow() 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir SfxImageManager::GetImageManager( SW_MOD() )->ReleaseToolBox(this); 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir //Lineale aufwecken 141*cdf0e10cSrcweir if(pView) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir pView->GetHLineal().SetActive( sal_True ); 144*cdf0e10cSrcweir pView->GetVLineal().SetActive( sal_True ); 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir if ( pMgr ) 147*cdf0e10cSrcweir delete pMgr; 148*cdf0e10cSrcweir if(pWrtShell) 149*cdf0e10cSrcweir pWrtShell->EndSelTblCells(); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir CleanupUglyHackWithUndo(); 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir void SwInputWindow::CleanupUglyHackWithUndo() 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir if (m_bResetUndo) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir DelBoxCntnt(); 159*cdf0e10cSrcweir pWrtShell->DoUndo(m_bDoesUndo); 160*cdf0e10cSrcweir if (m_bCallUndo) 161*cdf0e10cSrcweir { 162*cdf0e10cSrcweir pWrtShell->Undo(); 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir if (0 == m_nActionCount) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir SW_MOD()->GetUndoOptions().SetUndoCount(0); 167*cdf0e10cSrcweir } 168*cdf0e10cSrcweir m_bResetUndo = false; // #i117122# once is enough :) 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir //================================================================== 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir void SwInputWindow::DataChanged( const DataChangedEvent& rDCEvt ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir // update item images 180*cdf0e10cSrcweir SwModule *pMod = SW_MOD(); 181*cdf0e10cSrcweir SfxImageManager *pImgMgr = SfxImageManager::GetImageManager( pMod ); 182*cdf0e10cSrcweir sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); 183*cdf0e10cSrcweir // 184*cdf0e10cSrcweir SetItemImage( FN_FORMULA_CALC, pImgMgr->GetImage(FN_FORMULA_CALC, bHC )); 185*cdf0e10cSrcweir SetItemImage( FN_FORMULA_CANCEL, pImgMgr->GetImage(FN_FORMULA_CANCEL, bHC )); 186*cdf0e10cSrcweir SetItemImage( FN_FORMULA_APPLY, pImgMgr->GetImage(FN_FORMULA_APPLY, bHC )); 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir ToolBox::DataChanged( rDCEvt ); 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir //================================================================== 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir void __EXPORT SwInputWindow::Resize() 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir ToolBox::Resize(); 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir long nWidth = GetSizePixel().Width(); 199*cdf0e10cSrcweir long nLeft = aEdit.GetPosPixel().X(); 200*cdf0e10cSrcweir Size aEditSize = aEdit.GetSizePixel(); 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir aEditSize.Width() = Max( ((long)(nWidth - nLeft - 5)), (long)0 ); 203*cdf0e10cSrcweir aEdit.SetSizePixel( aEditSize ); 204*cdf0e10cSrcweir aEdit.Invalidate(); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir //================================================================== 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir void SwInputWindow::ShowWin() 210*cdf0e10cSrcweir { 211*cdf0e10cSrcweir bIsTable = sal_False; 212*cdf0e10cSrcweir //Lineale anhalten 213*cdf0e10cSrcweir if(pView) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir pView->GetHLineal().SetActive( sal_False ); 216*cdf0e10cSrcweir pView->GetVLineal().SetActive( sal_False ); 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir DBG_ASSERT(pWrtShell, "Keine WrtShell!"); 219*cdf0e10cSrcweir // Cursor in Tabelle 220*cdf0e10cSrcweir bIsTable = pWrtShell->IsCrsrInTbl() ? sal_True : sal_False; 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir if( bFirst ) 223*cdf0e10cSrcweir pWrtShell->SelTblCells( LINK( this, SwInputWindow, 224*cdf0e10cSrcweir SelTblCellsNotify) ); 225*cdf0e10cSrcweir if( bIsTable ) 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir const String& rPos = pWrtShell->GetBoxNms(); 228*cdf0e10cSrcweir sal_uInt16 nPos = 0; 229*cdf0e10cSrcweir short nSrch = -1; 230*cdf0e10cSrcweir while( (nPos = rPos.Search( ':',nPos + 1 ) ) != STRING_NOTFOUND ) 231*cdf0e10cSrcweir nSrch = (short) nPos; 232*cdf0e10cSrcweir aPos.SetText( rPos.Copy( ++nSrch ) ); 233*cdf0e10cSrcweir aAktTableName = pWrtShell->GetTableFmt()->GetName(); 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir else 236*cdf0e10cSrcweir aPos.SetText(SW_RESSTR(STR_TBL_FORMULA)); 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir // Aktuelles Feld bearbeiten 239*cdf0e10cSrcweir ASSERT(pMgr == 0, FieldManager nicht geloescht.); 240*cdf0e10cSrcweir pMgr = new SwFldMgr; 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir // JP 13.01.97: Formel soll immer mit einem "=" beginnen, hier 243*cdf0e10cSrcweir // also setzen 244*cdf0e10cSrcweir String sEdit( '=' ); 245*cdf0e10cSrcweir if( pMgr->GetCurFld() && TYP_FORMELFLD == pMgr->GetCurTypeId() ) 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir sEdit += pMgr->GetCurFldPar2(); 248*cdf0e10cSrcweir } 249*cdf0e10cSrcweir else if( bFirst ) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir if( bIsTable ) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir m_bResetUndo = true; 254*cdf0e10cSrcweir m_nActionCount = SW_MOD()->GetUndoOptions().GetUndoCount(); 255*cdf0e10cSrcweir if (0 == m_nActionCount) { // deactivated? turn it on... 256*cdf0e10cSrcweir SW_MOD()->GetUndoOptions().SetUndoCount(1); 257*cdf0e10cSrcweir } 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir m_bDoesUndo = pWrtShell->DoesUndo(); 260*cdf0e10cSrcweir if( !m_bDoesUndo ) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir pWrtShell->DoUndo( sal_True ); 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir if( !pWrtShell->SwCrsrShell::HasSelection() ) 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir pWrtShell->MoveSection( fnSectionCurr, fnSectionStart ); 268*cdf0e10cSrcweir pWrtShell->SetMark(); 269*cdf0e10cSrcweir pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd ); 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir if( pWrtShell->SwCrsrShell::HasSelection() ) 272*cdf0e10cSrcweir { 273*cdf0e10cSrcweir pWrtShell->StartUndo( UNDO_DELETE ); 274*cdf0e10cSrcweir pWrtShell->Delete(); 275*cdf0e10cSrcweir if( 0 != pWrtShell->EndUndo( UNDO_DELETE )) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir m_bCallUndo = true; 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir pWrtShell->DoUndo(false); 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA ); 283*cdf0e10cSrcweir if( pWrtShell->GetTblBoxFormulaAttrs( aSet )) 284*cdf0e10cSrcweir sEdit += ((SwTblBoxFormula&)aSet.Get( RES_BOXATR_FORMULA )).GetFormula(); 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir if( bFirst ) 289*cdf0e10cSrcweir { 290*cdf0e10cSrcweir // WrtShell Flags richtig setzen 291*cdf0e10cSrcweir pWrtShell->SttSelect(); 292*cdf0e10cSrcweir pWrtShell->EndSelect(); 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir bFirst = sal_False; 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir aEdit.SetModifyHdl( LINK( this, SwInputWindow, ModifyHdl )); 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir aEdit.SetText( sEdit ); 300*cdf0e10cSrcweir aEdit.SetSelection( Selection( sEdit.Len(), sEdit.Len() ) ); 301*cdf0e10cSrcweir sOldFml = sEdit; 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir aEdit.Invalidate(); 304*cdf0e10cSrcweir aEdit.Update(); 305*cdf0e10cSrcweir aEdit.GrabFocus(); 306*cdf0e10cSrcweir // UserInterface fuer die Eingabe abklemmen 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir pView->GetEditWin().LockKeyInput(sal_True); 309*cdf0e10cSrcweir pView->GetViewFrame()->GetDispatcher()->Lock(sal_True); 310*cdf0e10cSrcweir pWrtShell->Push(); 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir ToolBox::Show(); 313*cdf0e10cSrcweir } 314*cdf0e10cSrcweir //================================================================== 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu ) 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir static const char * __READONLY_DATA aStrArr[] = { 319*cdf0e10cSrcweir sCalc_Phd, 320*cdf0e10cSrcweir sCalc_Sqrt, 321*cdf0e10cSrcweir sCalc_Or, 322*cdf0e10cSrcweir sCalc_Xor, 323*cdf0e10cSrcweir sCalc_And, 324*cdf0e10cSrcweir sCalc_Not, 325*cdf0e10cSrcweir sCalc_Eq, 326*cdf0e10cSrcweir sCalc_Neq, 327*cdf0e10cSrcweir sCalc_Leq, 328*cdf0e10cSrcweir sCalc_Geq, 329*cdf0e10cSrcweir sCalc_L, 330*cdf0e10cSrcweir sCalc_G, 331*cdf0e10cSrcweir sCalc_Sum, 332*cdf0e10cSrcweir sCalc_Mean, 333*cdf0e10cSrcweir sCalc_Min, 334*cdf0e10cSrcweir sCalc_Max, 335*cdf0e10cSrcweir sCalc_Sin, 336*cdf0e10cSrcweir sCalc_Cos, 337*cdf0e10cSrcweir sCalc_Tan, 338*cdf0e10cSrcweir sCalc_Asin, 339*cdf0e10cSrcweir sCalc_Acos, 340*cdf0e10cSrcweir sCalc_Atan, 341*cdf0e10cSrcweir sCalc_Pow, 342*cdf0e10cSrcweir "|", 343*cdf0e10cSrcweir sCalc_Round 344*cdf0e10cSrcweir }; 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir sal_uInt16 nId = pMenu->GetCurItemId(); 347*cdf0e10cSrcweir if ( nId <= MN_CALC_ROUND ) 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir String aTmp( String::CreateFromAscii(aStrArr[nId - 1]) ); 350*cdf0e10cSrcweir aTmp += ' '; 351*cdf0e10cSrcweir aEdit.ReplaceSelected( aTmp ); 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir return 0; 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir IMPL_LINK( SwInputWindow, DropdownClickHdl, ToolBox*, EMPTYARG ) 357*cdf0e10cSrcweir { 358*cdf0e10cSrcweir sal_uInt16 nCurID = GetCurItemId(); 359*cdf0e10cSrcweir EndSelection(); // setzt CurItemId zurueck ! 360*cdf0e10cSrcweir switch ( nCurID ) 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir case FN_FORMULA_CALC : 363*cdf0e10cSrcweir { 364*cdf0e10cSrcweir aPopMenu.Execute( this, GetItemRect( FN_FORMULA_CALC ), POPUPMENU_NOMOUSEUPCLOSE ); 365*cdf0e10cSrcweir break; 366*cdf0e10cSrcweir default: 367*cdf0e10cSrcweir break; 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir return sal_True; 372*cdf0e10cSrcweir } 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir //================================================================== 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir void __EXPORT SwInputWindow::Click( ) 378*cdf0e10cSrcweir { 379*cdf0e10cSrcweir sal_uInt16 nCurID = GetCurItemId(); 380*cdf0e10cSrcweir EndSelection(); // setzt CurItemId zurueck ! 381*cdf0e10cSrcweir switch ( nCurID ) 382*cdf0e10cSrcweir { 383*cdf0e10cSrcweir case FN_FORMULA_CANCEL: 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir CancelFormula(); 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir break; 388*cdf0e10cSrcweir case FN_FORMULA_APPLY: 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir ApplyFormula(); 391*cdf0e10cSrcweir } 392*cdf0e10cSrcweir break; 393*cdf0e10cSrcweir } 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir //================================================================== 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir void SwInputWindow::ApplyFormula() 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir pView->GetViewFrame()->GetDispatcher()->Lock(sal_False); 401*cdf0e10cSrcweir pView->GetEditWin().LockKeyInput(sal_False); 402*cdf0e10cSrcweir CleanupUglyHackWithUndo(); 403*cdf0e10cSrcweir pWrtShell->Pop( sal_False ); 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir // JP 13.01.97: Formel soll immer mit einem "=" beginnen, hier 406*cdf0e10cSrcweir // also wieder entfernen 407*cdf0e10cSrcweir String sEdit( aEdit.GetText() ); 408*cdf0e10cSrcweir sEdit.EraseLeadingChars().EraseTrailingChars(); 409*cdf0e10cSrcweir if( sEdit.Len() && '=' == sEdit.GetChar( 0 ) ) 410*cdf0e10cSrcweir sEdit.Erase( 0, 1 ); 411*cdf0e10cSrcweir SfxStringItem aParam(FN_EDIT_FORMULA, sEdit); 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir pWrtShell->EndSelTblCells(); 414*cdf0e10cSrcweir pView->GetEditWin().GrabFocus(); 415*cdf0e10cSrcweir const SfxPoolItem* aArgs[2]; 416*cdf0e10cSrcweir aArgs[0] = &aParam; 417*cdf0e10cSrcweir aArgs[1] = 0; 418*cdf0e10cSrcweir pView->GetViewFrame()->GetBindings().Execute( FN_EDIT_FORMULA, aArgs, 0, SFX_CALLMODE_ASYNCHRON ); 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir //================================================================== 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir void SwInputWindow::CancelFormula() 424*cdf0e10cSrcweir { 425*cdf0e10cSrcweir if(pView) 426*cdf0e10cSrcweir { 427*cdf0e10cSrcweir pView->GetViewFrame()->GetDispatcher()->Lock( sal_False ); 428*cdf0e10cSrcweir pView->GetEditWin().LockKeyInput(sal_False); 429*cdf0e10cSrcweir CleanupUglyHackWithUndo(); 430*cdf0e10cSrcweir pWrtShell->Pop( sal_False ); 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir if( bDelSel ) 433*cdf0e10cSrcweir pWrtShell->EnterStdMode(); 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir pWrtShell->EndSelTblCells(); 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir pView->GetEditWin().GrabFocus(); 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir pView->GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FORMULA, SFX_CALLMODE_ASYNCHRON); 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir //================================================================== 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir const xub_Unicode CH_LRE = 0x202a; 444*cdf0e10cSrcweir const xub_Unicode CH_PDF = 0x202c; 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir IMPL_LINK( SwInputWindow, SelTblCellsNotify, SwWrtShell *, pCaller ) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir if(bIsTable) 449*cdf0e10cSrcweir { 450*cdf0e10cSrcweir SwFrmFmt* pTblFmt = pCaller->GetTableFmt(); 451*cdf0e10cSrcweir String sBoxNms( pCaller->GetBoxNms() ); 452*cdf0e10cSrcweir String sTblNm; 453*cdf0e10cSrcweir if( pTblFmt && aAktTableName != pTblFmt->GetName() ) 454*cdf0e10cSrcweir sTblNm = pTblFmt->GetName(); 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir aEdit.UpdateRange( sBoxNms, sTblNm ); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir String sNew; 459*cdf0e10cSrcweir sNew += CH_LRE; 460*cdf0e10cSrcweir sNew += aEdit.GetText(); 461*cdf0e10cSrcweir sNew += CH_PDF; 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir if( sNew != sOldFml ) 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir // Die WrtShell ist in der Tabellen Selektion 466*cdf0e10cSrcweir // dann die Tabellen Selektion wieder aufheben, sonst steht der 467*cdf0e10cSrcweir // Cursor "im Wald" und das LiveUpdate funktioniert nicht! 468*cdf0e10cSrcweir pWrtShell->StartAllAction(); 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir SwPaM aPam( *pWrtShell->GetStkCrsr()->GetPoint() ); 471*cdf0e10cSrcweir aPam.Move( fnMoveBackward, fnGoSection ); 472*cdf0e10cSrcweir aPam.SetMark(); 473*cdf0e10cSrcweir aPam.Move( fnMoveForward, fnGoSection ); 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir IDocumentContentOperations* pIDCO = pWrtShell->getIDocumentContentOperations(); 476*cdf0e10cSrcweir pIDCO->DeleteRange( aPam ); 477*cdf0e10cSrcweir pIDCO->InsertString( aPam, sNew ); 478*cdf0e10cSrcweir pWrtShell->EndAllAction(); 479*cdf0e10cSrcweir sOldFml = sNew; 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir else 483*cdf0e10cSrcweir aEdit.GrabFocus(); 484*cdf0e10cSrcweir return 0; 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir void SwInputWindow::SetFormula( const String& rFormula, sal_Bool bDelFlag ) 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir String sEdit( '=' ); 491*cdf0e10cSrcweir if( rFormula.Len() ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir if( '=' == rFormula.GetChar( 0 ) ) 494*cdf0e10cSrcweir sEdit = rFormula; 495*cdf0e10cSrcweir else 496*cdf0e10cSrcweir sEdit += rFormula; 497*cdf0e10cSrcweir } 498*cdf0e10cSrcweir aEdit.SetText( sEdit ); 499*cdf0e10cSrcweir aEdit.SetSelection( Selection( sEdit.Len(), sEdit.Len() ) ); 500*cdf0e10cSrcweir aEdit.Invalidate(); 501*cdf0e10cSrcweir bDelSel = bDelFlag; 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir IMPL_LINK( SwInputWindow, ModifyHdl, InputEdit*, EMPTYARG ) 505*cdf0e10cSrcweir { 506*cdf0e10cSrcweir if (bIsTable && m_bResetUndo) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir pWrtShell->StartAllAction(); 509*cdf0e10cSrcweir DelBoxCntnt(); 510*cdf0e10cSrcweir String sNew; 511*cdf0e10cSrcweir sNew += CH_LRE; 512*cdf0e10cSrcweir sNew += aEdit.GetText(); 513*cdf0e10cSrcweir sNew += CH_PDF; 514*cdf0e10cSrcweir pWrtShell->SwEditShell::Insert2( sNew ); 515*cdf0e10cSrcweir pWrtShell->EndAllAction(); 516*cdf0e10cSrcweir sOldFml = sNew; 517*cdf0e10cSrcweir } 518*cdf0e10cSrcweir return 0; 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir void SwInputWindow::DelBoxCntnt() 523*cdf0e10cSrcweir { 524*cdf0e10cSrcweir if( bIsTable ) 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir pWrtShell->StartAllAction(); 527*cdf0e10cSrcweir pWrtShell->ClearMark(); 528*cdf0e10cSrcweir pWrtShell->Pop( sal_False ); 529*cdf0e10cSrcweir pWrtShell->Push(); 530*cdf0e10cSrcweir pWrtShell->MoveSection( fnSectionCurr, fnSectionStart ); 531*cdf0e10cSrcweir pWrtShell->SetMark(); 532*cdf0e10cSrcweir pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd ); 533*cdf0e10cSrcweir pWrtShell->SwEditShell::Delete(); 534*cdf0e10cSrcweir pWrtShell->EndAllAction(); 535*cdf0e10cSrcweir } 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir //================================================================== 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir void __EXPORT InputEdit::KeyInput(const KeyEvent& rEvent) 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir const KeyCode aCode = rEvent.GetKeyCode(); 543*cdf0e10cSrcweir if(aCode == KEY_RETURN || aCode == KEY_F2 ) 544*cdf0e10cSrcweir ((SwInputWindow*)GetParent())->ApplyFormula(); 545*cdf0e10cSrcweir else if(aCode == KEY_ESCAPE ) 546*cdf0e10cSrcweir ((SwInputWindow*)GetParent())->CancelFormula(); 547*cdf0e10cSrcweir else 548*cdf0e10cSrcweir Edit::KeyInput(rEvent); 549*cdf0e10cSrcweir } 550*cdf0e10cSrcweir 551*cdf0e10cSrcweir //================================================================== 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir void __EXPORT InputEdit::UpdateRange(const String& rBoxes, 554*cdf0e10cSrcweir const String& rName ) 555*cdf0e10cSrcweir { 556*cdf0e10cSrcweir if( !rBoxes.Len() ) 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir GrabFocus(); 559*cdf0e10cSrcweir return; 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir const sal_Unicode cOpen = '<', cClose = '>', 562*cdf0e10cSrcweir cOpenBracket = '('; 563*cdf0e10cSrcweir String aPrefix = rName; 564*cdf0e10cSrcweir if(rName.Len()) 565*cdf0e10cSrcweir aPrefix += '.'; 566*cdf0e10cSrcweir String aBoxes = aPrefix; 567*cdf0e10cSrcweir aBoxes += rBoxes; 568*cdf0e10cSrcweir Selection aSelection(GetSelection()); 569*cdf0e10cSrcweir sal_uInt16 nSel = (sal_uInt16) aSelection.Len(); 570*cdf0e10cSrcweir //OS: mit dem folgenden Ausdruck wird sichergestellt, dass im overwrite-Modus 571*cdf0e10cSrcweir //die selektierte schliessende Klammer nicht geloescht wird 572*cdf0e10cSrcweir if( nSel && ( nSel > 1 || 573*cdf0e10cSrcweir GetText().GetChar( (sal_uInt16)aSelection.Min() ) != cClose ) ) 574*cdf0e10cSrcweir Cut(); 575*cdf0e10cSrcweir else 576*cdf0e10cSrcweir aSelection.Max() = aSelection.Min(); 577*cdf0e10cSrcweir String aActText(GetText()); 578*cdf0e10cSrcweir const sal_uInt16 nLen = aActText.Len(); 579*cdf0e10cSrcweir if( !nLen ) 580*cdf0e10cSrcweir { 581*cdf0e10cSrcweir String aStr(cOpen); 582*cdf0e10cSrcweir aStr += aBoxes; 583*cdf0e10cSrcweir aStr += cClose; 584*cdf0e10cSrcweir SetText(aStr); 585*cdf0e10cSrcweir sal_uInt16 nPos = aStr.Search( cClose ); 586*cdf0e10cSrcweir ASSERT(nPos < aStr.Len(), Delimiter nicht gefunden.); 587*cdf0e10cSrcweir ++nPos; 588*cdf0e10cSrcweir SetSelection( Selection( nPos, nPos )); 589*cdf0e10cSrcweir } 590*cdf0e10cSrcweir else 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir sal_Bool bFound = sal_False; 593*cdf0e10cSrcweir sal_Unicode cCh; 594*cdf0e10cSrcweir sal_uInt16 nPos, nEndPos = 0, nStartPos = (sal_uInt16) aSelection.Min(); 595*cdf0e10cSrcweir if( nStartPos-- ) 596*cdf0e10cSrcweir { 597*cdf0e10cSrcweir do { 598*cdf0e10cSrcweir if( cOpen == (cCh = aActText.GetChar( nStartPos ) ) || 599*cdf0e10cSrcweir cOpenBracket == cCh ) 600*cdf0e10cSrcweir { 601*cdf0e10cSrcweir bFound = cCh == cOpen; 602*cdf0e10cSrcweir break; 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir } while( nStartPos-- > 0 ); 605*cdf0e10cSrcweir } 606*cdf0e10cSrcweir if( bFound ) 607*cdf0e10cSrcweir { 608*cdf0e10cSrcweir bFound = sal_False; 609*cdf0e10cSrcweir nEndPos = nStartPos; 610*cdf0e10cSrcweir while( nEndPos < nLen ) 611*cdf0e10cSrcweir { 612*cdf0e10cSrcweir if( cClose == (cCh = aActText.GetChar( nEndPos )) /*|| 613*cdf0e10cSrcweir cCh == cCloseBracket*/ ) 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir bFound = sal_True; 616*cdf0e10cSrcweir break; 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir ++nEndPos; 619*cdf0e10cSrcweir } 620*cdf0e10cSrcweir // nur wenn akt. Pos im Breich oder direkt dahinter liegt 621*cdf0e10cSrcweir if( bFound && !( nStartPos < (sal_uInt16)aSelection.Max() && 622*cdf0e10cSrcweir (sal_uInt16)aSelection.Max() <= nEndPos + 1 )) 623*cdf0e10cSrcweir bFound = sal_False; 624*cdf0e10cSrcweir } 625*cdf0e10cSrcweir if( bFound ) 626*cdf0e10cSrcweir { 627*cdf0e10cSrcweir nPos = ++nStartPos + 1; // wir wollen dahinter 628*cdf0e10cSrcweir aActText.Erase( nStartPos, nEndPos - nStartPos ); 629*cdf0e10cSrcweir aActText.Insert( aBoxes, nStartPos ); 630*cdf0e10cSrcweir nPos = nPos + aBoxes.Len(); 631*cdf0e10cSrcweir } 632*cdf0e10cSrcweir else 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir String aTmp( (char)cOpen ); 635*cdf0e10cSrcweir aTmp += aBoxes; 636*cdf0e10cSrcweir aTmp += (char)cClose; 637*cdf0e10cSrcweir nPos = (sal_uInt16)aSelection.Min(); 638*cdf0e10cSrcweir aActText.Insert( aTmp, nPos ); 639*cdf0e10cSrcweir nPos = nPos + aTmp.Len(); 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir if( GetText() != aActText ) 642*cdf0e10cSrcweir { 643*cdf0e10cSrcweir SetText( aActText ); 644*cdf0e10cSrcweir SetSelection( Selection( nPos, nPos ) ); 645*cdf0e10cSrcweir // GetModifyHdl().Call( this ); 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir } 648*cdf0e10cSrcweir GrabFocus(); 649*cdf0e10cSrcweir 650*cdf0e10cSrcweir } 651*cdf0e10cSrcweir //================================================================== 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir SwInputChild::SwInputChild(Window* _pParent, 655*cdf0e10cSrcweir sal_uInt16 nId, 656*cdf0e10cSrcweir SfxBindings* pBindings, 657*cdf0e10cSrcweir SfxChildWinInfo* ) : 658*cdf0e10cSrcweir SfxChildWindow( _pParent, nId ) 659*cdf0e10cSrcweir { 660*cdf0e10cSrcweir pDispatch = pBindings->GetDispatcher(); 661*cdf0e10cSrcweir pWindow = new SwInputWindow( _pParent, pBindings ); 662*cdf0e10cSrcweir ((SwInputWindow*)pWindow)->ShowWin(); 663*cdf0e10cSrcweir eChildAlignment = SFX_ALIGN_LOWESTTOP; 664*cdf0e10cSrcweir } 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir 667*cdf0e10cSrcweir __EXPORT SwInputChild::~SwInputChild() 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir if(pDispatch) 670*cdf0e10cSrcweir pDispatch->Lock(sal_False); 671*cdf0e10cSrcweir } 672*cdf0e10cSrcweir 673*cdf0e10cSrcweir 674*cdf0e10cSrcweir SfxChildWinInfo __EXPORT SwInputChild::GetInfo() const 675*cdf0e10cSrcweir { 676*cdf0e10cSrcweir SfxChildWinInfo aInfo = SfxChildWindow::GetInfo(); \ 677*cdf0e10cSrcweir return aInfo; 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir 680