diff options
Diffstat (limited to 'sc/source/ui/inc/tabvwsh.hxx')
-rw-r--r-- | sc/source/ui/inc/tabvwsh.hxx | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx new file mode 100644 index 0000000000..b537af6900 --- /dev/null +++ b/sc/source/ui/inc/tabvwsh.hxx @@ -0,0 +1,442 @@ +/* -*- 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 <formula/errorcodes.hxx> +#include <formula/opcode.hxx> +#include <svx/fmshell.hxx> +#include <sfx2/viewsh.hxx> +#include <editeng/svxenum.hxx> +#include <o3tl/deleter.hxx> +#include <scdllapi.h> +#include "dbfunc.hxx" +#include "target.hxx" +#include <shellids.hxx> +#include <tabprotection.hxx> +#include <com/sun/star/ui/dialogs/DialogClosedEvent.hpp> +#include <dragdata.hxx> + +#include <memory> +#include <map> + +class SdrOle2Obj; +class SfxBindings; +class SfxChildWindow; +class SvxNumberInfoItem; +struct SfxChildWinInfo; + +class ScArea; +class ScAuditingShell; +class ScDrawShell; +class ScDrawTextObjectBar; +class ScEditShell; +class ScInputHandler; +class ScPivotShell; +class ScDrawFormShell; +class ScCellShell; +class ScOleObjectShell; +class ScGraphicShell; +class ScMediaShell; +class ScChartShell; +class ScPageBreakShell; +class ScDPObject; +class ScNavigatorSettings; +class ScRangeName; +class ScDrawTransferObj; +namespace sc { class SparklineShell; } + +struct ScHeaderFieldData; + +namespace editeng { class SvxBorderLine; } + +namespace com::sun::star::frame { class XDispatchProviderInterceptor; } + +namespace svx { + class ExtrusionBar; + class FontworkBar; +} + +enum ObjectSelectionType +{ + OST_NONE, + OST_Cell, + OST_Editing, + OST_DrawText, + OST_Drawing, + OST_DrawForm, + OST_Pivot, + OST_Auditing, + OST_OleObject, + OST_Chart, + OST_Graphic, + OST_Media, + OST_Sparkline, +}; + +class ScFormEditData; +class SC_DLLPUBLIC ScTabViewShell : public SfxViewShell, public ScDBFunc +{ +private: + struct SendFormulabarUpdate + { + OUString m_aText; + OUString m_aSelection; + sal_uInt64 m_nShellId; + std::chrono::steady_clock::time_point m_nTimeStamp; + + SendFormulabarUpdate() + : m_nShellId(0) + { + } + + void Send(); + }; + + SendFormulabarUpdate maSendFormulabarUpdate; + + ObjectSelectionType eCurOST; + sal_uInt16 nDrawSfxId; + SdrObjKind eFormObjKind; + OUString sDrawCustom; // current custom shape type + std::unique_ptr<ScDrawShell> pDrawShell; + std::unique_ptr<ScDrawTextObjectBar> pDrawTextShell; + std::unique_ptr<ScEditShell> pEditShell; + std::unique_ptr<ScPivotShell> pPivotShell; + std::unique_ptr<sc::SparklineShell> m_pSparklineShell; + std::unique_ptr<ScAuditingShell> pAuditingShell; + std::unique_ptr<ScDrawFormShell> pDrawFormShell; + std::unique_ptr<ScCellShell> pCellShell; + std::unique_ptr<ScOleObjectShell> pOleObjectShell; + std::unique_ptr<ScChartShell> pChartShell; + std::unique_ptr<ScGraphicShell> pGraphicShell; + std::unique_ptr<ScMediaShell> pMediaShell; + std::unique_ptr<ScPageBreakShell> pPageBreakShell; + std::unique_ptr<svx::ExtrusionBar> pExtrusionBarShell; + std::unique_ptr<svx::FontworkBar> pFontworkBarShell; + + std::unique_ptr<FmFormShell> pFormShell; + + std::unique_ptr<ScFormEditData> mpFormEditData; + std::unique_ptr<ScInputHandler, o3tl::default_delete<ScInputHandler>> mpInputHandler; // for OLE input cell + + std::unique_ptr<::editeng::SvxBorderLine> pCurFrameLine; + + css::uno::Reference< css::frame::XDispatchProviderInterceptor > + xDisProvInterceptor; + + Point aWinPos; + + ScTabViewTarget aTarget; + std::unique_ptr<ScDPObject> pDialogDPObject; + + std::unique_ptr<ScNavigatorSettings> pNavSettings; + + // used in first Activate + bool bFirstActivate; + + bool bActiveDrawSh; + bool bActiveDrawTextSh; + bool bActiveDrawFormSh; + bool bActiveOleObjectSh; + bool bActiveChartSh; + bool bActiveGraphicSh; + bool bActiveMediaSh; + bool bActiveEditSh; + + bool bFormShellAtTop; // does the FormShell need to be on top? + + bool bDontSwitch; // Don't turn off EditShell + bool bInFormatDialog; // for GetSelectionText + + bool bReadOnly; // to detect status changes + + bool bIsActive; + + bool bForceFocusOnCurCell; // #i123629# + + bool bInPrepareClose; + bool bInDispose; + + sal_uInt16 nCurRefDlgId; + + std::unique_ptr<SfxBroadcaster> pAccessibilityBroadcaster; + + // ugly hack for Add button in ScNameDlg + std::map<OUString, ScRangeName> m_RangeMap; + bool mbInSwitch; + OUString maName; + OUString maScope; + + std::unique_ptr<ScDragData> m_pDragData; +private: + void Construct( TriState nForceDesignMode ); + + SfxShell* GetMySubShell() const; + + void DoReadUserData( std::u16string_view rData ); + void DoReadUserDataSequence( const css::uno::Sequence< css::beans::PropertyValue >& rSettings ); + bool IsSignatureLineSelected(); + bool IsSignatureLineSigned(); + bool IsQRCodeSelected(); + + DECL_DLLPRIVATE_LINK( SimpleRefClose, const OUString*, void ); + DECL_DLLPRIVATE_LINK( SimpleRefDone, const OUString&, void ); + DECL_DLLPRIVATE_LINK( SimpleRefAborted, const OUString&, void ); + DECL_DLLPRIVATE_LINK( SimpleRefChange, const OUString&, void ); + DECL_DLLPRIVATE_LINK( FormControlActivated, LinkParamNone*, void ); + DECL_DLLPRIVATE_LINK( DialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, void ); + +protected: + virtual void Activate(bool bMDI) override; + virtual void Deactivate(bool bMDI) override; + virtual bool PrepareClose( bool bUI = true ) override; + + virtual void ShowCursor(bool bOn) override; + + virtual void Move() override; // notification + + virtual void InnerResizePixel( const Point &rOfs, const Size &rSize, bool inplaceEditModeChange ) override; // new + virtual void OuterResizePixel( const Point &rOfs, const Size &rSize ) override; + virtual void SetZoomFactor( const Fraction &rZoomX, const Fraction &rZoomY ) override; + + virtual void QueryObjAreaPixel( tools::Rectangle& rRect ) const override; + + virtual OUString GetSelectionText( bool bWholeWord = false, bool bOnlyASample = false ) override; + virtual bool HasSelection( bool bText = true ) const override; + + virtual void WriteUserData(OUString &, bool bBrowse = false) override; + virtual void ReadUserData(const OUString &, bool bBrowse = false) override; + virtual void WriteUserDataSequence (css::uno::Sequence < css::beans::PropertyValue >& ) override; + virtual void ReadUserDataSequence (const css::uno::Sequence < css::beans::PropertyValue >& ) override; + + virtual void UIDeactivated( SfxInPlaceClient* pClient ) override; + + virtual bool KeyInput( const KeyEvent &rKeyEvent ) override; + virtual SdrView* GetDrawView() const override; + +public: + SFX_DECL_INTERFACE(SCID_TABVIEW_SHELL) + SFX_DECL_VIEWFACTORY(ScTabViewShell); + +private: + /// SfxInterface initializer. + static void InitInterface_Impl(); + +public: + /** -> Clone Method for Factory + Created from a general shell and inherit as much as possible */ + ScTabViewShell(SfxViewFrame& rViewFrame, SfxViewShell* pOldSh); + + virtual ~ScTabViewShell() override; + + weld::Window* GetDialogParent(); + + bool IsRefInputMode() const; + void ExecuteInputDirect(); + + const ScInputHandler* GetInputHandler() const { return mpInputHandler.get(); } + ScInputHandler* GetInputHandler() { return mpInputHandler.get(); } + const OUString* GetEditString() const; + void UpdateInputHandler( bool bForce = false, bool bStopEditing = true ); + void UpdateInputHandlerCellAdjust( SvxCellHorJustify eJust ); + bool TabKeyInput(const KeyEvent& rKEvt); + bool SfxKeyInput(const KeyEvent& rKEvt); + + void SetActive(); + + ::editeng::SvxBorderLine* GetDefaultFrameLine() const { return pCurFrameLine.get(); } + void SetDefaultFrameLine(const ::editeng::SvxBorderLine* pLine ); + + void Execute( SfxRequest& rReq ); + void GetState( SfxItemSet& rSet ); + + void ExecuteTable( SfxRequest& rReq ); + void GetStateTable( SfxItemSet& rSet ); + + void WindowChanged(); + void ExecDraw(SfxRequest&); + void ExecDrawIns(SfxRequest& rReq); + void GetDrawState(SfxItemSet &rSet); + void GetDrawInsState(SfxItemSet &rSet); + void ExecGallery(const SfxRequest& rReq); + + void ExecChildWin(const SfxRequest& rReq); + + void ExecImageMap( SfxRequest& rReq ); + void GetImageMapState( SfxItemSet& rSet ); + + void ExecuteSave( SfxRequest& rReq ); + void GetSaveState( SfxItemSet& rSet ); + void ExecSearch( SfxRequest& rReq ); + + void ExecuteUndo(SfxRequest& rReq); + void GetUndoState(SfxItemSet &rSet); + + void ExecuteObject(const SfxRequest& rReq); + void GetObjectState(SfxItemSet &rSet); + + void ExecDrawOpt(const SfxRequest& rReq); + void GetDrawOptState(SfxItemSet &rSet); + + void ExecStyle(SfxRequest& rReq); + void GetStyleState(SfxItemSet &rSet); + + void UpdateDrawShell(); + void SetDrawShell( bool bActive ); + void SetDrawTextShell( bool bActive ); + + void SetPivotShell( bool bActive ); + void SetSparklineShell(bool bActive); + void SetDialogDPObject( std::unique_ptr<ScDPObject> pObj ); + const ScDPObject* GetDialogDPObject() const { return pDialogDPObject.get(); } + + void SetDontSwitch(bool bFlag){bDontSwitch=bFlag;} + + void SetAuditShell( bool bActive ); + void SetDrawFormShell( bool bActive ); + void SetEditShell(EditView* pView, bool bActive ); + void SetOleObjectShell( bool bActive ); + void SetChartShell( bool bActive ); + void SetGraphicShell( bool bActive ); + void SetMediaShell( bool bActive ); + + void SetDrawShellOrSub(); + void SetCurSubShell( ObjectSelectionType eOST, bool bForce = false ); + + void SetFormShellAtTop( bool bSet ); + + ObjectSelectionType GetCurObjectSelectionType() const { return eCurOST; } + + virtual ErrCode DoVerb(sal_Int32 nVerb) override; + + void StopEditShell(); + bool IsDrawTextShell() const; + bool IsAuditShell() const; + + void SetDrawTextUndo( SfxUndoManager* pUndoMgr ); + + void FillFieldData( ScHeaderFieldData& rData ); + + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + + ScNavigatorSettings* GetNavigatorSettings(); + + // Drucken: + virtual SfxPrinter* GetPrinter( bool bCreate = false ) override; + virtual sal_uInt16 SetPrinter( SfxPrinter* pNewPrinter, + SfxPrinterChangeFlags nDiffFlags = SFX_PRINTER_ALL ) override; + + virtual bool HasPrintOptionsPage() const override; + virtual std::unique_ptr<SfxTabPage> CreatePrintOptionsPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet &rOptions) override; + + void ConnectObject( const SdrOle2Obj* pObj ); + void ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb); + + void DeactivateOle(); + + static ScTabViewShell* GetActiveViewShell(); + + std::shared_ptr<SfxModelessDialogController> CreateRefDialogController(SfxBindings* pB, SfxChildWindow* pCW, + const SfxChildWinInfo* pInfo, + weld::Window* pParent, sal_uInt16 nSlotId); + + void UpdateOleZoom(); + + virtual const FmFormShell* GetFormShell() const override { return pFormShell.get(); } + virtual FmFormShell* GetFormShell() override { return pFormShell.get(); } + + void InsertURL( const OUString& rName, const OUString& rURL, const OUString& rTarget, + sal_uInt16 nMode ); + void InsertURLButton( const OUString& rName, const OUString& rURL, const OUString& rTarget, + const Point* pInsPos ); + void InsertURLField( const OUString& rName, const OUString& rURL, const OUString& rTarget ); + + bool SelectObject( std::u16string_view rName ); + + void SetInFormatDialog(bool bFlag) {bInFormatDialog=bFlag;} + + void ForceMove() { Move(); } + + static std::unique_ptr<SvxNumberInfoItem> MakeNumberInfoItem( ScDocument& rDoc, const ScViewData& rViewData ); + + static void UpdateNumberFormatter( const SvxNumberInfoItem& rInfoItem ); + + void ExecuteCellFormatDlg( SfxRequest& rReq, const OUString &rTabPage); + + bool GetFunction( OUString& rFuncStr, FormulaError nErrCode ); + + void StartSimpleRefDialog( const OUString& rTitle, const OUString& rInitVal, + bool bCloseOnButtonUp, bool bSingleCell, bool bMultiSelection ); + void StopSimpleRefDialog(); + + void SetCurRefDlgId( sal_uInt16 nNew ); + + void AddAccessibilityObject( SfxListener& rObject ); + void RemoveAccessibilityObject( SfxListener& rObject ); + void BroadcastAccessibility( const SfxHint &rHint ); + bool HasAccessibilityObjects() const; + + bool ExecuteRetypePassDlg(ScPasswordHash eDesiredHash); + + using ScTabView::ShowCursor; + + bool IsActive() const { return bIsActive; } + OUString GetFormula(const ScAddress& rAddress); + bool UseSubTotal(ScRangeList* pRangeList); + OUString DoAutoSum(bool& rRangeFinder, bool& rSubTotal, const OpCode eCode); + + // ugly hack to call Define Names from Manage Names + void SwitchBetweenRefDialogs(SfxModelessDialogController* pDialog); + // #i123629# + bool GetForceFocusOnCurCell() const { return bForceFocusOnCurCell; } + void SetForceFocusOnCurCell(bool bFlag) { bForceFocusOnCurCell=bFlag; } + /// See SfxViewShell::getPart(). + int getPart() const override; + /// See SfxViewShell::afterCallbackRegistered(). + void afterCallbackRegistered() override; + /// See SfxViewShell::NotifyCursor(). + void NotifyCursor(SfxViewShell* pViewShell) const override; + /// See SfxViewShell::GetColorConfigColor(). + ::Color GetColorConfigColor(svtools::ColorConfigEntry nColorType) const override; + /// Emits a LOK_CALLBACK_INVALIDATE_HEADER for all views whose current tab is equal to nCurrentTabIndex + static void notifyAllViewsHeaderInvalidation(const SfxViewShell* pForViewShell, HeaderType eHeaderType, SCTAB nCurrentTabIndex); + static bool isAnyEditViewInRange(const SfxViewShell* pForViewShell, bool bColumns, SCCOLROW nStart, SCCOLROW nEnd); + /// Emits a LOK_CALLBACK_INVALIDATE_SHEET_GEOMETRY for all views whose current tab + /// is equal to nCurrentTabIndex + static void notifyAllViewsSheetGeomInvalidation(const SfxViewShell* pForViewShell, bool bColumns, bool bRows, bool bSizes, + bool bHidden, bool bFiltered, bool bGroups, SCTAB nCurrentTabIndex); + void LOKSendFormulabarUpdate(EditView* pEditView, const OUString& rText, const ESelection& rSelection); + css::uno::Reference<css::drawing::XShapes> getSelectedXShapes(); + static css::uno::Reference<css::datatransfer::XTransferable2> GetClipData(vcl::Window* pWin); + + void InitFormEditData(); + void ClearFormEditData(); + ScFormEditData* GetFormEditData() { return mpFormEditData.get(); } + + virtual tools::Rectangle getLOKVisibleArea() const override; + + const ScDragData& GetDragData() const { return *m_pDragData; } + void SetDragObject(ScTransferObj* pCellObj, ScDrawTransferObj* pDrawObj); + void ResetDragObject(); + void SetDragLink(const OUString& rDoc, const OUString& rTab, const OUString& rArea); + void SetDragJump(ScDocument* pLocalDoc, const OUString& rTarget, const OUString& rText); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |