1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27 #include "EditWindow.hxx"
28
29 #include "sdmod.hxx"
30 #include <i18npool/mslangid.hxx>
31 #include <com/sun/star/i18n/ScriptType.hpp>
32 #include <editeng/editeng.hxx>
33 #include <editeng/editview.hxx>
34 #include <vcl/scrbar.hxx>
35 #include <editeng/eeitem.hxx>
36 #include "sdresid.hxx"
37 #include <svl/itempool.hxx>
38 #include <editeng/fhgtitem.hxx>
39 #include <vos/mutex.hxx>
40 #include <vcl/svapp.hxx>
41 #include <unotools/linguprops.hxx>
42 #include <unotools/lingucfg.hxx>
43 #include <editeng/fontitem.hxx>
44 #include <editeng/editstat.hxx>
45
46 #define SCROLL_LINE 24
47
48 using namespace com::sun::star::accessibility;
49 using namespace com::sun::star;
50 using namespace com::sun::star::uno;
51
52 namespace sd { namespace notes {
53
EditWindow(Window * pParentWindow,SfxItemPool * pItemPool)54 EditWindow::EditWindow (Window* pParentWindow, SfxItemPool* pItemPool)
55 : Window (pParentWindow, WinBits()),
56 DropTargetHelper(this),
57 mpEditView(NULL),
58 mpEditEngine(NULL),
59 mpHorizontalScrollBar(NULL),
60 mpVerticalScrollBar(NULL),
61 mpScrollBox(NULL)
62 {
63 SetMapMode(MAP_PIXEL);
64
65 // compare DataChanged
66 SetBackground (GetSettings().GetStyleSettings().GetWindowColor());
67
68 maModifyTimer.SetTimeout(2000);
69 maModifyTimer.Start();
70
71 maCursorMoveTimer.SetTimeout(500);
72
73 CreateEditView();
74
75 SvxFontHeightItem aItem (GetFont().GetSize().Height(), 100,
76 EE_CHAR_FONTHEIGHT);
77 pItemPool->SetPoolDefaultItem (aItem);
78 aItem.SetWhich(EE_CHAR_FONTHEIGHT_CJK);
79 pItemPool->SetPoolDefaultItem (aItem);
80 aItem.SetWhich(EE_CHAR_FONTHEIGHT_CTL);
81 pItemPool->SetPoolDefaultItem (aItem);
82
83 InsertText (UniString::CreateFromAscii("EditWindow created and ready.\n"));
84 }
85
86
~EditWindow(void)87 EditWindow::~EditWindow (void)
88 {
89 maCursorMoveTimer.Stop();
90 maModifyTimer.Stop();
91
92 if (mpEditView != NULL)
93 {
94 EditEngine *pEditEngine = mpEditView->GetEditEngine();
95 if (pEditEngine)
96 {
97 pEditEngine->SetStatusEventHdl(Link());
98 pEditEngine->RemoveView (mpEditView);
99 }
100 }
101 delete mpEditView;
102 delete mpHorizontalScrollBar;
103 delete mpVerticalScrollBar;
104 delete mpScrollBox;
105
106 }
107
108 ////////////////////////////////////////
109
110
SmGetLeftSelectionPart(const ESelection aSel,sal_uInt16 & nPara,sal_uInt16 & nPos)111 void SmGetLeftSelectionPart(const ESelection aSel,
112 sal_uInt16 &nPara, sal_uInt16 &nPos)
113 // returns paragraph number and position of the selections left part
114 {
115 // compare start and end of selection and use the one that comes first
116 if (
117 (aSel.nStartPara < aSel.nEndPara) ||
118 (aSel.nStartPara == aSel.nEndPara && aSel.nStartPos < aSel.nEndPos)
119 )
120 { nPara = aSel.nStartPara;
121 nPos = aSel.nStartPos;
122 }
123 else
124 { nPara = aSel.nEndPara;
125 nPos = aSel.nEndPos;
126 }
127 }
128
129
130
131
GetEditEngine(void)132 EditEngine * EditWindow::GetEditEngine (void)
133 {
134 if (mpEditEngine == NULL)
135 mpEditEngine = CreateEditEngine ();
136 return mpEditEngine;
137 }
138
139
140
141
CreateEditEngine(void)142 EditEngine* EditWindow::CreateEditEngine (void)
143 {
144 EditEngine* pEditEngine = mpEditEngine;
145 if (pEditEngine == NULL)
146 {
147 mpEditEngineItemPool = EditEngine::CreatePool();
148
149 //
150 // set fonts to be used
151 //
152 SvtLinguOptions aOpt;
153 SvtLinguConfig().GetOptions( aOpt );
154 //
155 struct FontDta {
156 sal_Int16 nFallbackLang;
157 sal_Int16 nLang;
158 sal_uInt16 nFontType;
159 sal_uInt16 nFontInfoId;
160 } aTable[3] =
161 {
162 // info to get western font to be used
163 { LANGUAGE_ENGLISH_US, LANGUAGE_NONE,
164 DEFAULTFONT_SERIF, EE_CHAR_FONTINFO },
165 // info to get CJK font to be used
166 { LANGUAGE_JAPANESE, LANGUAGE_NONE,
167 DEFAULTFONT_CJK_TEXT, EE_CHAR_FONTINFO_CJK },
168 // info to get CTL font to be used
169 { LANGUAGE_ARABIC_SAUDI_ARABIA, LANGUAGE_NONE,
170 DEFAULTFONT_CTL_TEXT, EE_CHAR_FONTINFO_CTL }
171 };
172 aTable[0].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage, ::com::sun::star::i18n::ScriptType::LATIN);
173 aTable[1].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CJK, ::com::sun::star::i18n::ScriptType::ASIAN);
174 aTable[2].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CTL, ::com::sun::star::i18n::ScriptType::COMPLEX);
175 //
176 for (int i = 0; i < 3; ++i)
177 {
178 const FontDta &rFntDta = aTable[i];
179 LanguageType nLang = (LANGUAGE_NONE == rFntDta.nLang) ?
180 rFntDta.nFallbackLang : rFntDta.nLang;
181 Font aFont = Application::GetDefaultDevice()->GetDefaultFont(
182 rFntDta.nFontType, nLang, DEFAULTFONT_FLAGS_ONLYONE);
183 mpEditEngineItemPool->SetPoolDefaultItem(
184 SvxFontItem(
185 aFont.GetFamily(),
186 aFont.GetName(),
187 aFont.GetStyleName(),
188 aFont.GetPitch(),
189 aFont.GetCharSet(),
190 rFntDta.nFontInfoId));
191 }
192
193 // set font heights
194 SvxFontHeightItem aFontHeigt(
195 Application::GetDefaultDevice()->LogicToPixel(
196 Size (0, 10), MapMode (MAP_POINT)).Height(), 100,
197 EE_CHAR_FONTHEIGHT );
198 mpEditEngineItemPool->SetPoolDefaultItem( aFontHeigt);
199 aFontHeigt.SetWhich (EE_CHAR_FONTHEIGHT_CJK);
200 mpEditEngineItemPool->SetPoolDefaultItem( aFontHeigt);
201 aFontHeigt.SetWhich (EE_CHAR_FONTHEIGHT_CTL);
202 mpEditEngineItemPool->SetPoolDefaultItem( aFontHeigt);
203
204 pEditEngine = new EditEngine (mpEditEngineItemPool);
205
206 pEditEngine->EnableUndo (sal_True);
207 pEditEngine->SetDefTab (sal_uInt16(
208 Application::GetDefaultDevice()->GetTextWidth(
209 UniString::CreateFromAscii("XXXX"))));
210
211 pEditEngine->SetControlWord(
212 (pEditEngine->GetControlWord()
213 | EE_CNTRL_AUTOINDENTING) &
214 (~EE_CNTRL_UNDOATTRIBS) &
215 (~EE_CNTRL_PASTESPECIAL));
216
217 pEditEngine->SetWordDelimiters (
218 UniString::CreateFromAscii(" .=+-*/(){}[];\""));
219 pEditEngine->SetRefMapMode (MAP_PIXEL);
220 pEditEngine->SetPaperSize (Size(800, 0));
221 pEditEngine->EraseVirtualDevice();
222 pEditEngine->ClearModifyFlag();
223 }
224
225 return pEditEngine;
226 }
227
228
229
230
DataChanged(const DataChangedEvent &)231 void EditWindow::DataChanged (const DataChangedEvent&)
232 {
233 const StyleSettings aSettings (GetSettings().GetStyleSettings());
234
235 SetBackground( aSettings.GetWindowColor() );
236
237 // edit fields in other Applications use this font instead of
238 // the application font thus we use this one too
239 SetPointFont( aSettings.GetFieldFont() );
240 EditEngine* pEditEngine = GetEditEngine();
241
242 if (pEditEngine!=NULL && mpEditEngineItemPool!=NULL)
243 {
244 //!
245 //! see also SmDocShell::GetEditEngine() !
246 //!
247
248 // pEditEngine->SetDefTab( sal_uInt16( GetTextWidth( C2S("XXXX") ) ) );
249
250 sal_uInt16 aFntInfoId[3] = {
251 EE_CHAR_FONTINFO, EE_CHAR_FONTINFO_CJK, EE_CHAR_FONTINFO_CTL };
252 for (int i = 0; i < 3; ++i)
253 {
254 const SfxPoolItem *pItem = mpEditEngineItemPool->GetPoolDefaultItem( aFntInfoId[i] );
255 if( pItem )
256 {
257 const SvxFontItem *pFntItem = ((const SvxFontItem *) pItem);
258 const Font &rFnt = aSettings.GetFieldFont();
259 SvxFontItem aFntItem( rFnt.GetFamily(), rFnt.GetName(),
260 rFnt.GetStyleName(), rFnt.GetPitch(),
261 pFntItem->GetCharSet(),
262 aFntInfoId[i] );
263 mpEditEngineItemPool->SetPoolDefaultItem( aFntItem );
264 }
265 }
266
267 SvxFontHeightItem aItem( GetFont().GetSize().Height(), 100,
268 EE_CHAR_FONTHEIGHT );
269 mpEditEngineItemPool->SetPoolDefaultItem( aItem );
270 aItem.SetWhich( EE_CHAR_FONTHEIGHT_CJK );
271 mpEditEngineItemPool->SetPoolDefaultItem( aItem );
272 aItem.SetWhich( EE_CHAR_FONTHEIGHT_CTL );
273 mpEditEngineItemPool->SetPoolDefaultItem( aItem );
274
275 // forces new settings to be used
276 // unfortunately this resets the whole edit engine
277 // thus we need to save at least the text
278 String aTxt( pEditEngine->GetText( LINEEND_LF ) );
279 pEditEngine->Clear(); //#77957 incorrect font size
280 pEditEngine->SetText( aTxt );
281 }
282
283 String aText (mpEditEngine->GetText (LINEEND_LF));
284 mpEditEngine->Clear();
285 mpEditEngine->SetText (aText);
286
287 AdjustScrollBars();
288 Resize();
289 }
290
291
292
293
Resize(void)294 void EditWindow::Resize (void)
295 {
296 if (!mpEditView)
297 CreateEditView();
298
299 if (mpEditView != NULL)
300 {
301 mpEditView->SetOutputArea(AdjustScrollBars());
302 mpEditView->ShowCursor();
303
304 DBG_ASSERT( mpEditView->GetEditEngine(), "EditEngine missing" );
305 const long nMaxVisAreaStart = mpEditView->GetEditEngine()->GetTextHeight() -
306 mpEditView->GetOutputArea().GetHeight();
307 if (mpEditView->GetVisArea().Top() > nMaxVisAreaStart)
308 {
309 Rectangle aVisArea(mpEditView->GetVisArea() );
310 aVisArea.Top() = (nMaxVisAreaStart > 0 ) ? nMaxVisAreaStart : 0;
311 aVisArea.SetSize(mpEditView->GetOutputArea().GetSize());
312 mpEditView->SetVisArea(aVisArea);
313 mpEditView->ShowCursor();
314 }
315 InitScrollBars();
316 }
317 Invalidate();
318 }
319
320
321
322
MouseButtonUp(const MouseEvent & rEvt)323 void EditWindow::MouseButtonUp(const MouseEvent &rEvt)
324 {
325 if (mpEditView != NULL)
326 mpEditView->MouseButtonUp(rEvt);
327 else
328 Window::MouseButtonUp (rEvt);
329
330 // ggf FormulaCursor neu positionieren
331 // CursorMoveTimerHdl(&aCursorMoveTimer);
332 }
333
334
335
336
MouseButtonDown(const MouseEvent & rEvt)337 void EditWindow::MouseButtonDown(const MouseEvent &rEvt)
338 {
339 if (mpEditView != NULL)
340 mpEditView->MouseButtonDown(rEvt);
341 else
342 Window::MouseButtonDown (rEvt);
343
344 GrabFocus();
345 }
346
347
348
349
Command(const CommandEvent & rCEvt)350 void EditWindow::Command(const CommandEvent& rCEvt)
351 {
352 /* if (rCEvt.GetCommand() == COMMAND_CONTEXTMENU)
353 {
354 GetParent()->ToTop();
355
356 Point aPoint = rCEvt.GetMousePosPixel();
357 PopupMenu* pPopupMenu = new PopupMenu(SmResId(RID_COMMANDMENU));
358
359 // added for replaceability of context menus #96085, #93782
360 Menu* pMenu = NULL;
361 ::com::sun::star::ui::ContextMenuExecuteEvent aEvent;
362 aEvent.SourceWindow = VCLUnoHelper::GetInterface( this );
363 aEvent.ExecutePosition.X = aPoint.X();
364 aEvent.ExecutePosition.Y = aPoint.Y();
365 if ( GetView()->TryContextMenuInterception( *pPopupMenu, pMenu, aEvent ) )
366 {
367 if ( pMenu )
368 {
369 delete pPopupMenu;
370 pPopupMenu = (PopupMenu*) pMenu;
371 }
372 }
373
374 pPopupMenu->SetSelectHdl(LINK(this, EditWindow, MenuSelectHdl));
375
376 pPopupMenu->Execute( this, aPoint );
377 delete pPopupMenu;
378 }
379 else*/ if (mpEditView)
380 mpEditView->Command( rCEvt );
381 else
382 Window::Command (rCEvt);
383
384 }
IMPL_LINK_INLINE_START(EditWindow,MenuSelectHdl,Menu *,EMPTYARG)385 IMPL_LINK_INLINE_START( EditWindow, MenuSelectHdl, Menu *, EMPTYARG )
386 {
387 /* SmViewShell *pViewSh = rCmdBox.GetView();
388 if (pViewSh)
389 pViewSh->GetViewFrame()->GetDispatcher()->Execute(
390 SID_INSERTCOMMAND, SFX_CALLMODE_STANDARD,
391 new SfxInt16Item(SID_INSERTCOMMAND, pMenu->GetCurItemId()), 0L);
392 */
393 return 0;
394 }
IMPL_LINK_INLINE_END(EditWindow,MenuSelectHdl,Menu *,EMPTYARG)395 IMPL_LINK_INLINE_END( EditWindow, MenuSelectHdl, Menu *, EMPTYARG )
396
397 void EditWindow::KeyInput(const KeyEvent& )
398 {
399 /* if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
400 {
401 sal_Bool bCallBase = sal_True;
402 SfxViewShell* pViewShell = SfxViewShell::Current();
403 if ( pViewShell && pViewShell->ISA(SmViewShell) )
404 {
405 SmDocShell* pDocSh = (SmDocShell*) pViewShell->GetViewFrame()->GetObjectShell();
406 if (pDocSh)
407 {
408 // fuert zum (sofortigen) Zerstoeren von this!
409 pDocSh->DoInPlaceActivate( sal_False );
410 bCallBase = sal_False;
411 }
412 }
413 if ( bCallBase )
414 Window::KeyInput( rKEvt );
415 }
416 else
417 {
418 // Timer neu starten, um den Handler (auch bei l�ngeren Eingaben)
419 // m�glichst nur einmal am Ende aufzurufen.
420 aCursorMoveTimer.Start();
421
422 DBG_ASSERT( mpEditView, "EditView missing (NULL pointer)" );
423 if (!mpEditView)
424 CreateEditView();
425 if ( !mpEditView->PostKeyEvent(rKEvt) )
426 {
427 if ( !SfxViewShell::Current()->KeyInput(rKEvt) )
428 {
429 // fuert bei F1 (Hilfe) zum Zerstoeren von this!
430 Flush();
431 if ( aModifyTimer.IsActive() )
432 aModifyTimer.Stop();
433 Window::KeyInput(rKEvt);
434 }
435 else
436 {
437 //SFX hat evtl. Slot an der View gecallt und dabei (wg. Hack
438 //im SFX) den Focus auf die View gesetzt
439 SfxViewShell* pVShell = SfxViewShell::Current();
440 if ( pVShell && pVShell->ISA(SmViewShell) &&
441 ((SmViewShell*)pVShell)->GetGraphicWindow().HasFocus() )
442 {
443 GrabFocus();
444 }
445 }
446 }
447 else
448 {
449 // have doc-shell modified only for formula input/change and not
450 // cursor travelling and such things...
451 SmDocShell *pDocShell = GetDoc();
452 if (pDocShell)
453 pDocShell->SetModified( GetEditEngine()->IsModified() );
454
455 aModifyTimer.Start();
456 }
457 }
458 */
459 }
460
461
462
463
Paint(const Rectangle & rRect)464 void EditWindow::Paint(const Rectangle& rRect)
465 {
466 if (!mpEditView)
467 CreateEditView();
468 mpEditView->Paint(rRect);
469 }
470
471
472
473
CreateEditView(void)474 void EditWindow::CreateEditView (void)
475 {
476 EditEngine* pEditEngine = GetEditEngine();
477
478 //! pEditEngine and mpEditView may be 0.
479 //! For example when the program is used by the document-converter
480 if (mpEditView==NULL && pEditEngine!=NULL)
481 {
482 mpEditView = new EditView (pEditEngine, this);
483 pEditEngine->InsertView (mpEditView);
484
485 if (mpVerticalScrollBar == NULL)
486 mpVerticalScrollBar = new ScrollBar (
487 this, WinBits(WB_VSCROLL | WB_DRAG));
488 if (mpHorizontalScrollBar == NULL)
489 mpHorizontalScrollBar = new ScrollBar (
490 this, WinBits(WB_HSCROLL | WB_DRAG));
491 if (mpScrollBox == NULL)
492 mpScrollBox = new ScrollBarBox (this);
493 mpVerticalScrollBar->SetScrollHdl(LINK(this, EditWindow, ScrollHdl));
494 mpHorizontalScrollBar->SetScrollHdl(LINK(this, EditWindow, ScrollHdl));
495
496 mpEditView->SetOutputArea(AdjustScrollBars());
497
498 ESelection eSelection;
499
500 mpEditView->SetSelection(eSelection);
501 Update();
502 mpEditView->ShowCursor(sal_True, sal_True);
503
504 pEditEngine->SetStatusEventHdl(
505 LINK(this, EditWindow, EditStatusHdl));
506 SetPointer(mpEditView->GetPointer());
507
508 SetScrollBarRanges();
509 }
510 }
511
512
513
514
IMPL_LINK(EditWindow,EditStatusHdl,EditStatus *,EMPTYARG)515 IMPL_LINK( EditWindow, EditStatusHdl, EditStatus *, EMPTYARG )
516 {
517 if (!mpEditView)
518 return 1;
519 else
520 {
521 SetScrollBarRanges();
522 return 0;
523 }
524 }
525
IMPL_LINK_INLINE_START(EditWindow,ScrollHdl,ScrollBar *,EMPTYARG)526 IMPL_LINK_INLINE_START( EditWindow, ScrollHdl, ScrollBar *, EMPTYARG )
527 {
528 DBG_ASSERT(mpEditView, "EditView missing");
529 if (mpEditView)
530 {
531 mpEditView->SetVisArea(Rectangle(Point(mpHorizontalScrollBar->GetThumbPos(),
532 mpVerticalScrollBar->GetThumbPos()),
533 mpEditView->GetVisArea().GetSize()));
534 mpEditView->Invalidate();
535 }
536 return 0;
537 }
IMPL_LINK_INLINE_END(EditWindow,ScrollHdl,ScrollBar *,EMPTYARG)538 IMPL_LINK_INLINE_END( EditWindow, ScrollHdl, ScrollBar *, EMPTYARG )
539
540 Rectangle EditWindow::AdjustScrollBars()
541 {
542 const Size aOut( GetOutputSizePixel() );
543 Point aPoint;
544 Rectangle aRect( aPoint, aOut );
545
546 if (mpVerticalScrollBar && mpHorizontalScrollBar && mpScrollBox)
547 {
548 const long nTmp = GetSettings().GetStyleSettings().GetScrollBarSize();
549 Point aPt( aRect.TopRight() ); aPt.X() -= nTmp -1L;
550 mpVerticalScrollBar->SetPosSizePixel( aPt, Size(nTmp, aOut.Height() - nTmp));
551
552 aPt = aRect.BottomLeft(); aPt.Y() -= nTmp - 1L;
553 mpHorizontalScrollBar->SetPosSizePixel( aPt, Size(aOut.Width() - nTmp, nTmp));
554
555 aPt.X() = mpHorizontalScrollBar->GetSizePixel().Width();
556 aPt.Y() = mpVerticalScrollBar->GetSizePixel().Height();
557 mpScrollBox->SetPosSizePixel(aPt, Size(nTmp, nTmp ));
558
559 aRect.Right() = aPt.X() - 2;
560 aRect.Bottom() = aPt.Y() - 2;
561 }
562 return aRect;
563 }
564
SetScrollBarRanges()565 void EditWindow::SetScrollBarRanges()
566 {
567 EditEngine* pEditEngine = GetEditEngine();
568 if (mpEditView != NULL && pEditEngine != NULL)
569 {
570 if (mpVerticalScrollBar != NULL)
571 {
572 long nTmp = pEditEngine->GetTextHeight();
573 mpVerticalScrollBar->SetRange(Range(0, nTmp));
574 mpVerticalScrollBar->SetThumbPos(mpEditView->GetVisArea().Top());
575 }
576 if (mpHorizontalScrollBar != NULL)
577 {
578 long nTmp = pEditEngine->GetPaperSize().Width();
579 mpHorizontalScrollBar->SetRange(Range(0,nTmp));
580 mpHorizontalScrollBar->SetThumbPos(mpEditView->GetVisArea().Left());
581 }
582 }
583 }
584
InitScrollBars()585 void EditWindow::InitScrollBars()
586 {
587 if (mpEditView != NULL)
588 {
589 const Size aOut( mpEditView->GetOutputArea().GetSize() );
590 if (mpVerticalScrollBar != NULL)
591 {
592 mpVerticalScrollBar->SetVisibleSize(aOut.Height());
593 mpVerticalScrollBar->SetPageSize(aOut.Height() * 8 / 10);
594 mpVerticalScrollBar->SetLineSize(aOut.Height() * 2 / 10);
595 }
596
597 if (mpHorizontalScrollBar != NULL)
598 {
599 mpHorizontalScrollBar->SetVisibleSize(aOut.Width());
600 mpHorizontalScrollBar->SetPageSize(aOut.Width() * 8 / 10);
601 mpHorizontalScrollBar->SetLineSize(SCROLL_LINE );
602 }
603
604 SetScrollBarRanges();
605
606 if (mpVerticalScrollBar != NULL)
607 mpVerticalScrollBar->Show();
608 if (mpHorizontalScrollBar != NULL)
609 mpHorizontalScrollBar->Show();
610 if (mpScrollBox != NULL)
611 mpScrollBox->Show();
612 }
613 }
614
615
GetText()616 XubString EditWindow::GetText()
617 {
618 String aText;
619 EditEngine *pEditEngine = GetEditEngine();
620 DBG_ASSERT( pEditEngine, "EditEngine missing" );
621 if (pEditEngine)
622 aText = pEditEngine->GetText( LINEEND_LF );
623 return aText;
624 }
625
626
SetText(const XubString & rText)627 void EditWindow::SetText(const XubString& rText)
628 {
629 EditEngine *pEditEngine = GetEditEngine();
630 DBG_ASSERT( pEditEngine, "EditEngine missing" );
631 if (pEditEngine && !pEditEngine->IsModified())
632 {
633 if (!mpEditView)
634 CreateEditView();
635
636 ESelection eSelection = mpEditView->GetSelection();
637
638 pEditEngine->SetText(rText);
639 pEditEngine->ClearModifyFlag();
640
641 //! Hier die Timer neu zu starten verhindert, dass die Handler f�r andere
642 //! (im Augenblick nicht mehr aktive) Math Tasks aufgerufen werden.
643 maModifyTimer.Start();
644 maCursorMoveTimer.Start();
645
646 mpEditView->SetSelection(eSelection);
647 }
648 }
649
650
GetFocus()651 void EditWindow::GetFocus()
652 {
653 Window::GetFocus();
654
655 if (!mpEditView)
656 CreateEditView();
657 if (mpEditEngine != NULL)
658 mpEditEngine->SetStatusEventHdl(
659 LINK(this, EditWindow, EditStatusHdl));
660 }
661
662
LoseFocus()663 void EditWindow::LoseFocus()
664 {
665 if (mpEditEngine != NULL)
666 mpEditEngine->SetStatusEventHdl (Link());
667
668 Window::LoseFocus();
669 }
670
671
IsAllSelected() const672 sal_Bool EditWindow::IsAllSelected() const
673 {
674 sal_Bool bRes = sal_False;
675 EditEngine *pEditEngine = ((EditWindow *) this)->GetEditEngine();
676 DBG_ASSERT( mpEditView, "NULL pointer" );
677 DBG_ASSERT( pEditEngine, "NULL pointer" );
678 if (pEditEngine && mpEditView)
679 {
680 ESelection eSelection( mpEditView->GetSelection() );
681 sal_Int32 nParaCnt = pEditEngine->GetParagraphCount();
682 if (!(nParaCnt - 1))
683 {
684 String Text( pEditEngine->GetText( LINEEND_LF ) );
685 bRes = !eSelection.nStartPos && (eSelection.nEndPos == Text.Len () - 1);
686 }
687 else
688 {
689 bRes = !eSelection.nStartPara && (eSelection.nEndPara == nParaCnt - 1);
690 }
691 }
692 return bRes;
693 }
694
SelectAll()695 void EditWindow::SelectAll()
696 {
697 DBG_ASSERT( mpEditView, "NULL pointer" );
698 if (mpEditView)
699 {
700 mpEditView->SetSelection( ESelection( 0, 0, EE_PARA_MAX, EE_INDEX_MAX ) );
701 }
702 }
703
704
MarkError(const Point & rPos)705 void EditWindow::MarkError(const Point &rPos)
706 {
707 DBG_ASSERT( mpEditView, "EditView missing" );
708 if (mpEditView)
709 {
710 const int Col = rPos.X();
711 const int Row = rPos.Y() - 1;
712
713 mpEditView->SetSelection(ESelection ( (sal_uInt16)Row, (sal_uInt16)(Col - 1), (sal_uInt16)Row, (sal_uInt16)Col));
714 GrabFocus();
715 }
716 }
717
SelNextMark()718 void EditWindow::SelNextMark()
719 {
720 EditEngine *pEditEngine = GetEditEngine();
721 DBG_ASSERT( mpEditView, "NULL pointer" );
722 DBG_ASSERT( pEditEngine, "NULL pointer" );
723 if (pEditEngine && mpEditView)
724 {
725 ESelection eSelection = mpEditView->GetSelection();
726 sal_uInt16 Pos = eSelection.nEndPos;
727 String aMark (UniString::CreateFromAscii("<?>"));
728 String aText;
729 sal_uInt32 nCounts = pEditEngine->GetParagraphCount();
730
731 while (eSelection.nEndPara < nCounts)
732 {
733 aText = pEditEngine->GetText( eSelection.nEndPara );
734 Pos = aText.Search(aMark, Pos);
735
736 if (Pos != STRING_NOTFOUND)
737 {
738 mpEditView->SetSelection(ESelection (eSelection.nEndPara, Pos, eSelection.nEndPara, Pos + 3));
739 break;
740 }
741
742 Pos = 0;
743 eSelection.nEndPara++;
744 }
745 }
746 }
747
SelPrevMark()748 void EditWindow::SelPrevMark()
749 {
750 EditEngine *pEditEngine = GetEditEngine();
751 DBG_ASSERT( pEditEngine, "NULL pointer" );
752 DBG_ASSERT( mpEditView, "NULL pointer" );
753 if (pEditEngine && mpEditView)
754 {
755 ESelection eSelection = mpEditView->GetSelection();
756 sal_uInt16 Pos = STRING_NOTFOUND;
757 xub_StrLen Max = eSelection.nStartPos;
758 String Text( pEditEngine->GetText( eSelection.nStartPara ) );
759 String aMark (UniString::CreateFromAscii("<?>"));
760 sal_uInt32 nCounts = pEditEngine->GetParagraphCount();
761
762 do
763 {
764 sal_uInt16 Fnd = Text.Search(aMark, 0);
765
766 while ((Fnd < Max) && (Fnd != STRING_NOTFOUND))
767 {
768 Pos = Fnd;
769 Fnd = Text.Search(aMark, Fnd + 1);
770 }
771
772 if (Pos == STRING_NOTFOUND)
773 {
774 eSelection.nStartPara--;
775 Text = pEditEngine->GetText( eSelection.nStartPara );
776 Max = Text.Len();
777 }
778 }
779 while ((eSelection.nStartPara < nCounts) &&
780 (Pos == STRING_NOTFOUND));
781
782 if (Pos != STRING_NOTFOUND)
783 {
784 mpEditView->SetSelection(ESelection (eSelection.nStartPara, Pos, eSelection.nStartPara, Pos + 3));
785 }
786 }
787 }
788
HasMark(const String & rText) const789 sal_Bool EditWindow::HasMark(const String& rText) const
790 // returns true iff 'rText' contains a mark
791 {
792 return rText.SearchAscii("<?>", 0) != STRING_NOTFOUND;
793 }
794
MouseMove(const MouseEvent & rEvt)795 void EditWindow::MouseMove(const MouseEvent &rEvt)
796 {
797 if (mpEditView)
798 mpEditView->MouseMove(rEvt);
799 }
800
AcceptDrop(const AcceptDropEvent &)801 sal_Int8 EditWindow::AcceptDrop( const AcceptDropEvent& )
802 {
803 return mpEditView ? /*mpEditView->QueryDrop( rEvt )*/DND_ACTION_NONE: DND_ACTION_NONE;
804 }
805
ExecuteDrop(const ExecuteDropEvent &)806 sal_Int8 EditWindow::ExecuteDrop( const ExecuteDropEvent& )
807 {
808 return mpEditView ? /*mpEditView->Drop( rEvt )*/DND_ACTION_NONE : DND_ACTION_NONE;
809 }
810
GetSelection() const811 ESelection EditWindow::GetSelection() const
812 {
813 // pointer may be 0 when reloading a document and the old view
814 // was already destroyed
815 //(DBG_ASSERT( mpEditView, "NULL pointer" );
816 ESelection eSel;
817 if (mpEditView)
818 eSel = mpEditView->GetSelection();
819 return eSel;
820 }
821
SetSelection(const ESelection & rSel)822 void EditWindow::SetSelection(const ESelection &rSel)
823 {
824 DBG_ASSERT( mpEditView, "NULL pointer" );
825 if (mpEditView)
826 mpEditView->SetSelection(rSel);
827 }
828
IsEmpty() const829 sal_Bool EditWindow::IsEmpty() const
830 {
831 EditEngine *pEditEngine = ((EditWindow *) this)->GetEditEngine();
832 return (pEditEngine && (pEditEngine->GetTextLen() == 0)) ? sal_True : sal_False;
833 }
834
IsSelected() const835 sal_Bool EditWindow::IsSelected() const
836 {
837 return mpEditView ? mpEditView->HasSelection() : sal_False;
838 }
839
Cut()840 void EditWindow::Cut()
841 {
842 DBG_ASSERT( mpEditView, "EditView missing" );
843 if (mpEditView)
844 mpEditView->Cut();
845 }
846
Copy()847 void EditWindow::Copy()
848 {
849 DBG_ASSERT( mpEditView, "EditView missing" );
850 if (mpEditView)
851 mpEditView->Copy();
852 }
853
Paste()854 void EditWindow::Paste()
855 {
856 DBG_ASSERT( mpEditView, "EditView missing" );
857 if (mpEditView)
858 mpEditView->Paste();
859 }
860
Delete()861 void EditWindow::Delete()
862 {
863 DBG_ASSERT( mpEditView, "EditView missing" );
864 if (mpEditView)
865 mpEditView->DeleteSelected();
866 }
867
InsertText(const String & Text)868 void EditWindow::InsertText(const String& Text)
869 {
870 DBG_ASSERT( mpEditView, "EditView missing" );
871 ::vos::OGuard aGuard (::Application::GetSolarMutex());
872 if (mpEditView)
873 mpEditView->InsertText(Text);
874 }
875
876
877
878 } } // end of namespace ::sd::notes
879