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