summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2022-01-17 17:15:46 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2022-01-25 17:36:08 +0100
commit737a270c61cd2038ede7911b7d7b4afcf020f53c (patch)
tree8239c2032b791ace1788ab4f8035aef051392a2f /starmath
parent0b9a4fd995c36c5348026f277aa28564615f2aad (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.hxx4
-rw-r--r--starmath/source/view.cxx180
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)