1
0
Fork 0
libreoffice/sc/source/ui/inc/inputwin.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

370 lines
14 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
#include <vector>
#include <memory>
#include <vcl/customweld.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/InterimItemWindow.hxx>
#include <sfx2/childwin.hxx>
#include <svl/lstner.hxx>
#include <svtools/stringtransfer.hxx>
#include <vcl/window.hxx>
#include <formula/opcode.hxx>
#include <svx/weldeditview.hxx>
namespace com::sun::star::accessibility { class XAccessible; }
class EditView;
class ScAccessibleEditLineTextData;
class ScAccessibleEditObject;
class ScEditEngineDefaulter;
class ScTextWndGroup;
class ScInputBarGroup;
class ScInputHandler;
class ScTabViewShell;
struct EENotify;
class ScTextWndBase
{
public:
virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0;
virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0;
virtual void SetTextString( const OUString& rString, bool bKitUpdate ) = 0;
virtual const OUString& GetTextString() const = 0;
virtual void StartEditEngine() = 0;
virtual void StopEditEngine( bool bAll ) = 0;
virtual EditView* GetEditView() const = 0;
virtual bool HasEditView() const = 0;
virtual void MakeDialogEditView() = 0;
virtual void SetFormulaMode( bool bSet ) = 0;
virtual bool IsInputActive() = 0;
virtual void TextGrabFocus() = 0;
virtual tools::Long GetNumLines() const = 0;
virtual ~ScTextWndBase() {}
};
class ScTextWnd : public WeldEditView
, public ScTextWndBase
{
public:
ScTextWnd(ScTextWndGroup& rParent, ScTabViewShell* pViewSh);
virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
virtual ~ScTextWnd() override;
virtual void SetTextString( const OUString& rString, bool bKitUpdate ) override;
virtual const OUString& GetTextString() const override;
bool IsInputActive() override;
virtual EditView* GetEditView() const override;
virtual bool HasEditView() const override;
const OutputDevice& GetEditViewDevice() const;
// for function autopilots
virtual void MakeDialogEditView() override;
virtual void StartEditEngine() override;
virtual void StopEditEngine( bool bAll ) override;
virtual void TextGrabFocus() override;
virtual void StyleUpdated() override;
// Triggered if scroll bar state should change
virtual void EditViewScrollStateChange() override;
virtual void SetFormulaMode( bool bSet ) override;
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override;
virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) override;
virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) override;
virtual void Resize() override;
int GetPixelHeightForLines(tools::Long nLines);
int GetEditEngTxtHeight() const;
virtual tools::Long GetNumLines() const override;
void SetNumLines(tools::Long nLines);
tools::Long GetLastNumExpandedLines() const { return mnLastExpandedLines; }
void SetLastNumExpandedLines(tools::Long nLastExpandedLines) { mnLastExpandedLines = nLastExpandedLines; }
void DoScroll();
DECL_LINK(ModifyHdl, LinkParamNone*, void);
DECL_LINK(EditStatusHdl, EditStatus&, void);
protected:
virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
virtual bool MouseMove( const MouseEvent& rMEvt ) override;
virtual bool MouseButtonDown( const MouseEvent& rMEvt ) override;
virtual bool MouseButtonUp( const MouseEvent& rMEvt ) override;
virtual bool Command( const CommandEvent& rCEvt ) override;
virtual bool KeyInput(const KeyEvent& rKEvt) override;
virtual bool CanFocus() const override;
virtual void GetFocus() override;
virtual bool StartDrag() override;
private:
void ImplInitSettings();
void UpdateAutoCorrFlag();
void SetScrollBarRange();
void InitEditEngine();
void UpdateFocus();
rtl::Reference<svt::OStringTransferable> m_xHelper;
typedef ::std::vector< ScAccessibleEditLineTextData* > AccTextDataVector;
rtl::Reference<ScAccessibleEditObject> pAcc;
OUString aString;
vcl::Font aTextFont;
AccTextDataVector maAccTextDatas; // #i105267# text data may be cloned, remember all copies
bool bIsRTL;
bool bIsInsertMode;
bool bFormulaMode;
// #102710#; this flag should be true if a key input or a command is handled
// it prevents the call of InputChanged in the ModifyHandler of the EditEngine
bool bInputMode;
ScTabViewShell* mpViewShell;
ScTextWndGroup& mrGroupBar;
tools::Long mnLastExpandedLines;
bool mbInvalidate;
};
class ScPosWnd final : public InterimItemWindow, public SfxListener // Display position
{
private:
std::unique_ptr<weld::ComboBox> m_xWidget;
ImplSVEvent* m_nAsyncGetFocusId;
OUString aPosStr;
void* nTipVisible;
bool bFormulaMode;
public:
ScPosWnd( vcl::Window* pParent );
virtual ~ScPosWnd() override;
virtual void dispose() override;
void SetPos( const OUString& rPosStr ); // Displayed Text
void SetFormulaMode( bool bSet );
static OUString createLocalRangeName(std::u16string_view rName, std::u16string_view rTableName);
private:
DECL_LINK(OnAsyncGetFocus, void*, void);
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
DECL_LINK(ActivateHdl, weld::ComboBox&, bool);
DECL_LINK(ModifyHdl, weld::ComboBox&, void);
DECL_LINK(FocusInHdl, weld::Widget&, void);
DECL_LINK(FocusOutHdl, weld::Widget&, void);
virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
private:
void FillRangeNames();
void FillFunctions();
void DoEnter();
void HideTip();
void ReleaseFocus_Impl();
};
class ScTextWndGroup : public ScTextWndBase
{
public:
ScTextWndGroup(ScInputBarGroup& pParent, ScTabViewShell* pViewSh);
virtual ~ScTextWndGroup() override;
virtual void InsertAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
virtual EditView* GetEditView() const override;
const OutputDevice& GetEditViewDevice() const;
Point GetCursorScreenPixelPos(bool bBelowLine);
tools::Long GetLastNumExpandedLines() const;
void SetLastNumExpandedLines(tools::Long nLastExpandedLines);
virtual tools::Long GetNumLines() const override;
int GetPixelHeightForLines(tools::Long nLines);
weld::ScrolledWindow& GetScrollWin();
virtual const OUString& GetTextString() const override;
virtual bool HasEditView() const override;
virtual bool IsInputActive() override;
virtual void MakeDialogEditView() override;
virtual void RemoveAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
void SetScrollPolicy();
void SetNumLines(tools::Long nLines);
virtual void SetFormulaMode(bool bSet) override;
virtual void SetTextString(const OUString& rString, bool bKitUpdate) override;
virtual void StartEditEngine() override;
virtual void StopEditEngine(bool bAll) override;
virtual void TextGrabFocus() override;
vcl::Window& GetVclParent() { return mrParent; }
private:
std::unique_ptr<ScTextWnd> mxTextWnd;
std::unique_ptr<weld::ScrolledWindow> mxScrollWin;
std::unique_ptr<weld::CustomWeld> mxTextWndWin;
vcl::Window& mrParent;
DECL_LINK(Impl_ScrollHdl, weld::ScrolledWindow&, void);
};
class ScInputBarGroup : public InterimItemWindow
, public ScTextWndBase
{
public:
ScInputBarGroup(vcl::Window* Parent, ScTabViewShell* pViewSh);
virtual ~ScInputBarGroup() override;
virtual void dispose() override;
virtual void InsertAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
virtual void RemoveAccessibleTextData(ScAccessibleEditLineTextData& rTextData) override;
void SetTextString(const OUString& rString, bool bKitUpdate) override;
void StartEditEngine() override;
virtual EditView* GetEditView() const override;
virtual bool HasEditView() const override;
Point GetCursorScreenPixelPos(bool bBelowLine);
virtual void Resize() override;
virtual void DataChanged(const DataChangedEvent& rDCEvt) override;
virtual const OUString& GetTextString() const override;
virtual void StopEditEngine(bool bAll) override;
virtual void TextGrabFocus() override;
void SetFormulaMode(bool bSet) override;
void MakeDialogEditView() override;
bool IsInputActive() override;
void IncrementVerticalSize();
void DecrementVerticalSize();
void NumLinesChanged();
virtual tools::Long GetNumLines() const override { return mxTextWndGroup->GetNumLines(); }
int GetPixelHeightForLines(tools::Long nLines) const
{
return mxTextWndGroup->GetPixelHeightForLines(nLines);
}
weld::Builder& GetBuilder() { return *m_xBuilder; }
private:
void TriggerToolboxLayout();
void SetBackgrounds();
std::unique_ptr<weld::Container> mxBackground;
std::unique_ptr<ScTextWndGroup> mxTextWndGroup;
std::unique_ptr<weld::Button> mxButtonUp;
std::unique_ptr<weld::Button> mxButtonDown;
DECL_LINK(ClickHdl, weld::Button&, void);
};
class ScInputWindow final : public ToolBox // Parent toolbox
{
public:
ScInputWindow( vcl::Window* pParent, const SfxBindings* pBind );
virtual ~ScInputWindow() override;
virtual void dispose() override;
virtual void PixelInvalidate(const tools::Rectangle* pRectangle) override;
virtual void SetSizePixel( const Size& rNewSize ) override;
virtual void Resize() override;
virtual void Select() override;
void SetFuncString( const OUString& rString, bool bDoEdit = true );
void SetPosString( const OUString& rStr );
void SetTextString(const OUString& rString, bool bKitUpdate);
void SetOkCancelMode();
void SetSumAssignMode();
void EnableButtons( bool bEnable );
/// Update Input bar after the number of lines was changed externally
void NumLinesChanged();
void StartFormula();
void SetFormulaMode( bool bSet );
bool IsInputActive();
EditView* GetEditView();
vcl::Window* GetEditWindow();
Point GetCursorScreenPixelPos(bool bBelowLine = false);
void TextGrabFocus();
void TextInvalidate();
void SwitchToTextWin();
void PosGrabFocus();
// For function autopilots
void MakeDialogEditView();
void StopEditEngine( bool bAll );
void SetInputHandler( ScInputHandler* pNew );
ScInputHandler* GetInputHandler(){ return pInputHdl;}
void StateChanged( StateChangedType nType ) override;
virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
virtual void MouseButtonUp( const MouseEvent& rMEvt ) override;
virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
virtual void MouseMove( const MouseEvent& rMEvt ) override;
void NotifyLOKClient();
void MenuHdl(std::u16string_view command);
DECL_LINK( DropdownClickHdl, ToolBox*, void );
void AutoSum( bool& bRangeFinder, bool& bSubTotal, OpCode eCode );
private:
bool IsPointerAtResizePos();
VclPtr<ScPosWnd> aWndPos;
VclPtr<ScInputBarGroup> mxTextWindow;
ScInputHandler* pInputHdl;
ScTabViewShell* mpViewShell;
tools::Long mnMaxY;
tools::Long mnStandardItemHeight;
bool bIsOkCancelMode;
bool bInResize;
};
class ScInputWindowWrapper : public SfxChildWindow
{
public:
ScInputWindowWrapper( vcl::Window* pParent,
sal_uInt16 nId,
SfxBindings* pBindings,
SfxChildWinInfo* pInfo );
SFX_DECL_CHILDWINDOW_WITHID(ScInputWindowWrapper);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */