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