xref: /core/starmath/source/edit.cxx (revision be53f326)
161355e51SSebastian Spaeth /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2e70c4a27SMichael Meeks /*
3e70c4a27SMichael Meeks  * This file is part of the LibreOffice project.
4d7913668SJens-Heiner Rechtien  *
5e70c4a27SMichael Meeks  * This Source Code Form is subject to the terms of the Mozilla Public
6e70c4a27SMichael Meeks  * License, v. 2.0. If a copy of the MPL was not distributed with this
7e70c4a27SMichael Meeks  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8b9d22cc7SRüdiger Timm  *
9e70c4a27SMichael Meeks  * This file incorporates work covered by the following license notice:
10b9d22cc7SRüdiger Timm  *
11e70c4a27SMichael Meeks  *   Licensed to the Apache Software Foundation (ASF) under one or more
12e70c4a27SMichael Meeks  *   contributor license agreements. See the NOTICE file distributed
13e70c4a27SMichael Meeks  *   with this work for additional information regarding copyright
14e70c4a27SMichael Meeks  *   ownership. The ASF licenses this file to you under the Apache
15e70c4a27SMichael Meeks  *   License, Version 2.0 (the "License"); you may not use this file
16e70c4a27SMichael Meeks  *   except in compliance with the License. You may obtain a copy of
17e70c4a27SMichael Meeks  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18e70c4a27SMichael Meeks  */
19d7913668SJens-Heiner Rechtien 
20ff77d83aSStephan Bergmann #include <starmath.hrc>
21ff77d83aSStephan Bergmann #include <helpids.h>
22d7913668SJens-Heiner Rechtien 
234a6dc219SGabor Kelemen #include <vcl/commandevent.hxx>
240eaa0804SGabor Kelemen #include <vcl/event.hxx>
25700936e4SCaolán McNamara #include <vcl/scrbar.hxx>
26a18a1a45STobias Lippert #include <vcl/settings.hxx>
27a18a1a45STobias Lippert 
2855f1f483SMathias Bauer #include <editeng/editview.hxx>
2955f1f483SMathias Bauer #include <editeng/editeng.hxx>
30d7913668SJens-Heiner Rechtien #include <sfx2/dispatch.hxx>
314a6dc219SGabor Kelemen #include <sfx2/sfxsids.hrc>
32ed87eb8fSMathias Bauer #include <svl/stritem.hxx>
335ed3fa4cSJens-Heiner Rechtien #include <sfx2/viewfrm.hxx>
341a68c135SJochen Nitschke #include <svx/AccessibleTextHelper.hxx>
359ec128f8SGabor Kelemen #include <svtools/colorcfg.hxx>
364a6dc219SGabor Kelemen #include <osl/diagnose.h>
37d7913668SJens-Heiner Rechtien 
38ff77d83aSStephan Bergmann #include <edit.hxx>
399ec128f8SGabor Kelemen #include <smmod.hxx>
40ff77d83aSStephan Bergmann #include <view.hxx>
41ff77d83aSStephan Bergmann #include <document.hxx>
42aad92a7cSNoel Grandin #include "cfgitem.hxx"
43b8cd33a4SCaolán McNamara #include "accessibility.hxx"
4408348b22SCaolán McNamara #include <memory>
45d7913668SJens-Heiner Rechtien 
46d7913668SJens-Heiner Rechtien #define SCROLL_LINE         24
47d7913668SJens-Heiner Rechtien 
48d7913668SJens-Heiner Rechtien 
49959ee1abSVladimir Glazounov using namespace com::sun::star::accessibility;
50e716420fSThomas Lange using namespace com::sun::star;
51e716420fSThomas Lange 
527d99ec7fSAlexander Wilms 
539728c9e8SCaolán McNamara void SmGetLeftSelectionPart(const ESelection &rSel,
542af1f569SEike Rathke                             sal_Int32 &nPara, sal_uInt16 &nPos)
55d7913668SJens-Heiner Rechtien     // returns paragraph number and position of the selections left part
56d7913668SJens-Heiner Rechtien {
57d7913668SJens-Heiner Rechtien     // compare start and end of selection and use the one that comes first
589728c9e8SCaolán McNamara     if (    rSel.nStartPara <  rSel.nEndPara
599728c9e8SCaolán McNamara         ||  (rSel.nStartPara == rSel.nEndPara  &&  rSel.nStartPos < rSel.nEndPos) )
609728c9e8SCaolán McNamara     {   nPara = rSel.nStartPara;
619728c9e8SCaolán McNamara         nPos  = rSel.nStartPos;
62d7913668SJens-Heiner Rechtien     }
63d7913668SJens-Heiner Rechtien     else
649728c9e8SCaolán McNamara     {   nPara = rSel.nEndPara;
659728c9e8SCaolán McNamara         nPos  = rSel.nEndPos;
66d7913668SJens-Heiner Rechtien     }
67d7913668SJens-Heiner Rechtien }
68d7913668SJens-Heiner Rechtien 
6946b8e9a0SMichael Meeks bool SmEditWindow::IsInlineEditEnabled()
7046b8e9a0SMichael Meeks {
71fef82b76SCaolán McNamara     SmViewShell *pView = GetView();
724f9b2124SNoel Grandin     return pView && pView->IsInlineEditEnabled();
7346b8e9a0SMichael Meeks }
7446b8e9a0SMichael Meeks 
757d99ec7fSAlexander Wilms 
76d325e7d2SThomas Lange SmEditWindow::SmEditWindow( SmCmdBoxWindow &rMyCmdBoxWin ) :
77501b935dSJan-Marek Glogowski     Window              (&rMyCmdBoxWin, WB_BORDER),
78daf3e290Sjp     DropTargetHelper    ( this ),
79376c337dSMuhammet Kara     rCmdBox             (rMyCmdBoxWin),
80376c337dSMuhammet Kara     aModifyIdle         ("SmEditWindow ModifyIdle"),
81376c337dSMuhammet Kara     aCursorMoveIdle     ("SmEditWindow CursorMoveIdle")
82d7913668SJens-Heiner Rechtien {
83bf5110d0SMarkus Mohrhard     set_id("math_edit");
84d7913668SJens-Heiner Rechtien     SetHelpId(HID_SMA_COMMAND_WIN_EDIT);
8511d2f3d6SMichael Stahl     SetMapMode(MapMode(MapUnit::MapPixel));
86d7913668SJens-Heiner Rechtien 
87389172a0SRüdiger Timm     // Even RTL languages don't use RTL for math
88125895c3SNoel Grandin     EnableRTL( false );
89389172a0SRüdiger Timm 
90aa6d96a6SThomas Lange     // compare DataChanged
91d7913668SJens-Heiner Rechtien     SetBackground( GetSettings().GetStyleSettings().GetWindowColor() );
92d7913668SJens-Heiner Rechtien 
93bf110d40SJan-Marek Glogowski     aModifyIdle.SetInvokeHandler(LINK(this, SmEditWindow, ModifyTimerHdl));
94fdc61261SJan-Marek Glogowski     aModifyIdle.SetPriority(TaskPriority::LOWEST);
95d7913668SJens-Heiner Rechtien 
9646b8e9a0SMichael Meeks     if (!IsInlineEditEnabled())
9746b8e9a0SMichael Meeks     {
98bf110d40SJan-Marek Glogowski         aCursorMoveIdle.SetInvokeHandler(LINK(this, SmEditWindow, CursorMoveTimerHdl));
99fdc61261SJan-Marek Glogowski         aCursorMoveIdle.SetPriority(TaskPriority::LOWEST);
10046b8e9a0SMichael Meeks     }
10146b8e9a0SMichael Meeks 
1029b452d2aSKurt Zenker     // if not called explicitly the this edit window within the
1039b452d2aSKurt Zenker     // command window will just show an empty gray panel.
1042111a406SThomas Lange     Show();
105d7913668SJens-Heiner Rechtien }
106d7913668SJens-Heiner Rechtien 
107e716420fSThomas Lange 
108d7913668SJens-Heiner Rechtien SmEditWindow::~SmEditWindow()
109d7913668SJens-Heiner Rechtien {
110d7a84ce8SNoel Grandin     disposeOnce();
11145515c06SNoel Grandin }
11245515c06SNoel Grandin 
11345515c06SNoel Grandin void SmEditWindow::dispose()
11445515c06SNoel Grandin {
115ea6399b8STobias Madl     aModifyIdle.Stop();
1169bf928a7SThomas Lange 
11746b8e9a0SMichael Meeks     StartCursorMove();
1185c419f39SJens-Heiner Rechtien 
1192b0f7be0SGuillaume Poussel     // clean up of classes used for accessibility
1205c419f39SJens-Heiner Rechtien     // must be done before EditView (and thus EditEngine) is no longer
1215c419f39SJens-Heiner Rechtien     // available for those classes.
1228c5471c3STakeshi Abe     if (mxAccessible.is())
123954e5e4bSMichael Meeks     {
124de084e09Sdennisroczek         mxAccessible->ClearWin();    // make Accessible nonfunctional
1258c5471c3STakeshi Abe         mxAccessible.clear();
126954e5e4bSMichael Meeks     }
1275c419f39SJens-Heiner Rechtien 
12825af6a72SThomas Lange     if (pEditView)
12925af6a72SThomas Lange     {
13025af6a72SThomas Lange         EditEngine *pEditEngine = pEditView->GetEditEngine();
131d7913668SJens-Heiner Rechtien         if (pEditEngine)
13225af6a72SThomas Lange         {
13369a06ca6SNoel Grandin             pEditEngine->SetStatusEventHdl( Link<EditStatus&,void>() );
134950055bcSTakeshi Abe             pEditEngine->RemoveView( pEditView.get() );
13525af6a72SThomas Lange         }
136e8b97a52SMichael Meeks         pEditView.reset();
137a831e56cSCaolán McNamara     }
1381c4025baSNoel Grandin 
139c0a802b5SMichael Meeks     pHScrollBar.disposeAndClear();
140c0a802b5SMichael Meeks     pVScrollBar.disposeAndClear();
141c0a802b5SMichael Meeks     pScrollBox.disposeAndClear();
142954e5e4bSMichael Meeks 
14380c874dcSNoel Grandin     DropTargetHelper::dispose();
14445515c06SNoel Grandin     vcl::Window::dispose();
145e716420fSThomas Lange }
146e716420fSThomas Lange 
14746b8e9a0SMichael Meeks void SmEditWindow::StartCursorMove()
14846b8e9a0SMichael Meeks {
14946b8e9a0SMichael Meeks     if (!IsInlineEditEnabled())
150ea6399b8STobias Madl         aCursorMoveIdle.Stop();
15146b8e9a0SMichael Meeks }
15246b8e9a0SMichael Meeks 
1535ed3fa4cSJens-Heiner Rechtien void SmEditWindow::InvalidateSlots()
1545ed3fa4cSJens-Heiner Rechtien {
1555ed3fa4cSJens-Heiner Rechtien     SfxBindings& rBind = GetView()->GetViewFrame()->GetBindings();
1565ed3fa4cSJens-Heiner Rechtien     rBind.Invalidate(SID_COPY);
1575ed3fa4cSJens-Heiner Rechtien     rBind.Invalidate(SID_CUT);
1585ed3fa4cSJens-Heiner Rechtien     rBind.Invalidate(SID_DELETE);
1595ed3fa4cSJens-Heiner Rechtien }
160e716420fSThomas Lange 
161e716420fSThomas Lange SmViewShell * SmEditWindow::GetView()
162e716420fSThomas Lange {
163e716420fSThomas Lange     return rCmdBox.GetView();
164d7913668SJens-Heiner Rechtien }
1659bf928a7SThomas Lange 
1669bf928a7SThomas Lange 
167eb9b8aaaSThomas Lange SmDocShell * SmEditWindow::GetDoc()
1689bf928a7SThomas Lange {
169d325e7d2SThomas Lange     SmViewShell *pView = rCmdBox.GetView();
170374b4f34SStephan Bergmann     return pView ? pView->GetDoc() : nullptr;
171d7913668SJens-Heiner Rechtien }
172d7913668SJens-Heiner Rechtien 
173950055bcSTakeshi Abe EditView * SmEditWindow::GetEditView()
174950055bcSTakeshi Abe {
175950055bcSTakeshi Abe     return pEditView.get();
176950055bcSTakeshi Abe }
177d7913668SJens-Heiner Rechtien 
178eb9b8aaaSThomas Lange EditEngine * SmEditWindow::GetEditEngine()
179d7913668SJens-Heiner Rechtien {
180374b4f34SStephan Bergmann     EditEngine *pEditEng = nullptr;
18125af6a72SThomas Lange     if (pEditView)
18225af6a72SThomas Lange         pEditEng = pEditView->GetEditEngine();
18325af6a72SThomas Lange     else
18425af6a72SThomas Lange     {
185eb9b8aaaSThomas Lange         SmDocShell *pDoc = GetDoc();
18625af6a72SThomas Lange         if (pDoc)
18725af6a72SThomas Lange             pEditEng = &pDoc->GetEditEngine();
18825af6a72SThomas Lange     }
18925af6a72SThomas Lange     return pEditEng;
190eb9b8aaaSThomas Lange }
1919bf928a7SThomas Lange 
192f9c94cfdSJan-Marek Glogowski void SmEditWindow::ApplySettings(vcl::RenderContext& rRenderContext)
193f9c94cfdSJan-Marek Glogowski {
194f9c94cfdSJan-Marek Glogowski     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
195f9c94cfdSJan-Marek Glogowski     rRenderContext.SetBackground(rStyleSettings.GetWindowColor());
196f9c94cfdSJan-Marek Glogowski }
197f9c94cfdSJan-Marek Glogowski 
198ea191cf9SJan-Marek Glogowski void SmEditWindow::DataChanged( const DataChangedEvent& rDCEvt )
199aa6d96a6SThomas Lange {
200ea191cf9SJan-Marek Glogowski     Window::DataChanged( rDCEvt );
201d7913668SJens-Heiner Rechtien 
202ea191cf9SJan-Marek Glogowski     if (!((rDCEvt.GetType() == DataChangedEventType::FONTS) ||
203ea191cf9SJan-Marek Glogowski           (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) ||
204ea191cf9SJan-Marek Glogowski           ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
205ea191cf9SJan-Marek Glogowski            (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))))
206ea191cf9SJan-Marek Glogowski         return;
2079bf928a7SThomas Lange 
208d325e7d2SThomas Lange     EditEngine *pEditEngine = GetEditEngine();
2099a39b4c9SCaolán McNamara     SmDocShell *pDoc = GetDoc();
210eb9b8aaaSThomas Lange 
2119a39b4c9SCaolán McNamara     if (pEditEngine && pDoc)
2129bf928a7SThomas Lange     {
2139f435b88SThomas Lange         //!
2149f435b88SThomas Lange         //! see also SmDocShell::GetEditEngine() !
2159f435b88SThomas Lange         //!
216ea191cf9SJan-Marek Glogowski         const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
217ea191cf9SJan-Marek Glogowski 
218f9c94cfdSJan-Marek Glogowski         pDoc->UpdateEditEngineDefaultFonts(rStyleSettings.GetFieldTextColor());
219ea191cf9SJan-Marek Glogowski         pEditEngine->SetBackgroundColor(rStyleSettings.GetFieldColor());
220f9c94cfdSJan-Marek Glogowski         pEditEngine->SetDefTab(sal_uInt16(GetTextWidth("XXXX")));
2219bf928a7SThomas Lange 
2229bf928a7SThomas Lange         // forces new settings to be used
2233bebed4fSThomas Lange         // unfortunately this resets the whole edit engine
2243bebed4fSThomas Lange         // thus we need to save at least the text
225df7390e6SStephan Bergmann         OUString aTxt( pEditEngine->GetText() );
226243eb65bSMartin Kepplinger         pEditEngine->Clear();   //incorrect font size
2273bebed4fSThomas Lange         pEditEngine->SetText( aTxt );
2289bf928a7SThomas Lange 
229d7913668SJens-Heiner Rechtien         AdjustScrollBars();
230d7913668SJens-Heiner Rechtien         Resize();
231d7913668SJens-Heiner Rechtien     }
232d7913668SJens-Heiner Rechtien 
233ea191cf9SJan-Marek Glogowski     Invalidate();
234ea191cf9SJan-Marek Glogowski }
235ea191cf9SJan-Marek Glogowski 
236bf110d40SJan-Marek Glogowski IMPL_LINK_NOARG( SmEditWindow, ModifyTimerHdl, Timer *, void )
237d7913668SJens-Heiner Rechtien {
238069d71b7SNoel Grandin     UpdateStatus(false);
239ea6399b8STobias Madl     aModifyIdle.Stop();
240d7913668SJens-Heiner Rechtien }
241d7913668SJens-Heiner Rechtien 
242bf110d40SJan-Marek Glogowski IMPL_LINK_NOARG(SmEditWindow, CursorMoveTimerHdl, Timer *, void)
24346b8e9a0SMichael Meeks     // every once in a while check cursor position (selection) of edit
24446b8e9a0SMichael Meeks     // window and if it has changed (try to) set the formula-cursor
24546b8e9a0SMichael Meeks     // according to that.
24646b8e9a0SMichael Meeks {
24746b8e9a0SMichael Meeks     if (IsInlineEditEnabled())
248c9b4c568SStephan Bergmann         return;
24946b8e9a0SMichael Meeks 
25046b8e9a0SMichael Meeks     ESelection aNewSelection(GetSelection());
25146b8e9a0SMichael Meeks 
2528a8864aeSNoel Grandin     if (aNewSelection != aOldSelection)
25346b8e9a0SMichael Meeks     {
25446b8e9a0SMichael Meeks         SmViewShell *pView = rCmdBox.GetView();
25546b8e9a0SMichael Meeks         if (pView)
25646b8e9a0SMichael Meeks         {
25746b8e9a0SMichael Meeks             // get row and column to look for
2582af1f569SEike Rathke             sal_Int32  nRow;
2592af1f569SEike Rathke             sal_uInt16 nCol;
26046b8e9a0SMichael Meeks             SmGetLeftSelectionPart(aNewSelection, nRow, nCol);
26146b8e9a0SMichael Meeks             nRow++;
26246b8e9a0SMichael Meeks             nCol++;
2632af1f569SEike Rathke             pView->GetGraphicWindow().SetCursorPos(static_cast<sal_uInt16>(nRow), nCol);
26446b8e9a0SMichael Meeks             aOldSelection = aNewSelection;
26546b8e9a0SMichael Meeks         }
26646b8e9a0SMichael Meeks     }
267ea6399b8STobias Madl     aCursorMoveIdle.Stop();
26846b8e9a0SMichael Meeks }
26946b8e9a0SMichael Meeks 
270d7913668SJens-Heiner Rechtien void SmEditWindow::Resize()
271d7913668SJens-Heiner Rechtien {
2729bf928a7SThomas Lange     if (!pEditView)
2739bf928a7SThomas Lange         CreateEditView();
274d7913668SJens-Heiner Rechtien 
275d7913668SJens-Heiner Rechtien     if (pEditView)
276d7913668SJens-Heiner Rechtien     {
277d7913668SJens-Heiner Rechtien         pEditView->SetOutputArea(AdjustScrollBars());
278d7913668SJens-Heiner Rechtien         pEditView->ShowCursor();
279d7913668SJens-Heiner Rechtien 
28005830ca7SJacek Wolszczak         OSL_ENSURE( pEditView->GetEditEngine(), "EditEngine missing" );
281d7913668SJens-Heiner Rechtien         const long nMaxVisAreaStart = pEditView->GetEditEngine()->GetTextHeight() -
282d7913668SJens-Heiner Rechtien                                       pEditView->GetOutputArea().GetHeight();
283d7913668SJens-Heiner Rechtien         if (pEditView->GetVisArea().Top() > nMaxVisAreaStart)
284d7913668SJens-Heiner Rechtien         {
285a5a57130SMiklos Vajna             tools::Rectangle aVisArea(pEditView->GetVisArea() );
286bea7bbcaSNoel Grandin             aVisArea.SetTop( std::max<long>(nMaxVisAreaStart, 0) );
287d7913668SJens-Heiner Rechtien             aVisArea.SetSize(pEditView->GetOutputArea().GetSize());
288d7913668SJens-Heiner Rechtien             pEditView->SetVisArea(aVisArea);
289d7913668SJens-Heiner Rechtien             pEditView->ShowCursor();
290d7913668SJens-Heiner Rechtien         }
291d7913668SJens-Heiner Rechtien         InitScrollBars();
292d7913668SJens-Heiner Rechtien     }
293d7913668SJens-Heiner Rechtien     Invalidate();
294d7913668SJens-Heiner Rechtien }
295d7913668SJens-Heiner Rechtien 
296d7913668SJens-Heiner Rechtien void SmEditWindow::MouseButtonUp(const MouseEvent &rEvt)
297d7913668SJens-Heiner Rechtien {
298d7913668SJens-Heiner Rechtien     if (pEditView)
299d7913668SJens-Heiner Rechtien         pEditView->MouseButtonUp(rEvt);
300d7913668SJens-Heiner Rechtien     else
301d7913668SJens-Heiner Rechtien         Window::MouseButtonUp (rEvt);
302d7913668SJens-Heiner Rechtien 
30346b8e9a0SMichael Meeks     if (!IsInlineEditEnabled())
304ea6399b8STobias Madl         CursorMoveTimerHdl(&aCursorMoveIdle);
3055ed3fa4cSJens-Heiner Rechtien     InvalidateSlots();
306d7913668SJens-Heiner Rechtien }
307d7913668SJens-Heiner Rechtien 
308d7913668SJens-Heiner Rechtien void SmEditWindow::MouseButtonDown(const MouseEvent &rEvt)
309d7913668SJens-Heiner Rechtien {
310d7913668SJens-Heiner Rechtien     if (pEditView)
311d7913668SJens-Heiner Rechtien         pEditView->MouseButtonDown(rEvt);
312d7913668SJens-Heiner Rechtien     else
313d7913668SJens-Heiner Rechtien         Window::MouseButtonDown (rEvt);
314d7913668SJens-Heiner Rechtien 
315d7913668SJens-Heiner Rechtien     GrabFocus();
316d7913668SJens-Heiner Rechtien }
317d7913668SJens-Heiner Rechtien 
318d7913668SJens-Heiner Rechtien void SmEditWindow::Command(const CommandEvent& rCEvt)
319d7913668SJens-Heiner Rechtien {
3200321dbb9SCaolán McNamara     //pass alt press/release to parent impl
3210321dbb9SCaolán McNamara     if (rCEvt.GetCommand() == CommandEventId::ModKeyChange)
3220321dbb9SCaolán McNamara     {
3230321dbb9SCaolán McNamara         Window::Command(rCEvt);
3240321dbb9SCaolán McNamara         return;
3250321dbb9SCaolán McNamara     }
3260321dbb9SCaolán McNamara 
327a93c9517SAlexandre Fournier     bool bForwardEvt = true;
32882d68f9cSNoel Grandin     if (rCEvt.GetCommand() == CommandEventId::ContextMenu)
329d7913668SJens-Heiner Rechtien     {
330d7913668SJens-Heiner Rechtien         GetParent()->ToTop();
331d7913668SJens-Heiner Rechtien 
332e4eb9351SThomas Lange         Point aPoint = rCEvt.GetMousePosPixel();
3338da10652SMaxim Monastirsky         SmViewShell* pViewSh = rCmdBox.GetView();
3348da10652SMaxim Monastirsky         if (pViewSh)
3358da10652SMaxim Monastirsky             pViewSh->GetViewFrame()->GetDispatcher()->ExecutePopup("edit", this, &aPoint);
336a93c9517SAlexandre Fournier         bForwardEvt = false;
337d7913668SJens-Heiner Rechtien     }
33882d68f9cSNoel Grandin     else if (rCEvt.GetCommand() == CommandEventId::Wheel)
3395c419f39SJens-Heiner Rechtien         bForwardEvt = !HandleWheelCommands( rCEvt );
3405c419f39SJens-Heiner Rechtien 
3415c419f39SJens-Heiner Rechtien     if (bForwardEvt)
3425c419f39SJens-Heiner Rechtien     {
3435c419f39SJens-Heiner Rechtien         if (pEditView)
344d7913668SJens-Heiner Rechtien             pEditView->Command( rCEvt );
345d7913668SJens-Heiner Rechtien         else
346d7913668SJens-Heiner Rechtien             Window::Command (rCEvt);
347d7913668SJens-Heiner Rechtien     }
3485c419f39SJens-Heiner Rechtien }
3495c419f39SJens-Heiner Rechtien 
350a93c9517SAlexandre Fournier bool SmEditWindow::HandleWheelCommands( const CommandEvent &rCEvt )
3515c419f39SJens-Heiner Rechtien {
352a93c9517SAlexandre Fournier     bool bCommandHandled = false;    // true if the CommandEvent needs not
3535c419f39SJens-Heiner Rechtien                                     // to be passed on (because it has fully
3545c419f39SJens-Heiner Rechtien                                     // been taken care of).
3555c419f39SJens-Heiner Rechtien 
3565c419f39SJens-Heiner Rechtien     const CommandWheelData* pWData = rCEvt.GetWheelData();
3575c419f39SJens-Heiner Rechtien     if (pWData)
3585c419f39SJens-Heiner Rechtien     {
35972ce1368SNoel Grandin         if (CommandWheelMode::ZOOM == pWData->GetMode())
360a93c9517SAlexandre Fournier             bCommandHandled = true;     // no zooming in Command window
3615c419f39SJens-Heiner Rechtien         else
362950055bcSTakeshi Abe             bCommandHandled = HandleScrollCommand( rCEvt, pHScrollBar.get(), pVScrollBar.get());
3635c419f39SJens-Heiner Rechtien     }
3645c419f39SJens-Heiner Rechtien 
3655c419f39SJens-Heiner Rechtien     return bCommandHandled;
3665c419f39SJens-Heiner Rechtien }
3675c419f39SJens-Heiner Rechtien 
368d7913668SJens-Heiner Rechtien void SmEditWindow::KeyInput(const KeyEvent& rKEvt)
369d7913668SJens-Heiner Rechtien {
370d7913668SJens-Heiner Rechtien     if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
371d7913668SJens-Heiner Rechtien     {
372a93c9517SAlexandre Fournier         bool bCallBase = true;
373b9fc32f0SKurt Zenker         SfxViewShell* pViewShell = GetView();
374d977e02eSNoel Grandin         if ( dynamic_cast<const SmViewShell *>(pViewShell) )
375d7913668SJens-Heiner Rechtien         {
3762f755d64SKurt Zenker             // Terminate possible InPlace mode
3772f755d64SKurt Zenker             bCallBase = !pViewShell->Escape();
378d7913668SJens-Heiner Rechtien         }
379d7913668SJens-Heiner Rechtien         if ( bCallBase )
380d7913668SJens-Heiner Rechtien             Window::KeyInput( rKEvt );
381d7913668SJens-Heiner Rechtien     }
382d7913668SJens-Heiner Rechtien     else
383d7913668SJens-Heiner Rechtien     {
38446b8e9a0SMichael Meeks         StartCursorMove();
38546b8e9a0SMichael Meeks 
386f583a199SMarcos Paulo de Souza         bool autoClose = false;
3875bd3a42bSCaolán McNamara         if (!pEditView)
3885bd3a42bSCaolán McNamara             CreateEditView();
389f583a199SMarcos Paulo de Souza         ESelection aSelection = pEditView->GetSelection();
3901dd68617SMarcos Paulo de Souza         // as we don't support RTL in Math, we need to swap values from selection when they were done
3911dd68617SMarcos Paulo de Souza         // in RTL form
3921dd68617SMarcos Paulo de Souza         aSelection.Adjust();
393f583a199SMarcos Paulo de Souza         OUString selected = pEditView->GetEditEngine()->GetText(aSelection);
394f583a199SMarcos Paulo de Souza 
395e2bfbfcbSMarcos Paulo de Souza         // Check is auto close brackets/braces is disabled
396e2bfbfcbSMarcos Paulo de Souza         SmModule *pMod = SM_MOD();
397e2bfbfcbSMarcos Paulo de Souza         if (pMod && !pMod->GetConfig()->IsAutoCloseBrackets())
398e2bfbfcbSMarcos Paulo de Souza             autoClose = false;
399e2bfbfcbSMarcos Paulo de Souza         else if (selected.trim() == "<?>")
400f583a199SMarcos Paulo de Souza             autoClose = true;
4012ebe64baSMarcos Paulo de Souza         else if (selected.isEmpty() && !aSelection.HasRange())
4022ebe64baSMarcos Paulo de Souza         {
4032ebe64baSMarcos Paulo de Souza             selected = pEditView->GetEditEngine()->GetText(aSelection.nEndPara);
4042ebe64baSMarcos Paulo de Souza             if (!selected.isEmpty())
4052ebe64baSMarcos Paulo de Souza             {
4062ebe64baSMarcos Paulo de Souza                 sal_Int32 index = selected.indexOf("\n", aSelection.nEndPos);
4072ebe64baSMarcos Paulo de Souza                 if (index != -1)
4082ebe64baSMarcos Paulo de Souza                 {
4097be74f1bSCaolán McNamara                     selected = selected.copy(index, sal_Int32(aSelection.nEndPos-index));
4102ebe64baSMarcos Paulo de Souza                     if (selected.trim().isEmpty())
4112ebe64baSMarcos Paulo de Souza                         autoClose = true;
4122ebe64baSMarcos Paulo de Souza                 }
4132ebe64baSMarcos Paulo de Souza                 else
4142ebe64baSMarcos Paulo de Souza                 {
4152ebe64baSMarcos Paulo de Souza                     sal_Int32 length = selected.getLength();
4162ebe64baSMarcos Paulo de Souza                     if (aSelection.nEndPos == length)
4172ebe64baSMarcos Paulo de Souza                         autoClose = true;
4182ebe64baSMarcos Paulo de Souza                     else
4192ebe64baSMarcos Paulo de Souza                     {
4207be74f1bSCaolán McNamara                         selected = selected.copy(aSelection.nEndPos);
4212ebe64baSMarcos Paulo de Souza                         if (selected.trim().isEmpty())
4222ebe64baSMarcos Paulo de Souza                             autoClose = true;
4232ebe64baSMarcos Paulo de Souza                     }
4242ebe64baSMarcos Paulo de Souza                 }
4252ebe64baSMarcos Paulo de Souza             }
4262ebe64baSMarcos Paulo de Souza             else
4272ebe64baSMarcos Paulo de Souza                 autoClose = true;
4282ebe64baSMarcos Paulo de Souza         }
429f583a199SMarcos Paulo de Souza 
430d7913668SJens-Heiner Rechtien         if ( !pEditView->PostKeyEvent(rKEvt) )
431d7913668SJens-Heiner Rechtien         {
432b9fc32f0SKurt Zenker             SmViewShell *pView = GetView();
433b9fc32f0SKurt Zenker             if ( pView && !pView->KeyInput(rKEvt) )
434d7913668SJens-Heiner Rechtien             {
43572778119SAlexander Wilms                 // F1 (help) leads to the destruction of this
436d7913668SJens-Heiner Rechtien                 Flush();
437ea6399b8STobias Madl                 if ( aModifyIdle.IsActive() )
438ea6399b8STobias Madl                     aModifyIdle.Stop();
439d7913668SJens-Heiner Rechtien                 Window::KeyInput(rKEvt);
440d7913668SJens-Heiner Rechtien             }
441d7913668SJens-Heiner Rechtien             else
442d7913668SJens-Heiner Rechtien             {
44372778119SAlexander Wilms                 // SFX has maybe called a slot of the view and thus (because of a hack in SFX)
44472778119SAlexander Wilms                 // set the focus to the view
445b9fc32f0SKurt Zenker                 SfxViewShell* pVShell = GetView();
446d977e02eSNoel Grandin                 if ( dynamic_cast<const SmViewShell *>(pVShell) &&
4470b30d534SNoel Grandin                      static_cast<SmViewShell*>(pVShell)->GetGraphicWindow().HasFocus() )
448d7913668SJens-Heiner Rechtien                 {
449d7913668SJens-Heiner Rechtien                     GrabFocus();
450d7913668SJens-Heiner Rechtien                 }
451d7913668SJens-Heiner Rechtien             }
452d7913668SJens-Heiner Rechtien         }
453d7913668SJens-Heiner Rechtien         else
45412d8b062SThomas Lange         {
45512d8b062SThomas Lange             // have doc-shell modified only for formula input/change and not
45612d8b062SThomas Lange             // cursor travelling and such things...
45712d8b062SThomas Lange             SmDocShell *pDocShell = GetDoc();
458c39a664fSCaolán McNamara             EditEngine *pEditEngine = GetEditEngine();
459c39a664fSCaolán McNamara             if (pDocShell && pEditEngine)
460c39a664fSCaolán McNamara                 pDocShell->SetModified(pEditEngine->IsModified());
461ea6399b8STobias Madl             aModifyIdle.Start();
462d7913668SJens-Heiner Rechtien         }
4635ed3fa4cSJens-Heiner Rechtien 
464d12980ceSMarcos Paulo de Souza         // get the current char of the key event
4658d9b429eSTomaž Vajngerl         sal_Unicode cCharCode = rKEvt.GetCharCode();
4668d9b429eSTomaž Vajngerl         OUString sClose;
467d12980ceSMarcos Paulo de Souza 
4688d9b429eSTomaž Vajngerl         if (cCharCode == '{')
4698d9b429eSTomaž Vajngerl             sClose = "  }";
4708d9b429eSTomaž Vajngerl         else if (cCharCode == '[')
4718d9b429eSTomaž Vajngerl             sClose = "  ]";
4728d9b429eSTomaž Vajngerl         else if (cCharCode == '(')
4738d9b429eSTomaž Vajngerl             sClose = "  )";
474d12980ceSMarcos Paulo de Souza 
475f583a199SMarcos Paulo de Souza         // auto close the current character only when needed
4768d9b429eSTomaž Vajngerl         if (!sClose.isEmpty() && autoClose)
477d12980ceSMarcos Paulo de Souza         {
4788d9b429eSTomaž Vajngerl             pEditView->InsertText(sClose);
479d12980ceSMarcos Paulo de Souza             // position it at center of brackets
480f583a199SMarcos Paulo de Souza             aSelection.nStartPos += 2;
481f583a199SMarcos Paulo de Souza             aSelection.nEndPos = aSelection.nStartPos;
482d12980ceSMarcos Paulo de Souza             pEditView->SetSelection(aSelection);
483d12980ceSMarcos Paulo de Souza         }
484d12980ceSMarcos Paulo de Souza 
4855ed3fa4cSJens-Heiner Rechtien         InvalidateSlots();
486d7913668SJens-Heiner Rechtien     }
48712d8b062SThomas Lange }
488d7913668SJens-Heiner Rechtien 
489a5a57130SMiklos Vajna void SmEditWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect)
490d7913668SJens-Heiner Rechtien {
4919bf928a7SThomas Lange     if (!pEditView)
4929bf928a7SThomas Lange         CreateEditView();
4938d9b429eSTomaž Vajngerl     pEditView->Paint(rRect, &rRenderContext);
494d7913668SJens-Heiner Rechtien }
495d7913668SJens-Heiner Rechtien 
4969bf928a7SThomas Lange void SmEditWindow::CreateEditView()
497d7913668SJens-Heiner Rechtien {
498eb9b8aaaSThomas Lange     EditEngine *pEditEngine = GetEditEngine();
499c134ddccSThomas Lange 
500c134ddccSThomas Lange     //! pEditEngine and pEditView may be 0.
501c134ddccSThomas Lange     //! For example when the program is used by the document-converter
5028a722c08SNoel Grandin     if (pEditView || !pEditEngine)
5038a722c08SNoel Grandin         return;
5048a722c08SNoel Grandin 
505950055bcSTakeshi Abe     pEditView.reset(new EditView(pEditEngine, this));
506950055bcSTakeshi Abe     pEditEngine->InsertView( pEditView.get() );
507d7913668SJens-Heiner Rechtien 
508eb9b8aaaSThomas Lange     if (!pVScrollBar)
5095be108eeSMichael Meeks         pVScrollBar = VclPtr<ScrollBar>::Create(this, WinBits(WB_VSCROLL));
510eb9b8aaaSThomas Lange     if (!pHScrollBar)
5115be108eeSMichael Meeks         pHScrollBar = VclPtr<ScrollBar>::Create(this, WinBits(WB_HSCROLL));
512eb9b8aaaSThomas Lange     if (!pScrollBox)
5135be108eeSMichael Meeks         pScrollBox  = VclPtr<ScrollBarBox>::Create(this);
514d7913668SJens-Heiner Rechtien     pVScrollBar->SetScrollHdl(LINK(this, SmEditWindow, ScrollHdl));
515d7913668SJens-Heiner Rechtien     pHScrollBar->SetScrollHdl(LINK(this, SmEditWindow, ScrollHdl));
5167d769f9dSNoel Grandin     pVScrollBar->EnableDrag();
5177d769f9dSNoel Grandin     pHScrollBar->EnableDrag();
518d7913668SJens-Heiner Rechtien 
519d7913668SJens-Heiner Rechtien     pEditView->SetOutputArea(AdjustScrollBars());
520d7913668SJens-Heiner Rechtien 
521d7913668SJens-Heiner Rechtien     ESelection eSelection;
522d7913668SJens-Heiner Rechtien 
523d7913668SJens-Heiner Rechtien     pEditView->SetSelection(eSelection);
524*be53f326SNoel Grandin     PaintImmediately();
525ae03847cSStephan Bergmann     pEditView->ShowCursor();
526d7913668SJens-Heiner Rechtien 
527d7913668SJens-Heiner Rechtien     pEditEngine->SetStatusEventHdl( LINK(this, SmEditWindow, EditStatusHdl) );
528d7913668SJens-Heiner Rechtien     SetPointer(pEditView->GetPointer());
529d7913668SJens-Heiner Rechtien 
530d7913668SJens-Heiner Rechtien     SetScrollBarRanges();
531d7913668SJens-Heiner Rechtien }
532d7913668SJens-Heiner Rechtien 
5339bf928a7SThomas Lange 
534106ea872SStephan Bergmann IMPL_LINK_NOARG( SmEditWindow, EditStatusHdl, EditStatus&, void )
535d7913668SJens-Heiner Rechtien {
53669a06ca6SNoel Grandin     if (pEditView)
537a21cb490SIvo Hinkelmann         Resize();
538d7913668SJens-Heiner Rechtien }
539d7913668SJens-Heiner Rechtien 
540106ea872SStephan Bergmann IMPL_LINK( SmEditWindow, ScrollHdl, ScrollBar *, /*pScrollBar*/, void )
541d7913668SJens-Heiner Rechtien {
54205830ca7SJacek Wolszczak     OSL_ENSURE(pEditView, "EditView missing");
54325af6a72SThomas Lange     if (pEditView)
54425af6a72SThomas Lange     {
545a5a57130SMiklos Vajna         pEditView->SetVisArea(tools::Rectangle(Point(pHScrollBar->GetThumbPos(),
546d7913668SJens-Heiner Rechtien                                             pVScrollBar->GetThumbPos()),
547d7913668SJens-Heiner Rechtien                                         pEditView->GetVisArea().GetSize()));
548d7913668SJens-Heiner Rechtien         pEditView->Invalidate();
54925af6a72SThomas Lange     }
550d7913668SJens-Heiner Rechtien }
551d7913668SJens-Heiner Rechtien 
552a5a57130SMiklos Vajna tools::Rectangle SmEditWindow::AdjustScrollBars()
553d7913668SJens-Heiner Rechtien {
554d7913668SJens-Heiner Rechtien     const Size aOut( GetOutputSizePixel() );
55508ab1f46SNoel Grandin     tools::Rectangle aRect( Point(), aOut );
556d7913668SJens-Heiner Rechtien 
5579bf928a7SThomas Lange     if (pVScrollBar && pHScrollBar && pScrollBox)
558d7913668SJens-Heiner Rechtien     {
559d7913668SJens-Heiner Rechtien         const long nTmp = GetSettings().GetStyleSettings().GetScrollBarSize();
560bea7bbcaSNoel Grandin         Point aPt( aRect.TopRight() ); aPt.AdjustX( -(nTmp -1) );
561d7913668SJens-Heiner Rechtien         pVScrollBar->SetPosSizePixel( aPt, Size(nTmp, aOut.Height() - nTmp));
562d7913668SJens-Heiner Rechtien 
563bea7bbcaSNoel Grandin         aPt = aRect.BottomLeft(); aPt.AdjustY( -(nTmp - 1) );
564d7913668SJens-Heiner Rechtien         pHScrollBar->SetPosSizePixel( aPt, Size(aOut.Width() - nTmp, nTmp));
565d7913668SJens-Heiner Rechtien 
566bea7bbcaSNoel Grandin         aPt.setX( pHScrollBar->GetSizePixel().Width() );
567bea7bbcaSNoel Grandin         aPt.setY( pVScrollBar->GetSizePixel().Height() );
568d7913668SJens-Heiner Rechtien         pScrollBox->SetPosSizePixel(aPt, Size(nTmp, nTmp ));
569d7913668SJens-Heiner Rechtien 
570bea7bbcaSNoel Grandin         aRect.SetRight( aPt.X() - 2 );
571bea7bbcaSNoel Grandin         aRect.SetBottom( aPt.Y() - 2 );
572d7913668SJens-Heiner Rechtien     }
573d7913668SJens-Heiner Rechtien     return aRect;
574d7913668SJens-Heiner Rechtien }
575d7913668SJens-Heiner Rechtien 
576d7913668SJens-Heiner Rechtien void SmEditWindow::SetScrollBarRanges()
577d7913668SJens-Heiner Rechtien {
57872778119SAlexander Wilms     // Extra method, not InitScrollBars, since it's also being used for EditEngine events
579eb9b8aaaSThomas Lange     EditEngine *pEditEngine = GetEditEngine();
5809bf928a7SThomas Lange     if (pVScrollBar && pHScrollBar && pEditEngine && pEditView)
581d7913668SJens-Heiner Rechtien     {
582d7913668SJens-Heiner Rechtien         long nTmp = pEditEngine->GetTextHeight();
583d7913668SJens-Heiner Rechtien         pVScrollBar->SetRange(Range(0, nTmp));
584d7913668SJens-Heiner Rechtien         pVScrollBar->SetThumbPos(pEditView->GetVisArea().Top());
585d7913668SJens-Heiner Rechtien 
586d7913668SJens-Heiner Rechtien         nTmp = pEditEngine->GetPaperSize().Width();
587d7913668SJens-Heiner Rechtien         pHScrollBar->SetRange(Range(0,nTmp));
588d7913668SJens-Heiner Rechtien         pHScrollBar->SetThumbPos(pEditView->GetVisArea().Left());
589d7913668SJens-Heiner Rechtien     }
590d7913668SJens-Heiner Rechtien }
591d7913668SJens-Heiner Rechtien 
592d7913668SJens-Heiner Rechtien void SmEditWindow::InitScrollBars()
593d7913668SJens-Heiner Rechtien {
5948a722c08SNoel Grandin     if (!(pVScrollBar && pHScrollBar && pScrollBox && pEditView))
5958a722c08SNoel Grandin         return;
5968a722c08SNoel Grandin 
597d7913668SJens-Heiner Rechtien     const Size aOut( pEditView->GetOutputArea().GetSize() );
598d7913668SJens-Heiner Rechtien     pVScrollBar->SetVisibleSize(aOut.Height());
599d7913668SJens-Heiner Rechtien     pVScrollBar->SetPageSize(aOut.Height() * 8 / 10);
600d7913668SJens-Heiner Rechtien     pVScrollBar->SetLineSize(aOut.Height() * 2 / 10);
601d7913668SJens-Heiner Rechtien 
602d7913668SJens-Heiner Rechtien     pHScrollBar->SetVisibleSize(aOut.Width());
603d7913668SJens-Heiner Rechtien     pHScrollBar->SetPageSize(aOut.Width() * 8 / 10);
604d7913668SJens-Heiner Rechtien     pHScrollBar->SetLineSize(SCROLL_LINE );
605d7913668SJens-Heiner Rechtien 
606d7913668SJens-Heiner Rechtien     SetScrollBarRanges();
607d7913668SJens-Heiner Rechtien 
608d7913668SJens-Heiner Rechtien     pVScrollBar->Show();
609d7913668SJens-Heiner Rechtien     pHScrollBar->Show();
610d7913668SJens-Heiner Rechtien     pScrollBox->Show();
611d7913668SJens-Heiner Rechtien }
612d7913668SJens-Heiner Rechtien 
6139bf928a7SThomas Lange 
614e3f11c10SChr. Rossmanith OUString SmEditWindow::GetText() const
615d7913668SJens-Heiner Rechtien {
6169a0d753bSThomas Arnhold     OUString aText;
617e59e7f42SVladimir Glazounov     EditEngine *pEditEngine = const_cast< SmEditWindow* >(this)->GetEditEngine();
61805830ca7SJacek Wolszczak     OSL_ENSURE( pEditEngine, "EditEngine missing" );
6199bf928a7SThomas Lange     if (pEditEngine)
620df7390e6SStephan Bergmann         aText = pEditEngine->GetText();
621d7913668SJens-Heiner Rechtien     return aText;
622d7913668SJens-Heiner Rechtien }
623d7913668SJens-Heiner Rechtien 
6249bf928a7SThomas Lange 
625e3f11c10SChr. Rossmanith void SmEditWindow::SetText(const OUString& rText)
626d7913668SJens-Heiner Rechtien {
627eb9b8aaaSThomas Lange     EditEngine *pEditEngine = GetEditEngine();
62805830ca7SJacek Wolszczak     OSL_ENSURE( pEditEngine, "EditEngine missing" );
6298a722c08SNoel Grandin     if (!pEditEngine || pEditEngine->IsModified())
6308a722c08SNoel Grandin         return;
6318a722c08SNoel Grandin 
6329bf928a7SThomas Lange     if (!pEditView)
6339bf928a7SThomas Lange         CreateEditView();
6349bf928a7SThomas Lange 
635d7913668SJens-Heiner Rechtien     ESelection eSelection = pEditView->GetSelection();
636d7913668SJens-Heiner Rechtien 
637d7913668SJens-Heiner Rechtien     pEditEngine->SetText(rText);
638d7913668SJens-Heiner Rechtien     pEditEngine->ClearModifyFlag();
639d7913668SJens-Heiner Rechtien 
64072778119SAlexander Wilms     // Restarting the timer here, prevents calling the handlers for other (currently inactive)
64172778119SAlexander Wilms     // math tasks
642ea6399b8STobias Madl     aModifyIdle.Start();
643d7913668SJens-Heiner Rechtien 
644d7913668SJens-Heiner Rechtien     pEditView->SetSelection(eSelection);
645d7913668SJens-Heiner Rechtien }
646d7913668SJens-Heiner Rechtien 
6479bf928a7SThomas Lange 
6489bf928a7SThomas Lange void SmEditWindow::GetFocus()
6499bf928a7SThomas Lange {
6509bf928a7SThomas Lange     Window::GetFocus();
6519bf928a7SThomas Lange 
6528c5471c3STakeshi Abe     if (mxAccessible.is())
653e716420fSThomas Lange     {
654e716420fSThomas Lange         // Note: will implicitly send the AccessibleStateType::FOCUSED event
6558c5471c3STakeshi Abe         ::accessibility::AccessibleTextHelper *pHelper = mxAccessible->GetTextHelper();
656e716420fSThomas Lange         if (pHelper)
6577d769f9dSNoel Grandin             pHelper->SetFocus();
658e716420fSThomas Lange     }
659e716420fSThomas Lange 
6602c592459SThomas Lange     if (!pEditView)
6612c592459SThomas Lange          CreateEditView();
662eb9b8aaaSThomas Lange     EditEngine *pEditEngine = GetEditEngine();
6639bf928a7SThomas Lange     if (pEditEngine)
6649bf928a7SThomas Lange         pEditEngine->SetStatusEventHdl( LINK(this, SmEditWindow, EditStatusHdl) );
6658c340c42SJonas Finnemann Jensen 
6668c340c42SJonas Finnemann Jensen     //Let SmViewShell know we got focus
66746b8e9a0SMichael Meeks     if(GetView() && IsInlineEditEnabled())
668069d71b7SNoel Grandin         GetView()->SetInsertIntoEditWindow(true);
6699bf928a7SThomas Lange }
6709bf928a7SThomas Lange 
6719bf928a7SThomas Lange 
6729bf928a7SThomas Lange void SmEditWindow::LoseFocus()
6739bf928a7SThomas Lange {
674eb9b8aaaSThomas Lange     EditEngine *pEditEngine = GetEditEngine();
6759bf928a7SThomas Lange     if (pEditEngine)
67669a06ca6SNoel Grandin         pEditEngine->SetStatusEventHdl( Link<EditStatus&,void>() );
6779bf928a7SThomas Lange 
6789bf928a7SThomas Lange     Window::LoseFocus();
679e716420fSThomas Lange 
6808c5471c3STakeshi Abe     if (mxAccessible.is())
681e716420fSThomas Lange     {
682e716420fSThomas Lange         // Note: will implicitly send the AccessibleStateType::FOCUSED event
6838c5471c3STakeshi Abe         ::accessibility::AccessibleTextHelper *pHelper = mxAccessible->GetTextHelper();
684e716420fSThomas Lange         if (pHelper)
68513adadeeSAriel Constenla-Haile             pHelper->SetFocus(false);
686e716420fSThomas Lange     }
6879bf928a7SThomas Lange }
6889bf928a7SThomas Lange 
6899bf928a7SThomas Lange 
690a93c9517SAlexandre Fournier bool SmEditWindow::IsAllSelected() const
691d7913668SJens-Heiner Rechtien {
692a93c9517SAlexandre Fournier     bool bRes = false;
6937aa7f4d9SNoel Grandin     EditEngine *pEditEngine = const_cast<SmEditWindow *>(this)->GetEditEngine();
69405830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "NULL pointer" );
69505830ca7SJacek Wolszczak     OSL_ENSURE( pEditEngine, "NULL pointer" );
696f9bb4aa0SThomas Lange     if (pEditEngine  &&  pEditView)
697f9bb4aa0SThomas Lange     {
698f9bb4aa0SThomas Lange         ESelection eSelection( pEditView->GetSelection() );
69980731dbfSCarsten Driesner         sal_Int32 nParaCnt = pEditEngine->GetParagraphCount();
7009bf928a7SThomas Lange         if (!(nParaCnt - 1))
701d7913668SJens-Heiner Rechtien         {
702df7390e6SStephan Bergmann             sal_Int32 nTextLen = pEditEngine->GetText().getLength();
703939d6400SIvan Timofeev             bRes = !eSelection.nStartPos && (eSelection.nEndPos == nTextLen - 1);
704d7913668SJens-Heiner Rechtien         }
705d7913668SJens-Heiner Rechtien         else
7069bf928a7SThomas Lange         {
707f9bb4aa0SThomas Lange             bRes = !eSelection.nStartPara && (eSelection.nEndPara == nParaCnt - 1);
7089bf928a7SThomas Lange         }
709d7913668SJens-Heiner Rechtien     }
710f9bb4aa0SThomas Lange     return bRes;
711f9bb4aa0SThomas Lange }
712d7913668SJens-Heiner Rechtien 
713d7913668SJens-Heiner Rechtien void SmEditWindow::SelectAll()
714d7913668SJens-Heiner Rechtien {
71505830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "NULL pointer" );
7169bf928a7SThomas Lange     if (pEditView)
7179bf928a7SThomas Lange     {
7182af1f569SEike Rathke         // ALL as last two parameters refers to the end of the text
7192af1f569SEike Rathke         pEditView->SetSelection( ESelection( 0, 0, EE_PARA_ALL, EE_TEXTPOS_ALL ) );
720d7913668SJens-Heiner Rechtien     }
7219bf928a7SThomas Lange }
722d7913668SJens-Heiner Rechtien 
723d7913668SJens-Heiner Rechtien void SmEditWindow::MarkError(const Point &rPos)
724d7913668SJens-Heiner Rechtien {
72505830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "EditView missing" );
72625af6a72SThomas Lange     if (pEditView)
72725af6a72SThomas Lange     {
7286f135b0aSThomas Arnhold         const sal_uInt16        nCol = sal::static_int_cast< sal_uInt16 >(rPos.X());
72980731dbfSCarsten Driesner         const sal_uInt16        nRow = sal::static_int_cast< sal_uInt16 >(rPos.Y() - 1);
730d7913668SJens-Heiner Rechtien 
731e59e7f42SVladimir Glazounov         pEditView->SetSelection(ESelection(nRow, nCol - 1, nRow, nCol));
732d7913668SJens-Heiner Rechtien         GrabFocus();
733d7913668SJens-Heiner Rechtien     }
73425af6a72SThomas Lange }
735d7913668SJens-Heiner Rechtien 
736467d5e0aSMarcos Paulo de Souza // Makes selection to next <?> symbol
737d7913668SJens-Heiner Rechtien void SmEditWindow::SelNextMark()
738d7913668SJens-Heiner Rechtien {
739f9bb4aa0SThomas Lange     EditEngine *pEditEngine = GetEditEngine();
74005830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "NULL pointer" );
74105830ca7SJacek Wolszczak     OSL_ENSURE( pEditEngine, "NULL pointer" );
7428a722c08SNoel Grandin     if (!pEditEngine || !pEditView)
7438a722c08SNoel Grandin         return;
7448a722c08SNoel Grandin 
745d7913668SJens-Heiner Rechtien     ESelection eSelection = pEditView->GetSelection();
746939d6400SIvan Timofeev     sal_Int32 nPos = eSelection.nEndPos;
7472af1f569SEike Rathke     sal_Int32 nCounts = pEditEngine->GetParagraphCount();
748d7913668SJens-Heiner Rechtien 
749d7913668SJens-Heiner Rechtien     while (eSelection.nEndPara < nCounts)
750d7913668SJens-Heiner Rechtien     {
751939d6400SIvan Timofeev         OUString aText = pEditEngine->GetText(eSelection.nEndPara);
752939d6400SIvan Timofeev         nPos = aText.indexOf("<?>", nPos);
753939d6400SIvan Timofeev         if (nPos != -1)
754d7913668SJens-Heiner Rechtien         {
755939d6400SIvan Timofeev             pEditView->SetSelection(ESelection(
756939d6400SIvan Timofeev                 eSelection.nEndPara, nPos, eSelection.nEndPara, nPos + 3));
757d7913668SJens-Heiner Rechtien             break;
758d7913668SJens-Heiner Rechtien         }
759d7913668SJens-Heiner Rechtien 
760939d6400SIvan Timofeev         nPos = 0;
761d7913668SJens-Heiner Rechtien         eSelection.nEndPara++;
762d7913668SJens-Heiner Rechtien     }
763d7913668SJens-Heiner Rechtien }
764d7913668SJens-Heiner Rechtien 
765d7913668SJens-Heiner Rechtien void SmEditWindow::SelPrevMark()
766d7913668SJens-Heiner Rechtien {
767f9bb4aa0SThomas Lange     EditEngine *pEditEngine = GetEditEngine();
76805830ca7SJacek Wolszczak     OSL_ENSURE( pEditEngine, "NULL pointer" );
76905830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "NULL pointer" );
7708a722c08SNoel Grandin     if (!(pEditEngine  &&  pEditView))
7718a722c08SNoel Grandin         return;
7728a722c08SNoel Grandin 
773d7913668SJens-Heiner Rechtien     ESelection eSelection = pEditView->GetSelection();
7743efdd925STakeshi Abe     sal_Int32 nPara = eSelection.nStartPara;
775939d6400SIvan Timofeev     sal_Int32 nMax = eSelection.nStartPos;
7763efdd925STakeshi Abe     OUString aText(pEditEngine->GetText(nPara));
7773efdd925STakeshi Abe     const OUString aMark("<?>");
7783efdd925STakeshi Abe     sal_Int32 nPos;
779d7913668SJens-Heiner Rechtien 
7803efdd925STakeshi Abe     while ( (nPos = aText.lastIndexOf(aMark, nMax)) < 0 )
781d7913668SJens-Heiner Rechtien     {
7823efdd925STakeshi Abe         if (--nPara < 0)
7833efdd925STakeshi Abe             return;
7843efdd925STakeshi Abe         aText = pEditEngine->GetText(nPara);
785939d6400SIvan Timofeev         nMax = aText.getLength();
786d7913668SJens-Heiner Rechtien     }
7873efdd925STakeshi Abe     pEditView->SetSelection(ESelection(nPara, nPos, nPara, nPos + 3));
788d7913668SJens-Heiner Rechtien }
789d7913668SJens-Heiner Rechtien 
7900a442d38SNoel Grandin bool SmEditWindow::HasMark(const OUString& rText)
79152ef15cbSStephan Bergmann     // returns true iff 'rText' contains a mark
792d7913668SJens-Heiner Rechtien {
793939d6400SIvan Timofeev     return rText.indexOf("<?>") != -1;
794d7913668SJens-Heiner Rechtien }
795d7913668SJens-Heiner Rechtien 
796d7913668SJens-Heiner Rechtien void SmEditWindow::MouseMove(const MouseEvent &rEvt)
797d7913668SJens-Heiner Rechtien {
7989bf928a7SThomas Lange     if (pEditView)
7999bf928a7SThomas Lange         pEditView->MouseMove(rEvt);
800d7913668SJens-Heiner Rechtien }
801d7913668SJens-Heiner Rechtien 
802e59e7f42SVladimir Glazounov sal_Int8 SmEditWindow::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
803d7913668SJens-Heiner Rechtien {
8048cb61cbbSCaolán McNamara     return DND_ACTION_NONE;
805d7913668SJens-Heiner Rechtien }
806d7913668SJens-Heiner Rechtien 
807e59e7f42SVladimir Glazounov sal_Int8 SmEditWindow::ExecuteDrop( const ExecuteDropEvent& /*rEvt*/ )
808d7913668SJens-Heiner Rechtien {
8098cb61cbbSCaolán McNamara     return DND_ACTION_NONE;
810d7913668SJens-Heiner Rechtien }
811d7913668SJens-Heiner Rechtien 
812d7913668SJens-Heiner Rechtien ESelection SmEditWindow::GetSelection() const
813d7913668SJens-Heiner Rechtien {
8148de8c856SThomas Lange     // pointer may be 0 when reloading a document and the old view
8158de8c856SThomas Lange     // was already destroyed
81605830ca7SJacek Wolszczak     //(OSL_ENSURE( pEditView, "NULL pointer" );
8179bf928a7SThomas Lange     ESelection eSel;
8189bf928a7SThomas Lange     if (pEditView)
8199bf928a7SThomas Lange         eSel = pEditView->GetSelection();
8209bf928a7SThomas Lange     return eSel;
821d7913668SJens-Heiner Rechtien }
822d7913668SJens-Heiner Rechtien 
823d7913668SJens-Heiner Rechtien void SmEditWindow::SetSelection(const ESelection &rSel)
824d7913668SJens-Heiner Rechtien {
82505830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "NULL pointer" );
82625af6a72SThomas Lange     if (pEditView)
827d7913668SJens-Heiner Rechtien         pEditView->SetSelection(rSel);
8285ed3fa4cSJens-Heiner Rechtien     InvalidateSlots();
829d7913668SJens-Heiner Rechtien }
830d7913668SJens-Heiner Rechtien 
831a93c9517SAlexandre Fournier bool SmEditWindow::IsEmpty() const
832d7913668SJens-Heiner Rechtien {
8337aa7f4d9SNoel Grandin     EditEngine *pEditEngine = const_cast<SmEditWindow *>(this)->GetEditEngine();
8344f9b2124SNoel Grandin     bool bEmpty = ( pEditEngine && pEditEngine->GetTextLen() == 0 );
835e59e7f42SVladimir Glazounov     return bEmpty;
836d7913668SJens-Heiner Rechtien }
837d7913668SJens-Heiner Rechtien 
838a93c9517SAlexandre Fournier bool SmEditWindow::IsSelected() const
839d7913668SJens-Heiner Rechtien {
8404f9b2124SNoel Grandin     return pEditView && pEditView->HasSelection();
841d7913668SJens-Heiner Rechtien }
842d7913668SJens-Heiner Rechtien 
84313adadeeSAriel Constenla-Haile 
84413adadeeSAriel Constenla-Haile void SmEditWindow::UpdateStatus( bool bSetDocModified )
84513adadeeSAriel Constenla-Haile {
84613adadeeSAriel Constenla-Haile     SmModule *pMod = SM_MOD();
84713adadeeSAriel Constenla-Haile     if (pMod && pMod->GetConfig()->IsAutoRedraw())
84813adadeeSAriel Constenla-Haile         Flush();
84913adadeeSAriel Constenla-Haile     if ( bSetDocModified )
850938821fbSNoel Grandin         GetDoc()->SetModified();
85113adadeeSAriel Constenla-Haile }
85213adadeeSAriel Constenla-Haile 
853d7913668SJens-Heiner Rechtien void SmEditWindow::Cut()
854d7913668SJens-Heiner Rechtien {
85505830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "EditView missing" );
85625af6a72SThomas Lange     if (pEditView)
85727da46a0SThomas Lange [tl]     {
858d7913668SJens-Heiner Rechtien         pEditView->Cut();
85913adadeeSAriel Constenla-Haile         UpdateStatus(true);
86027da46a0SThomas Lange [tl]     }
861d7913668SJens-Heiner Rechtien }
862d7913668SJens-Heiner Rechtien 
863d7913668SJens-Heiner Rechtien void SmEditWindow::Copy()
864d7913668SJens-Heiner Rechtien {
86505830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "EditView missing" );
86625af6a72SThomas Lange     if (pEditView)
867d7913668SJens-Heiner Rechtien         pEditView->Copy();
868d7913668SJens-Heiner Rechtien }
869d7913668SJens-Heiner Rechtien 
870d7913668SJens-Heiner Rechtien void SmEditWindow::Paste()
871d7913668SJens-Heiner Rechtien {
87205830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "EditView missing" );
87325af6a72SThomas Lange     if (pEditView)
87427da46a0SThomas Lange [tl]     {
875d7913668SJens-Heiner Rechtien         pEditView->Paste();
87613adadeeSAriel Constenla-Haile         UpdateStatus(true);
87727da46a0SThomas Lange [tl]     }
878d7913668SJens-Heiner Rechtien }
879d7913668SJens-Heiner Rechtien 
880d7913668SJens-Heiner Rechtien void SmEditWindow::Delete()
881d7913668SJens-Heiner Rechtien {
88205830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "EditView missing" );
88325af6a72SThomas Lange     if (pEditView)
88427da46a0SThomas Lange [tl]     {
885d7913668SJens-Heiner Rechtien         pEditView->DeleteSelected();
88613adadeeSAriel Constenla-Haile         UpdateStatus(true);
88727da46a0SThomas Lange [tl]     }
888d7913668SJens-Heiner Rechtien }
889d7913668SJens-Heiner Rechtien 
89086b9e14bSIvan Timofeev void SmEditWindow::InsertText(const OUString& rText)
891d7913668SJens-Heiner Rechtien {
89205830ca7SJacek Wolszczak     OSL_ENSURE( pEditView, "EditView missing" );
8938a722c08SNoel Grandin     if (!pEditView)
8948a722c08SNoel Grandin         return;
8958a722c08SNoel Grandin 
896356b2f0eSMichael Duelli     // Note: Insertion of a space in front of commands is done here and
897356b2f0eSMichael Duelli     // in SmEditWindow::InsertCommand.
898356b2f0eSMichael Duelli     ESelection aSelection = pEditView->GetSelection();
899356b2f0eSMichael Duelli     OUString aCurrentFormula = pEditView->GetEditEngine()->GetText();
900356b2f0eSMichael Duelli     sal_Int32 nStartIndex = 0;
901356b2f0eSMichael Duelli 
902356b2f0eSMichael Duelli     // get the start position (when we get a multi line formula)
903356b2f0eSMichael Duelli     for (sal_Int32 nParaPos = 0; nParaPos < aSelection.nStartPara; nParaPos++)
904356b2f0eSMichael Duelli          nStartIndex = aCurrentFormula.indexOf("\n", nStartIndex) + 1;
905356b2f0eSMichael Duelli 
906356b2f0eSMichael Duelli     nStartIndex += aSelection.nStartPos;
907356b2f0eSMichael Duelli 
9089e9693b9SMarcos Paulo de Souza     // TODO: unify this function with the InsertCommand: The do the same thing for different
9099e9693b9SMarcos Paulo de Souza     // callers
9109e9693b9SMarcos Paulo de Souza     OUString string(rText);
9119e9693b9SMarcos Paulo de Souza 
912fc47ee6fSMarcos Paulo de Souza     OUString selected(pEditView->GetSelected());
913fc47ee6fSMarcos Paulo de Souza     // if we have text selected, use it in the first placeholder
914fc47ee6fSMarcos Paulo de Souza     if (!selected.isEmpty())
915fc47ee6fSMarcos Paulo de Souza         string = string.replaceFirst("<?>", selected);
916fc47ee6fSMarcos Paulo de Souza 
917356b2f0eSMichael Duelli     // put a space before a new command if not in the beginning of a line
918356b2f0eSMichael Duelli     if (aSelection.nStartPos > 0 && aCurrentFormula[nStartIndex - 1] != ' ')
9199e9693b9SMarcos Paulo de Souza         string = " " + string;
9209e9693b9SMarcos Paulo de Souza 
92167311738SJosé Guilherme Vanz     /*
92267311738SJosé Guilherme Vanz       fdo#65588 -  Elements Dock: Scrollbar moves into input window
92367311738SJosé Guilherme Vanz       This change "solves" the visual problem. But I don't think so
92467311738SJosé Guilherme Vanz       this is the best solution.
92567311738SJosé Guilherme Vanz     */
92667311738SJosé Guilherme Vanz     pVScrollBar->Hide();
92767311738SJosé Guilherme Vanz     pHScrollBar->Hide();
9289e9693b9SMarcos Paulo de Souza     pEditView->InsertText(string);
92967311738SJosé Guilherme Vanz     AdjustScrollBars();
93067311738SJosé Guilherme Vanz     pVScrollBar->Show();
93167311738SJosé Guilherme Vanz     pHScrollBar->Show();
9329e9693b9SMarcos Paulo de Souza 
9339e9693b9SMarcos Paulo de Souza     // Remember start of the selection and move the cursor there afterwards.
9349e9693b9SMarcos Paulo de Souza     aSelection.nEndPara = aSelection.nStartPara;
9359e9693b9SMarcos Paulo de Souza     if (HasMark(string))
9369e9693b9SMarcos Paulo de Souza     {
9379e9693b9SMarcos Paulo de Souza         aSelection.nEndPos = aSelection.nStartPos;
9389e9693b9SMarcos Paulo de Souza         pEditView->SetSelection(aSelection);
9399e9693b9SMarcos Paulo de Souza         SelNextMark();
9409e9693b9SMarcos Paulo de Souza     }
941356b2f0eSMichael Duelli     else
9429e9693b9SMarcos Paulo de Souza     {   // set selection after inserted text
9439e9693b9SMarcos Paulo de Souza         aSelection.nEndPos = aSelection.nStartPos + string.getLength();
9449e9693b9SMarcos Paulo de Souza         aSelection.nStartPos = aSelection.nEndPos;
9459e9693b9SMarcos Paulo de Souza         pEditView->SetSelection(aSelection);
9469e9693b9SMarcos Paulo de Souza     }
9479e9693b9SMarcos Paulo de Souza 
948ea6399b8STobias Madl     aModifyIdle.Start();
94946b8e9a0SMichael Meeks     StartCursorMove();
950fef9a991SMarcos Paulo de Souza     GrabFocus();
9514c8d9dbcSThomas Lange [tl] }
952d7913668SJens-Heiner Rechtien 
953d7913668SJens-Heiner Rechtien void SmEditWindow::Flush()
954d7913668SJens-Heiner Rechtien {
955eb9b8aaaSThomas Lange     EditEngine *pEditEngine = GetEditEngine();
956d7913668SJens-Heiner Rechtien     if (pEditEngine  &&  pEditEngine->IsModified())
957d7913668SJens-Heiner Rechtien     {
958d7913668SJens-Heiner Rechtien         pEditEngine->ClearModifyFlag();
959d325e7d2SThomas Lange         SmViewShell *pViewSh = rCmdBox.GetView();
960d7913668SJens-Heiner Rechtien         if (pViewSh)
9614c8d9dbcSThomas Lange [tl]         {
9624e8a15caSGabor Kelemen             std::unique_ptr<SfxStringItem> pTextToFlush = std::make_unique<SfxStringItem>(SID_TEXT, GetText());
96351d7f466SMichael Stahl             pViewSh->GetViewFrame()->GetDispatcher()->ExecuteList(
9648044acf2SNoel Grandin                     SID_TEXT, SfxCallMode::RECORD,
96565a82fd7SJulien Nabet                     { pTextToFlush.get() });
966d7913668SJens-Heiner Rechtien         }
9674c8d9dbcSThomas Lange [tl]     }
968ea6399b8STobias Madl     if (aCursorMoveIdle.IsActive())
96946b8e9a0SMichael Meeks     {
970ea6399b8STobias Madl         aCursorMoveIdle.Stop();
971ea6399b8STobias Madl         CursorMoveTimerHdl(&aCursorMoveIdle);
97246b8e9a0SMichael Meeks     }
973d7913668SJens-Heiner Rechtien }
974d7913668SJens-Heiner Rechtien 
9759fbd05e0SNoel Grandin void SmEditWindow::DeleteEditView()
976eb9b8aaaSThomas Lange {
97725af6a72SThomas Lange     if (pEditView)
97825af6a72SThomas Lange     {
97908348b22SCaolán McNamara         std::unique_ptr<EditEngine> xEditEngine(pEditView->GetEditEngine());
98008348b22SCaolán McNamara         if (xEditEngine)
981eb9b8aaaSThomas Lange         {
98269a06ca6SNoel Grandin             xEditEngine->SetStatusEventHdl( Link<EditStatus&,void>() );
983950055bcSTakeshi Abe             xEditEngine->RemoveView( pEditView.get() );
984eb9b8aaaSThomas Lange         }
985950055bcSTakeshi Abe         pEditView.reset();
986eb9b8aaaSThomas Lange     }
98725af6a72SThomas Lange }
988eb9b8aaaSThomas Lange 
989e716420fSThomas Lange uno::Reference< XAccessible > SmEditWindow::CreateAccessible()
990e716420fSThomas Lange {
9918c5471c3STakeshi Abe     if (!mxAccessible.is())
992e716420fSThomas Lange     {
9938c5471c3STakeshi Abe         mxAccessible.set(new SmEditAccessible( this ));
9948c5471c3STakeshi Abe         mxAccessible->Init();
995e716420fSThomas Lange     }
9968c5471c3STakeshi Abe     return uno::Reference< XAccessible >(mxAccessible.get());
997e716420fSThomas Lange }
998e716420fSThomas Lange 
99961355e51SSebastian Spaeth /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1000