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