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