summaryrefslogtreecommitdiffstats
path: root/sc/source/ui/inc/inputhdl.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/inc/inputhdl.hxx')
-rw-r--r--sc/source/ui/inc/inputhdl.hxx334
1 files changed, 334 insertions, 0 deletions
diff --git a/sc/source/ui/inc/inputhdl.hxx b/sc/source/ui/inc/inputhdl.hxx
new file mode 100644
index 000000000..ca70287ef
--- /dev/null
+++ b/sc/source/ui/inc/inputhdl.hxx
@@ -0,0 +1,334 @@
+/* -*- 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 ( const OUString& rStr );
+ 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);
+ static void LOKSendFormulabarUpdate(const SfxViewShell* pActiveViewSh,
+ const OUString& rText, const ESelection& rSelection);
+};
+
+// ScInputHdlState
+
+class ScInputHdlState
+{
+ friend class ScInputHandler;
+
+public:
+ ScInputHdlState( const ScAddress& rCurPos,
+ const ScAddress& rStartPos,
+ const ScAddress& rEndPos,
+ const OUString& rString,
+ 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: */