diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2022-01-17 17:15:46 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2022-01-25 17:36:08 +0100 |
commit | 737a270c61cd2038ede7911b7d7b4afcf020f53c (patch) | |
tree | 8239c2032b791ace1788ab4f8035aef051392a2f /starmath | |
parent | 0b9a4fd995c36c5348026f277aa28564615f2aad (diff) |
lok: enable in-place editing of math equations
Change-Id: Ic4d187d1e2ee92eab74a6bb43e47bb4f3d47ebd2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128506
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'starmath')
-rw-r--r-- | starmath/inc/view.hxx | 4 | ||||
-rw-r--r-- | starmath/source/view.cxx | 180 |
2 files changed, 125 insertions, 59 deletions
diff --git a/starmath/inc/view.hxx b/starmath/inc/view.hxx index 90cb04831755..8b49b117ef35 100644 --- a/starmath/inc/view.hxx +++ b/starmath/inc/view.hxx @@ -61,6 +61,8 @@ public: virtual void dispose() override; virtual ~SmGraphicWindow() override; + virtual bool IsStarMath() const override { return true; } + void SetTotalSize(const Size& rNewSize); Size GetTotalSize() const; @@ -107,6 +109,7 @@ public: virtual bool MouseMove(const MouseEvent &rMEvt) override; virtual void GetFocus() override; virtual void LoseFocus() override; + virtual bool KeyInput(const KeyEvent& rKEvt) override; void SetTotalSize(); @@ -137,7 +140,6 @@ private: void SetCursor(const tools::Rectangle &rRect); virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; - virtual bool KeyInput(const KeyEvent& rKEvt) override; virtual bool Command(const CommandEvent& rCEvt) override; void RepaintViewShellDoc(); diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx index 4eda4001e81c..eb1555a9a29b 100644 --- a/starmath/source/view.cxx +++ b/starmath/source/view.cxx @@ -25,6 +25,7 @@ #include <com/sun/star/frame/XFramesSupplier.hpp> #include <com/sun/star/container/XChild.hpp> +#include <comphelper/lok.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/servicehelper.hxx> #include <comphelper/storagehelper.hxx> @@ -576,6 +577,90 @@ void SmGraphicWidget::SetTotalSize() mrGraphicWindow.SetTotalSize(aTmp); } +namespace +{ +SmBracketType BracketTypeOf(sal_uInt32 c) +{ + switch (c) + { + case '(': + case ')': + return SmBracketType::Round; + case '[': + case ']': + return SmBracketType::Square; + case '{': + case '}': + return SmBracketType::Curly; + } + assert(false); // Unreachable + return SmBracketType::Round; +} + +bool CharInput(sal_uInt32 c, SmCursor& rCursor, OutputDevice& rDevice) +{ + switch (c) + { + case 0: + return false; + case ' ': + rCursor.InsertElement(BlankElement); + break; + case '!': + rCursor.InsertElement(FactorialElement); + break; + case '%': + rCursor.InsertElement(PercentElement); + break; + case '*': + rCursor.InsertElement(CDotElement); + break; + case '+': + rCursor.InsertElement(PlusElement); + break; + case '-': + rCursor.InsertElement(MinusElement); + break; + case '<': + rCursor.InsertElement(LessThanElement); + break; + case '=': + rCursor.InsertElement(EqualElement); + break; + case '>': + rCursor.InsertElement(GreaterThanElement); + break; + case '^': + rCursor.InsertSubSup(RSUP); + break; + case '_': + rCursor.InsertSubSup(RSUB); + break; + case '/': + rCursor.InsertFraction(); + break; + case '(': + case '[': + case '{': + rCursor.InsertBrackets(BracketTypeOf(c)); + break; + case ')': + case ']': + case '}': + if (rCursor.IsAtTailOfBracket(BracketTypeOf(c))) + { + rCursor.Move(&rDevice, MoveRight); + break; + } + [[fallthrough]]; + default: + rCursor.InsertText(OUString(&c, 1)); + break; + } + return true; +} +} + bool SmGraphicWidget::KeyInput(const KeyEvent& rKEvt) { if (!SmViewShell::IsInlineEditEnabled()) @@ -629,61 +714,10 @@ bool SmGraphicWidget::KeyInput(const KeyEvent& rKEvt) { rCursor.DeletePrev(&rDevice); }break; - case KEY_ADD: - rCursor.InsertElement(PlusElement); - break; - case KEY_SUBTRACT: - if(rKEvt.GetKeyCode().IsShift()) - rCursor.InsertSubSup(RSUB); - else - rCursor.InsertElement(MinusElement); - break; - case KEY_MULTIPLY: - rCursor.InsertElement(CDotElement); - break; - case KEY_DIVIDE: - rCursor.InsertFraction(); - break; - case KEY_LESS: - rCursor.InsertElement(LessThanElement); - break; - case KEY_GREATER: - rCursor.InsertElement(GreaterThanElement); - break; - case KEY_EQUAL: - rCursor.InsertElement(EqualElement); - break; default: { - sal_Unicode code = rKEvt.GetCharCode(); - - if(code == ' ') { - rCursor.InsertElement(BlankElement); - }else if(code == '^') { - rCursor.InsertSubSup(RSUP); - }else if(code == '(') { - rCursor.InsertBrackets(SmBracketType::Round); - }else if(code == '[') { - rCursor.InsertBrackets(SmBracketType::Square); - }else if(code == '{') { - rCursor.InsertBrackets(SmBracketType::Curly); - }else if(code == '!') { - rCursor.InsertElement(FactorialElement); - }else if(code == '%') { - rCursor.InsertElement(PercentElement); - } - else if ((code == ')' && rCursor.IsAtTailOfBracket(SmBracketType::Round)) - || (code == ']' && rCursor.IsAtTailOfBracket(SmBracketType::Square)) - || (code == '}' && rCursor.IsAtTailOfBracket(SmBracketType::Curly))) - { - rCursor.Move(&rDevice, MoveRight); - } - else{ - if(code != 0){ - rCursor.InsertText(OUString(code)); - }else if (!mrViewShell.KeyInput(rKEvt)) - bConsumed = false; - } + if (!CharInput(rKEvt.GetCharCode(), rCursor, rDevice)) + bConsumed = mrViewShell.KeyInput(rKEvt); } } } @@ -728,6 +762,27 @@ bool SmGraphicWidget::Command(const CommandEvent& rCEvt) default: break; } } + else + { + switch (rCEvt.GetCommand()) + { + case CommandEventId::ExtTextInput: + if (comphelper::LibreOfficeKit::isActive()) + { + const CommandExtTextInputData* pData = rCEvt.GetExtTextInputData(); + assert(pData); + const OUString& rText = pData->GetText(); + SmCursor& rCursor = mrViewShell.GetDoc()->GetCursor(); + OutputDevice& rDevice = GetDrawingArea()->get_ref_device(); + for (sal_Int32 i = 0; i < rText.getLength();) + CharInput(rText.iterateCodePoints(&i), rCursor, rDevice); + bCallBase = false; + } + break; + default: + break; + } + } return !bCallBase; } @@ -822,8 +877,12 @@ SmCmdBoxWindow::SmCmdBoxWindow(SfxBindings *pBindings_, SfxChildWindow *pChildWi Hide(); - aInitialFocusTimer.SetInvokeHandler(LINK(this, SmCmdBoxWindow, InitialFocusTimerHdl)); - aInitialFocusTimer.SetTimeout(100); + // Don't try to grab focus in LOK inline edit mode + if (!comphelper::LibreOfficeKit::isActive()) + { + aInitialFocusTimer.SetInvokeHandler(LINK(this, SmCmdBoxWindow, InitialFocusTimerHdl)); + aInitialFocusTimer.SetTimeout(100); + } } Point SmCmdBoxWindow::WidgetToWindowPos(const weld::Widget& rWidget, const Point& rPos) @@ -2089,8 +2148,12 @@ void SmViewShell::Activate( bool bIsMDIActivate ) { SfxViewShell::Activate( bIsMDIActivate ); - SmEditWindow *pEdit = GetEditWindow(); - if ( pEdit ) + if (comphelper::LibreOfficeKit::isActive()) + { + // In LOK, activate in-place editing + GetGraphicWidget().GrabFocus(); + } + else if (SmEditWindow *pEdit = GetEditWindow()) { //! Since there is no way to be informed if a "drag and drop" //! event has taken place, we call SetText here in order to @@ -2149,7 +2212,8 @@ void SmViewShell::Notify( SfxBroadcaster& , const SfxHint& rHint ) bool SmViewShell::IsInlineEditEnabled() { - return officecfg::Office::Common::Misc::ExperimentalMode::get(); + return comphelper::LibreOfficeKit::isActive() + || officecfg::Office::Common::Misc::ExperimentalMode::get(); } void SmViewShell::ZoomByItemSet(const SfxItemSet *pSet) |