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
