1
0
Fork 0
libreoffice/sc/source/ui/inc/inputhdl.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

332 lines
13 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 <global.hxx>
#include <address.hxx>
#include <tools/solar.h>
#include <typedstrdata.hxx>
#include <tools/fract.hxx>
#include <tools/gen.hxx>
#include <tools/link.hxx>
#include <vcl/vclptr.hxx>
#include <editeng/svxenum.hxx>
#include "viewdata.hxx"
#include <set>
#include <memory>
#include <vector>
class ScDocument;
class ScTabViewShell;
class ScInputWindow;
class ScPatternAttr;
class ScEditEngineDefaulter;
class EditView;
class EditTextObject;
class ScInputHdlState;
class ScRangeFindList;
class Timer;
class KeyEvent;
class CommandEvent;
class VclWindowEvent;
namespace vcl { class Window; }
struct ReferenceMark;
struct ESelection;
// ScInputHandler
class ScInputHandler final
{
private:
VclPtr<ScInputWindow> pInputWin;
std::unique_ptr<ScEditEngineDefaulter> mpEditEngine; ///< Edited data in the sheet (when the user clicks into the sheet, and starts writing there).
EditView* pTableView; // associated active EditView
EditView* pTopView; // EditView in the input row
std::unique_ptr<ScTypedCaseStrSet> pColumnData;
std::unique_ptr<ScTypedCaseStrSet> pFormulaData;
std::unique_ptr<ScTypedCaseStrSet> pFormulaDataPara;
ScTypedCaseStrSet::const_iterator miAutoPosColumn;
ScTypedCaseStrSet::const_iterator miAutoPosFormula;
std::set<sal_Unicode> maFormulaChar;
VclPtr<vcl::Window> pTipVisibleParent;
void* nTipVisible;
VclPtr<vcl::Window> pTipVisibleSecParent;
void* nTipVisibleSec;
OUString aManualTip;
OUString aAutoSearch;
OUString aCurrentText;
OUString aFormText; // for autopilot function
sal_Int32 nFormSelStart; // Selection for autopilot function
sal_Int32 nFormSelEnd;
sal_Unicode nCellPercentFormatDecSep; // 0:= no percent format, else which decimal separator
sal_uInt16 nAutoPar; // autom.parentheses than can be overwritten
ScAddress aCursorPos;
ScInputMode eMode;
bool bUseTab:1; // Scrolling possible
bool bTextValid:1; // Text is not in edit engine
bool bModified:1;
bool bSelIsRef:1;
bool bFormulaMode:1;
bool bInRangeUpdate:1;
bool bParenthesisShown:1;
bool bCreatingFuncView:1;
bool bInEnterHandler:1;
bool bCommandErrorShown:1;
bool bInOwnChange:1;
bool bProtected:1;
bool bLastIsSymbol:1;
bool mbDocumentDisposing:1;
/// To indicate if there is a partial prefix completion.
bool mbPartialPrefix:1;
bool mbEditingExistingContent:1;
sal_uLong nValidation;
SvxCellHorJustify eAttrAdjust;
Fraction aScaleX; // for ref MapMode
Fraction aScaleY;
ScTabViewShell* pRefViewSh;
ScTabViewShell* pActiveViewSh;
const ScPatternAttr* pLastPattern;
std::unique_ptr<SfxItemSet>
pEditDefaults;
std::unique_ptr<ScInputHdlState>
pLastState;
std::unique_ptr<Timer> pDelayTimer;
std::unique_ptr<ScRangeFindList>
pRangeFindList;
private:
void UpdateActiveView();
void SyncViews( const EditView* pSourceView = nullptr );
/**
* @param cTyped typed character. If 0, look at existing document content
* for text or number.
* @param bInputActivated true if the cell input mode is activated (via
* F2), false otherwise.
* @param pTopEngine top window input line EditEngine. If not nullptr then
* some default attributes are merged to it from the
* table EditEngine.
* @return true if the new edit mode has been started.
*/
bool StartTable( sal_Unicode cTyped, bool bFromCommand, bool bInputActivated,
ScEditEngineDefaulter* pTopEngine );
void RemoveSelection();
bool StartsLikeFormula( std::u16string_view rStr ) const;
void UpdateFormulaMode();
static void InvalidateAttribs();
void ImplCreateEditEngine();
DECL_LINK( DelayTimer, Timer*, void );
void GetColData();
void UseColData();
void NextAutoEntry( bool bBack );
void UpdateAdjust( sal_Unicode cTyped );
void GetFormulaData();
void UseFormulaData();
void NextFormulaEntry( bool bBack );
void PasteFunctionData();
void PasteManualTip();
EditView* GetFuncEditView();
void RemoveAdjust();
void RemoveRangeFinder();
void DeleteRangeFinder();
void UpdateParenthesis();
void UpdateAutoCorrFlag();
void ResetAutoPar();
void AutoParAdded();
bool CursorAtClosingPar();
void SkipClosingPar();
bool GetFuncName( OUString& aStart, OUString& aResult ); // fdo75264
void ShowArgumentsTip( OUString& rSelText );
DECL_LINK( ModifyHdl, LinkParamNone*, void );
DECL_LINK( ShowHideTipVisibleParentListener, VclWindowEvent&, void );
DECL_LINK( ShowHideTipVisibleSecParentListener, VclWindowEvent&, void );
public:
ScInputHandler(const ScInputHandler&) = delete;
const ScInputHandler& operator=(const ScInputHandler&) = delete;
ScInputHandler();
~ScInputHandler();
void SetMode( ScInputMode eNewMode, const OUString* pInitText = nullptr,
ScEditEngineDefaulter* pTopEngine = nullptr );
bool IsInputMode() const { return (eMode != SC_INPUT_NONE); }
bool IsEditMode() const { return (eMode != SC_INPUT_NONE &&
eMode != SC_INPUT_TYPE); }
bool IsTopMode() const { return (eMode == SC_INPUT_TOP); }
const OUString& GetEditString();
const OUString& GetFormString() const { return aFormText; }
const ScAddress& GetCursorPos() const { return aCursorPos; }
bool GetTextAndFields( ScEditEngineDefaulter& rDestEngine );
void MergeLanguageAttributes( ScEditEngineDefaulter& rDestEngine ) const;
bool KeyInput( const KeyEvent& rKEvt, bool bStartEdit );
void EnterHandler( ScEnterMode nBlockMode = ScEnterMode::NORMAL, bool bBeforeSavingInLOK = false );
void CancelHandler();
void SetReference( const ScRange& rRef, const ScDocument& rDoc );
void AddRefEntry();
void InputCommand( const CommandEvent& rCEvt );
OUString GetSurroundingText();
Selection GetSurroundingTextSelection();
bool DeleteSurroundingText(const Selection& rSelection);
void InsertFunction( const OUString& rFuncName, bool bAddPar = true );
void ClearText();
void InputSelection( const EditView* pView );
void InputChanged( const EditView* pView, bool bFromNotify );
void ViewShellGone(const ScTabViewShell* pViewSh);
void SetRefViewShell(ScTabViewShell* pRefVsh) {pRefViewSh=pRefVsh;}
void NotifyChange( const ScInputHdlState* pState, bool bForce = false,
ScTabViewShell* pSourceSh = nullptr,
bool bStopEditing = true);
void UpdateCellAdjust( SvxCellHorJustify eJust );
void ResetDelayTimer(); //BugId 54702
void HideTip();
void HideTipBelow();
void ShowTipCursor();
void ShowTip( const OUString& rText ); // at Cursor
void ShowTipBelow( const OUString& rText );
void ShowFuncList( const ::std::vector< OUString > & rFuncStrVec );
void SetRefScale( const Fraction& rX, const Fraction& rY );
void UpdateRefDevice();
EditView* GetActiveView();
EditView* GetTableView() { return pTableView; }
EditView* GetTopView() { return pTopView; }
bool DataChanging( sal_Unicode cTyped = 0, bool bFromCommand = false );
void DataChanged( bool bFromTopNotify = false, bool bSetModified = true );
bool TakesReturn() const { return ( nTipVisible != nullptr ); }
void SetModified() { bModified = true; }
bool GetSelIsRef() const { return bSelIsRef; }
void SetSelIsRef(bool bSet) { bSelIsRef = bSet; }
void ShowRefFrame();
ScRangeFindList* GetRangeFindList() { return pRangeFindList.get(); }
void UpdateRange( sal_uInt16 nIndex, const ScRange& rNew );
// Communication with the autopilot function
void InputGetSelection ( sal_Int32& rStart, sal_Int32& rEnd );
void InputSetSelection ( sal_Int32 nStart, sal_Int32 nEnd );
void InputReplaceSelection ( std::u16string_view aStr );
void InputTurnOffWinEngine();
bool IsFormulaMode() const { return bFormulaMode; }
ScInputWindow* GetInputWindow() { return pInputWin; }
void SetInputWindow( ScInputWindow* pNew );
void StopInputWinEngine( bool bAll );
bool IsInEnterHandler() const { return bInEnterHandler; }
bool IsInOwnChange() const { return bInOwnChange; }
/// Returns true if there is a partial autocomplete suggestion.
bool HasPartialComplete() const { return mbPartialPrefix; };
bool IsModalMode( const SfxObjectShell* pDocSh );
void ForgetLastPattern();
void UpdateSpellSettings( bool bFromStartTab = false );
void FormulaPreview();
Size GetTextSize(); // in 1/100mm
// actually private, public for SID_INPUT_SUM
void InitRangeFinder(const OUString& rFormula);
void UpdateLokReferenceMarks();
static void SendReferenceMarks( const SfxViewShell* pViewShell,
const std::vector<ReferenceMark>& rReferenceMarks );
void SetDocumentDisposing( bool b );
static ReferenceMark GetReferenceMark( const ScViewData& rViewData, ScDocShell* pDocSh,
tools::Long nX1, tools::Long nX2, tools::Long nY1, tools::Long nY2,
tools::Long nTab, const Color& rColor );
void LOKPasteFunctionData(const OUString& rFunctionName);
};
// ScInputHdlState
class ScInputHdlState
{
friend class ScInputHandler;
public:
ScInputHdlState( const ScAddress& rCurPos,
const ScAddress& rStartPos,
const ScAddress& rEndPos,
OUString aString,
const EditTextObject* pData );
ScInputHdlState( const ScInputHdlState& rCpy );
~ScInputHdlState();
ScInputHdlState& operator= ( const ScInputHdlState& r );
bool operator==( const ScInputHdlState& r ) const;
const ScAddress& GetPos() const { return aCursorPos; }
const ScAddress& GetStartPos() const { return aStartPos; }
const ScAddress& GetEndPos() const { return aEndPos; }
const OUString& GetString() const { return aString; }
const EditTextObject* GetEditData() const { return pEditData.get(); }
private:
ScAddress aCursorPos;
ScAddress aStartPos;
ScAddress aEndPos;
OUString aString;
std::unique_ptr<EditTextObject> pEditData;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */