xref: /aoo41x/main/sw/source/ui/ribbar/inputwin.cxx (revision cdf0e10c)
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