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 : #include <vcl/settings.hxx>
32 :
33 : #include "swtypes.hxx"
34 : #include "cmdid.h"
35 : #include "swmodule.hxx"
36 : #include "wrtsh.hxx"
37 : #include "view.hxx"
38 : #include "calc.hxx"
39 : #include "inputwin.hxx"
40 : #include "fldbas.hxx"
41 : #include "fldmgr.hxx"
42 : #include "frmfmt.hxx"
43 : #include "cellatr.hxx"
44 : #include "edtwin.hxx"
45 : #include "helpid.h"
46 : #include "access.hrc"
47 :
48 : // Only for the UpdateRange: Delete the box in which the stacked cursor is positioned.
49 : #include "pam.hxx"
50 :
51 : #include "swundo.hxx"
52 : #include "ribbar.hrc"
53 : #include "inputwin.hrc"
54 :
55 : #include <IDocumentContentOperations.hxx>
56 :
57 5518 : SFX_IMPL_POS_CHILDWINDOW_WITHID( SwInputChild, FN_EDIT_FORMULA, SFX_OBJECTBAR_OBJECT )
58 :
59 0 : SwInputWindow::SwInputWindow( vcl::Window* pParent, SfxBindings* pBind )
60 : : ToolBox( pParent , SW_RES( RID_TBX_FORMULA )),
61 : aPos( VclPtr<Edit>::Create(this, SW_RES(ED_POS))),
62 : aEdit( VclPtr<InputEdit>::Create(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(aEmptyOUStr)
69 : , m_bDoesUndo(true)
70 : , m_bResetUndo(false)
71 0 : , m_bCallUndo(false)
72 : {
73 0 : bFirst = true;
74 0 : bActive = bIsTable = bDelSel = 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.get(), ToolBoxItemBits::NONE, 0);
87 0 : SetItemText(ED_POS, SW_RESSTR(STR_ACCESS_FORMULA_TYPE));
88 0 : aPos->SetAccessibleName(SW_RESSTR(STR_ACCESS_FORMULA_TYPE));
89 0 : SetAccessibleName(SW_RESSTR(STR_ACCESS_FORMULA_TOOLBAR));
90 0 : InsertSeparator ( 1 );
91 0 : InsertSeparator ();
92 0 : InsertWindow( ED_FORMULA, aEdit.get());
93 0 : SetItemText(ED_FORMULA, SW_RESSTR(STR_ACCESS_FORMULA_TEXT));
94 0 : aEdit->SetAccessibleName(SW_RESSTR(STR_ACCESS_FORMULA_TEXT));
95 0 : SetHelpId(ED_FORMULA, HID_EDIT_FORMULA);
96 :
97 0 : SetItemImage( FN_FORMULA_CALC, pManager->GetImage(FN_FORMULA_CALC ));
98 0 : SetItemImage( FN_FORMULA_CANCEL, pManager->GetImage(FN_FORMULA_CANCEL ));
99 0 : SetItemImage( FN_FORMULA_APPLY, pManager->GetImage(FN_FORMULA_APPLY ));
100 :
101 0 : SetItemBits( FN_FORMULA_CALC, GetItemBits( FN_FORMULA_CALC ) | ToolBoxItemBits::DROPDOWNONLY );
102 0 : SetDropdownClickHdl( LINK( this, SwInputWindow, DropdownClickHdl ));
103 :
104 0 : Size aSizeTbx = CalcWindowSizePixel();
105 0 : Size aEditSize = aEdit->GetSizePixel();
106 0 : Rectangle aItemRect( GetItemRect(FN_FORMULA_CALC) );
107 0 : long nMaxHeight = (aEditSize.Height() > aItemRect.GetHeight()) ? aEditSize.Height() : aItemRect.GetHeight();
108 0 : if( nMaxHeight+2 > aSizeTbx.Height() )
109 0 : aSizeTbx.Height() = nMaxHeight+2;
110 0 : Size aSize = GetSizePixel();
111 0 : aSize.Height() = aSizeTbx.Height();
112 0 : SetSizePixel( aSize );
113 :
114 : // align edit and item vcentered
115 0 : Size aPosSize = aPos->GetSizePixel();
116 0 : aPosSize.Height() = nMaxHeight;
117 0 : aEditSize.Height() = nMaxHeight;
118 0 : Point aPosPos = aPos->GetPosPixel();
119 0 : Point aEditPos = aEdit->GetPosPixel();
120 0 : aPosPos.Y() = (aSize.Height() - nMaxHeight)/2 + 1;
121 0 : aEditPos.Y() = (aSize.Height() - nMaxHeight)/2 + 1;
122 0 : aPos->SetPosSizePixel( aPosPos, aPosSize );
123 0 : aEdit->SetPosSizePixel( aEditPos, aEditSize );
124 :
125 0 : aPopMenu.SetSelectHdl(LINK( this, SwInputWindow, MenuHdl ));
126 0 : }
127 :
128 0 : SwInputWindow::~SwInputWindow()
129 : {
130 0 : disposeOnce();
131 0 : }
132 :
133 0 : void SwInputWindow::dispose()
134 : {
135 0 : SfxImageManager::GetImageManager( *SW_MOD() )->ReleaseToolBox(this);
136 :
137 : // wake rulers
138 0 : if(pView)
139 : {
140 0 : pView->GetHRuler().SetActive( true );
141 0 : pView->GetVRuler().SetActive( true );
142 : }
143 0 : delete pMgr;
144 0 : if(pWrtShell)
145 0 : pWrtShell->EndSelTableCells();
146 :
147 0 : CleanupUglyHackWithUndo();
148 :
149 0 : aPos.disposeAndClear();
150 0 : aEdit.disposeAndClear();
151 0 : ToolBox::dispose();
152 0 : }
153 :
154 0 : void SwInputWindow::CleanupUglyHackWithUndo()
155 : {
156 0 : if (m_bResetUndo)
157 : {
158 0 : if (pWrtShell)
159 : {
160 0 : DelBoxContent();
161 0 : pWrtShell->DoUndo(m_bDoesUndo);
162 0 : if (m_bCallUndo)
163 : {
164 0 : pWrtShell->Undo();
165 : }
166 : }
167 0 : m_bResetUndo = false; // #i117122# once is enough :)
168 : }
169 0 : }
170 :
171 0 : void SwInputWindow::DataChanged( const DataChangedEvent& rDCEvt )
172 : {
173 0 : if ( rDCEvt.GetType() == DataChangedEventType::SETTINGS && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
174 : {
175 : // update item images
176 0 : SwModule *pMod = SW_MOD();
177 0 : SfxImageManager *pImgMgr = SfxImageManager::GetImageManager(*pMod);
178 0 : SetItemImage( FN_FORMULA_CALC, pImgMgr->GetImage(FN_FORMULA_CALC ));
179 0 : SetItemImage( FN_FORMULA_CANCEL, pImgMgr->GetImage(FN_FORMULA_CANCEL ));
180 0 : SetItemImage( FN_FORMULA_APPLY, pImgMgr->GetImage(FN_FORMULA_APPLY ));
181 : }
182 :
183 0 : ToolBox::DataChanged( rDCEvt );
184 0 : }
185 :
186 0 : void SwInputWindow::Resize()
187 : {
188 0 : ToolBox::Resize();
189 :
190 0 : long nWidth = GetSizePixel().Width();
191 0 : long nLeft = aEdit->GetPosPixel().X();
192 0 : Size aEditSize = aEdit->GetSizePixel();
193 :
194 0 : aEditSize.Width() = std::max( ((long)(nWidth - nLeft - 5)), (long)0 );
195 0 : aEdit->SetSizePixel( aEditSize );
196 0 : aEdit->Invalidate();
197 0 : }
198 :
199 0 : void SwInputWindow::ShowWin()
200 : {
201 0 : bIsTable = false;
202 : // stop rulers
203 0 : if(pView)
204 : {
205 0 : pView->GetHRuler().SetActive( false );
206 0 : pView->GetVRuler().SetActive( false );
207 :
208 : OSL_ENSURE(pWrtShell, "no WrtShell!");
209 : // Cursor in table
210 0 : bIsTable = pWrtShell->IsCrsrInTable();
211 :
212 0 : if( bFirst )
213 : pWrtShell->SelTableCells( LINK( this, SwInputWindow,
214 0 : SelTableCellsNotify) );
215 0 : if( bIsTable )
216 : {
217 0 : const OUString& rPos = pWrtShell->GetBoxNms();
218 0 : sal_Int32 nPos = 0;
219 0 : short nSrch = -1;
220 0 : while( (nPos = rPos.indexOf( ':',nPos + 1 ) ) != -1 )
221 0 : nSrch = (short) nPos;
222 0 : aPos->SetText( rPos.copy( ++nSrch ) );
223 0 : aAktTableName = pWrtShell->GetTableFormat()->GetName();
224 : }
225 : else
226 0 : aPos->SetText(SW_RESSTR(STR_TBL_FORMULA));
227 :
228 : // Edit current field
229 : OSL_ENSURE(pMgr == 0, "FieldManager not deleted");
230 0 : pMgr = new SwFieldMgr;
231 :
232 : // Formular should always begin with "=" , so set here
233 0 : OUString sEdit('=');
234 0 : if( pMgr->GetCurField() && TYP_FORMELFLD == pMgr->GetCurTypeId() )
235 : {
236 0 : sEdit += pMgr->GetCurFieldPar2();
237 : }
238 0 : else if( bFirst )
239 : {
240 0 : if( bIsTable )
241 : {
242 0 : m_bResetUndo = true;
243 : SAL_WARN_IF(
244 : officecfg::Office::Common::Undo::Steps::get() <= 0,
245 : "sw", "/org.openoffice.Office.Common/Undo/Steps <= 0");
246 :
247 0 : m_bDoesUndo = pWrtShell->DoesUndo();
248 0 : if( !m_bDoesUndo )
249 : {
250 0 : pWrtShell->DoUndo( true );
251 : }
252 :
253 0 : if( !pWrtShell->SwCrsrShell::HasSelection() )
254 : {
255 0 : pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
256 0 : pWrtShell->SetMark();
257 0 : pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
258 : }
259 0 : if( pWrtShell->SwCrsrShell::HasSelection() )
260 : {
261 0 : pWrtShell->StartUndo( UNDO_DELETE );
262 0 : pWrtShell->Delete();
263 0 : if( 0 != pWrtShell->EndUndo( UNDO_DELETE ))
264 : {
265 0 : m_bCallUndo = true;
266 : }
267 : }
268 0 : pWrtShell->DoUndo(false);
269 :
270 0 : SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
271 0 : if( pWrtShell->GetTableBoxFormulaAttrs( aSet ))
272 0 : sEdit += static_cast<const SwTableBoxFormula&>(aSet.Get( RES_BOXATR_FORMULA )).GetFormula();
273 : }
274 : }
275 :
276 0 : if( bFirst )
277 : {
278 : // Set WrtShell flags correctly
279 0 : pWrtShell->SttSelect();
280 0 : pWrtShell->EndSelect();
281 : }
282 :
283 0 : bFirst = false;
284 :
285 0 : aEdit->SetModifyHdl( LINK( this, SwInputWindow, ModifyHdl ));
286 :
287 0 : aEdit->SetText( sEdit );
288 0 : aEdit->SetSelection( Selection( sEdit.getLength(), sEdit.getLength() ) );
289 0 : sOldFormula = sEdit;
290 :
291 0 : aEdit->Invalidate();
292 0 : aEdit->Update();
293 0 : aEdit->GrabFocus();
294 : // For input cut the UserInterface
295 :
296 0 : pView->GetEditWin().LockKeyInput(true);
297 0 : pView->GetViewFrame()->GetDispatcher()->Lock(true);
298 0 : pWrtShell->Push();
299 : }
300 0 : ToolBox::Show();
301 0 : }
302 :
303 0 : IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu )
304 : {
305 : static const char * const aStrArr[] = {
306 : sCalc_Phd,
307 : sCalc_Sqrt,
308 : sCalc_Or,
309 : sCalc_Xor,
310 : sCalc_And,
311 : sCalc_Not,
312 : sCalc_Eq,
313 : sCalc_Neq,
314 : sCalc_Leq,
315 : sCalc_Geq,
316 : sCalc_L,
317 : sCalc_G,
318 : sCalc_Sum,
319 : sCalc_Mean,
320 : sCalc_Min,
321 : sCalc_Max,
322 : sCalc_Sin,
323 : sCalc_Cos,
324 : sCalc_Tan,
325 : sCalc_Asin,
326 : sCalc_Acos,
327 : sCalc_Atan,
328 : sCalc_Pow,
329 : "|",
330 : sCalc_Round
331 : };
332 :
333 0 : sal_uInt16 nId = pMenu->GetCurItemId();
334 0 : if ( nId <= MN_CALC_ROUND )
335 : {
336 0 : OUString aTmp( OUString::createFromAscii(aStrArr[nId - 1]) );
337 0 : aTmp += " ";
338 0 : aEdit->ReplaceSelected( aTmp );
339 : }
340 0 : return 0;
341 : }
342 :
343 0 : IMPL_LINK_NOARG_TYPED(SwInputWindow, DropdownClickHdl, ToolBox *, void)
344 : {
345 0 : sal_uInt16 nCurID = GetCurItemId();
346 0 : EndSelection(); // reset back CurItemId !
347 0 : switch ( nCurID )
348 : {
349 : case FN_FORMULA_CALC :
350 : {
351 0 : aPopMenu.Execute( this, GetItemRect( FN_FORMULA_CALC ), PopupMenuFlags::NoMouseUpClose );
352 0 : break;
353 : default:
354 0 : break;
355 : }
356 : }
357 0 : }
358 :
359 0 : void SwInputWindow::Click( )
360 : {
361 0 : sal_uInt16 nCurID = GetCurItemId();
362 0 : EndSelection(); // reset back CurItemId !
363 0 : switch ( nCurID )
364 : {
365 : case FN_FORMULA_CANCEL:
366 : {
367 0 : CancelFormula();
368 : }
369 0 : break;
370 : case FN_FORMULA_APPLY:
371 : {
372 0 : ApplyFormula();
373 : }
374 0 : break;
375 : }
376 0 : }
377 :
378 0 : void SwInputWindow::ApplyFormula()
379 : {
380 0 : pView->GetViewFrame()->GetDispatcher()->Lock(false);
381 0 : pView->GetEditWin().LockKeyInput(false);
382 0 : CleanupUglyHackWithUndo();
383 0 : pWrtShell->Pop( false );
384 :
385 : // Formular should always begin with "=", so remove it here again
386 0 : OUString sEdit(comphelper::string::strip(aEdit->GetText(), ' '));
387 0 : if( !sEdit.isEmpty() && '=' == sEdit[0] )
388 0 : sEdit = sEdit.copy( 1 );
389 0 : SfxStringItem aParam(FN_EDIT_FORMULA, sEdit);
390 :
391 0 : pWrtShell->EndSelTableCells();
392 0 : pView->GetEditWin().GrabFocus();
393 : const SfxPoolItem* aArgs[2];
394 0 : aArgs[0] = &aParam;
395 0 : aArgs[1] = 0;
396 0 : pView->GetViewFrame()->GetBindings().Execute( FN_EDIT_FORMULA, aArgs, 0, SfxCallMode::ASYNCHRON );
397 0 : }
398 :
399 0 : void SwInputWindow::CancelFormula()
400 : {
401 0 : if(pView)
402 : {
403 0 : pView->GetViewFrame()->GetDispatcher()->Lock( false );
404 0 : pView->GetEditWin().LockKeyInput(false);
405 0 : CleanupUglyHackWithUndo();
406 0 : pWrtShell->Pop( false );
407 :
408 0 : if( bDelSel )
409 0 : pWrtShell->EnterStdMode();
410 :
411 0 : pWrtShell->EndSelTableCells();
412 :
413 0 : pView->GetEditWin().GrabFocus();
414 :
415 0 : pView->GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FORMULA, SfxCallMode::ASYNCHRON);
416 : }
417 0 : }
418 :
419 : const sal_Unicode CH_LRE = 0x202a;
420 : const sal_Unicode CH_PDF = 0x202c;
421 :
422 0 : IMPL_LINK( SwInputWindow, SelTableCellsNotify, SwWrtShell *, pCaller )
423 : {
424 0 : if(bIsTable)
425 : {
426 0 : SwFrameFormat* pTableFormat = pCaller->GetTableFormat();
427 0 : OUString sBoxNms( pCaller->GetBoxNms() );
428 0 : OUString sTableNm;
429 0 : if( pTableFormat && aAktTableName != pTableFormat->GetName() )
430 0 : sTableNm = pTableFormat->GetName();
431 :
432 0 : aEdit->UpdateRange( sBoxNms, sTableNm );
433 :
434 0 : OUString sNew;
435 0 : sNew += OUString(CH_LRE);
436 0 : sNew += aEdit->GetText();
437 0 : sNew += OUString(CH_PDF);
438 :
439 0 : if( sNew != sOldFormula )
440 : {
441 : // The WrtShell is in the table selection,
442 : // then cancel the table selection otherwise, the cursor is
443 : // positioned "in the forest" and the live update does not work!
444 0 : pWrtShell->StartAllAction();
445 :
446 0 : SwPaM aPam( *pWrtShell->GetStkCrsr()->GetPoint() );
447 0 : aPam.Move( fnMoveBackward, fnGoSection );
448 0 : aPam.SetMark();
449 0 : aPam.Move( fnMoveForward, fnGoSection );
450 :
451 0 : IDocumentContentOperations* pIDCO = pWrtShell->getIDocumentContentOperations();
452 0 : pIDCO->DeleteRange( aPam );
453 0 : pIDCO->InsertString( aPam, sNew );
454 0 : pWrtShell->EndAllAction();
455 0 : sOldFormula = sNew;
456 0 : }
457 : }
458 : else
459 0 : aEdit->GrabFocus();
460 0 : return 0;
461 : }
462 :
463 0 : void SwInputWindow::SetFormula( const OUString& rFormula, bool bDelFlag )
464 : {
465 0 : OUString sEdit('=');
466 0 : if( !rFormula.isEmpty() )
467 : {
468 0 : if( '=' == rFormula[0] )
469 0 : sEdit = rFormula;
470 : else
471 0 : sEdit += rFormula;
472 : }
473 0 : aEdit->SetText( sEdit );
474 0 : aEdit->SetSelection( Selection( sEdit.getLength(), sEdit.getLength() ) );
475 0 : aEdit->Invalidate();
476 0 : bDelSel = bDelFlag;
477 0 : }
478 :
479 0 : IMPL_LINK_NOARG(SwInputWindow, ModifyHdl)
480 : {
481 0 : if (bIsTable && m_bResetUndo)
482 : {
483 0 : pWrtShell->StartAllAction();
484 0 : DelBoxContent();
485 0 : OUString sNew;
486 0 : sNew += OUString(CH_LRE);
487 0 : sNew += aEdit->GetText();
488 0 : sNew += OUString(CH_PDF);
489 0 : pWrtShell->SwEditShell::Insert2( sNew );
490 0 : pWrtShell->EndAllAction();
491 0 : sOldFormula = sNew;
492 : }
493 0 : return 0;
494 : }
495 :
496 0 : void SwInputWindow::DelBoxContent()
497 : {
498 0 : if( bIsTable )
499 : {
500 0 : pWrtShell->StartAllAction();
501 0 : pWrtShell->ClearMark();
502 0 : pWrtShell->Pop( false );
503 0 : pWrtShell->Push();
504 0 : pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
505 0 : pWrtShell->SetMark();
506 0 : pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
507 0 : pWrtShell->SwEditShell::Delete();
508 0 : pWrtShell->EndAllAction();
509 : }
510 0 : }
511 :
512 0 : void InputEdit::KeyInput(const KeyEvent& rEvent)
513 : {
514 0 : const vcl::KeyCode aCode = rEvent.GetKeyCode();
515 0 : if(aCode == KEY_RETURN || aCode == KEY_F2 )
516 0 : static_cast<SwInputWindow*>(GetParent())->ApplyFormula();
517 0 : else if(aCode == KEY_ESCAPE )
518 0 : static_cast<SwInputWindow*>(GetParent())->CancelFormula();
519 : else
520 0 : Edit::KeyInput(rEvent);
521 0 : }
522 :
523 0 : void InputEdit::UpdateRange(const OUString& rBoxes,
524 : const OUString& rName )
525 : {
526 0 : if( rBoxes.isEmpty() )
527 : {
528 0 : GrabFocus();
529 0 : return;
530 : }
531 0 : const sal_Unicode cOpen = '<', cClose = '>',
532 0 : cOpenBracket = '(';
533 0 : OUString aPrefix = rName;
534 0 : if(!rName.isEmpty())
535 0 : aPrefix += ".";
536 0 : OUString aBoxes = aPrefix;
537 0 : aBoxes += rBoxes;
538 0 : Selection aSelection(GetSelection());
539 0 : sal_uInt16 nSel = (sal_uInt16) aSelection.Len();
540 : // OS: The following expression ensures that in the overwrite mode,
541 : // the selected closing parenthesis will be not deleted.
542 0 : if( nSel && ( nSel > 1 ||
543 0 : GetText()[ (sal_uInt16)aSelection.Min() ] != cClose ))
544 0 : Cut();
545 : else
546 0 : aSelection.Max() = aSelection.Min();
547 0 : OUString aActText(GetText());
548 0 : const sal_uInt16 nLen = aActText.getLength();
549 0 : if( !nLen )
550 : {
551 : OUString aStr = OUStringBuffer().
552 0 : append(cOpen).append(aBoxes).append(cClose).
553 0 : makeStringAndClear();
554 0 : SetText(aStr);
555 0 : sal_Int32 nPos = aStr.indexOf( cClose );
556 : OSL_ENSURE(nPos != -1, "delimiter not found");
557 0 : ++nPos;
558 0 : SetSelection( Selection( nPos, nPos ));
559 : }
560 : else
561 : {
562 0 : bool bFound = false;
563 : sal_Unicode cCh;
564 0 : sal_uInt16 nPos, nEndPos = 0, nStartPos = (sal_uInt16) aSelection.Min();
565 0 : if( nStartPos-- )
566 : {
567 0 : do {
568 0 : if( cOpen == (cCh = aActText[ nStartPos ] ) ||
569 : cOpenBracket == cCh )
570 : {
571 0 : bFound = cCh == cOpen;
572 0 : break;
573 : }
574 0 : } while( nStartPos-- > 0 );
575 : }
576 0 : if( bFound )
577 : {
578 0 : bFound = false;
579 0 : nEndPos = nStartPos;
580 0 : while( nEndPos < nLen )
581 : {
582 0 : if( cClose == (cCh = aActText[ nEndPos ]))
583 : {
584 0 : bFound = true;
585 0 : break;
586 : }
587 0 : ++nEndPos;
588 : }
589 : // Only if the current position lies in the range or right behind.
590 0 : if( bFound && !( nStartPos < (sal_uInt16)aSelection.Max() &&
591 0 : (sal_uInt16)aSelection.Max() <= nEndPos + 1 ))
592 0 : bFound = false;
593 : }
594 0 : if( bFound )
595 : {
596 0 : nPos = ++nStartPos + 1; // We want behind
597 0 : aActText = aActText.replaceAt( nStartPos, nEndPos - nStartPos, aBoxes );
598 0 : nPos = nPos + aBoxes.getLength();
599 : }
600 : else
601 : {
602 : OUString aTmp = OUStringBuffer().
603 0 : append(cOpen).append(aBoxes).append(cClose).
604 0 : makeStringAndClear();
605 0 : nPos = (sal_uInt16)aSelection.Min();
606 0 : aActText = aActText.replaceAt( nPos, 0, aTmp );
607 0 : nPos = nPos + aTmp.getLength();
608 : }
609 0 : if( GetText() != OUString(aActText) )
610 : {
611 0 : SetText( aActText );
612 0 : SetSelection( Selection( nPos, nPos ) );
613 : }
614 : }
615 0 : GrabFocus();
616 :
617 : }
618 :
619 0 : SwInputChild::SwInputChild(vcl::Window* _pParent,
620 : sal_uInt16 nId,
621 : SfxBindings* pBindings,
622 : SfxChildWinInfo* ) :
623 0 : SfxChildWindow( _pParent, nId )
624 : {
625 0 : pDispatch = pBindings->GetDispatcher();
626 0 : pWindow = VclPtr<SwInputWindow>::Create( _pParent, pBindings );
627 0 : static_cast<SwInputWindow*>(pWindow.get())->ShowWin();
628 0 : eChildAlignment = SfxChildAlignment::LOWESTTOP;
629 0 : }
630 :
631 0 : SwInputChild::~SwInputChild()
632 : {
633 0 : if(pDispatch)
634 0 : pDispatch->Lock(false);
635 0 : }
636 :
637 0 : SfxChildWinInfo SwInputChild::GetInfo() const
638 : {
639 0 : SfxChildWinInfo aInfo = SfxChildWindow::GetInfo(); \
640 0 : return aInfo;
641 177 : }
642 :
643 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|