/* -*- 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 #include #include #include #include #include #include #include #include class SfxObjectShell; class SfxStyleFamilyItem; class SfxTemplateItem; class SfxCommonTemplateDialog_Impl; class SfxTemplateControllerItem; enum class StyleFlags { NONE = 0, UpdateFamilyList = 1, UpdateFamily = 2 }; namespace o3tl { template <> struct typed_flags : is_typed_flags { }; } class TreeViewDropTarget; constexpr int MAX_FAMILIES = 6; constexpr int COUNT_BOUND_FUNC = 14; class StyleList final : public SfxListener { friend class TreeViewDropTarget; friend class SfxTemplateControllerItem; public: // Constructor StyleList(weld::Builder* pBuilder, SfxBindings* pBindings, SfxCommonTemplateDialog_Impl* Parent, weld::Container* pC, OString treeviewname, OString flatviewname); // Destructor ~StyleList(); // This function connects m_xTreeBox, m_xFmtLb and m_pParentDialog with certain LINKs void Initialize(); // It selects the style in treeview // bIsCallBack is true for the selected style. For eg. if "Addressee" is selected in // styles, bIsCallBack will be true for it. void SelectStyle(const OUString& rStr, bool bIsCallback); // Checks whether a family has a saved state bool CurrentFamilyHasState() { return nullptr != m_pFamilyState[m_nActFamily - 1]; } // This function is a subpart of Dialog's SetFamilyState // When a new style is selected for use, it resets it. void SetFamilyState(sal_uInt16 nSlotId, const SfxTemplateItem* pItem); // It is used in Dialog's EnableExample_Impl // When the value of m_bNewbyExampleDisabled is updated there // while creating a new style by example, // the corresponding value gets updated here too. void EnableNewByExample(bool newByExampleDisabled); // This function is used to set a hierarchical view. void SetHierarchical(); // This function handles the controls while setting a filter except hierarchical void SetFilterControlsHandle(); // Return whether treeview is visible // It is used in StyleList's UpdateStyles_Hdl // It is used to defaultly set the hierarchical view bool IsTreeView() const { return m_xTreeBox->get_visible(); } // Helper function: Access to the current family item // Used in Dialog's updateStyleHandler, Execute_Impl etc... const SfxStyleFamilyItem* GetFamilyItem() const; // Used to get the current selected entry in treeview // Used in Dialog's Execute_Impl, Action_Select etc... OUString GetSelectedEntry() const; // Returns the Family Item at ith index // Used in Dialog's ReadResource_Hdl const SfxStyleFamilyItem& GetFamilyItemByIndex(size_t i) const; bool IsHierarchical() const { return m_bHierarchical; } void Enabledel(bool candel) { m_bCanDel = candel; } void Enablehide(bool canhide) { m_bCanHide = canhide; } void Enableshow(bool canshow) { m_bCanShow = canshow; } void Enablenew(bool cannew) { m_bCanNew = cannew; } void Enableedit(bool canedit) { m_bCanEdit = canedit; } // Handles the enabling/Disabling of Preview void EnablePreview(bool bCustomPreview); // Used in Dialog's Execute_Impl // It is a necessary condition to execute a style bool EnableExecute(); void connect_UpdateStyles(const Link& rLink) { m_aUpdateStyles = rLink; } void connect_ReadResource(const Link& rLink) { m_aReadResource = rLink; } void connect_ClearResource(const Link& rLink) { m_aClearResource = rLink; } void connect_LoadFactoryStyleFilter(const Link& rLink); void connect_SaveSelection(const Link rLink); void connect_UpdateFamily(const Link rLink) { m_aUpdateFamily = rLink; } void FamilySelect(sal_uInt16 nEntry); void FilterSelect(sal_uInt16 nActFilter, bool bsetFilter); DECL_LINK(NewMenuExecuteAction, void*, void); private: void FillTreeBox(SfxStyleFamily eFam); void UpdateFamily(); void UpdateStyles(StyleFlags nFlags); OUString getDefaultStyleName(const SfxStyleFamily eFam); SfxStyleFamily GetActualFamily() const; void GetSelectedStyle() const; sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt, const DropTargetHelper& rHelper); void DropHdl(const OUString& rStyle, const OUString& rParent); void MenuSelect(const OString& rIdent); void PrepareMenu(const Point& rPos); void ShowMenu(const CommandEvent& rCEvt); void CreateContextMenu(); void Notify(SfxBroadcaster& rBC, const SfxHint& rHint); // In which FamilyState do I have to look, in order to get the // information of the ith Family in the pStyleFamilies. sal_uInt16 StyleNrToInfoOffset(sal_uInt16 i); DECL_LINK(ReadResource, void*, size_t); DECL_LINK(Clear, void*, void); DECL_LINK(Cleanup, void*, void); DECL_LINK(ExecuteDrop, const ExecuteDropEvent&, sal_Int8); DECL_LINK(IsSafeForWaterCan, void*, bool); DECL_LINK(HasSelectedStyle, void*, bool); DECL_LINK(UpdateStyleDependents, void*, void); DECL_LINK(TimeOut, Timer*, void); DECL_LINK(EnableTreeDrag, bool, void); DECL_LINK(EnableDelete, void*, void); DECL_LINK(SetWaterCanState, const SfxBoolItem*, void); DECL_LINK(SetFamily, sal_uInt16, void); void InvalidateBindings(); void Update(); Link m_aUpdateStyles; Link m_aReadResource; Link m_aClearResource; Link m_aLoadFactoryStyleFilter; Link m_aSaveSelection; Link m_aUpdateFamily; void NewHdl(); void EditHdl(); void DeleteHdl(); void HideHdl(); void ShowHdl(); DECL_LINK(DragBeginHdl, bool&, bool); DECL_LINK(KeyInputHdl, const KeyEvent&, bool); DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString); DECL_LINK(CustomRenderHdl, weld::TreeView::render_args, void); DECL_LINK(FmtSelectHdl, weld::TreeView&, void); DECL_LINK(TreeListApplyHdl, weld::TreeView&, bool); DECL_LINK(MousePressHdl, const MouseEvent&, bool); DECL_STATIC_LINK(StyleList, CustomGetSizeHdl, weld::TreeView::get_size_args, Size); DECL_LINK(PopupFlatMenuHdl, const CommandEvent&, bool); DECL_LINK(PopupTreeMenuHdl, const CommandEvent&, bool); DECL_LINK(MenuSelectAsyncHdl, void*, void); bool m_bHierarchical : 1; bool m_bAllowReParentDrop : 1; bool m_bNewByExampleDisabled : 1; bool m_bDontUpdate : 1; bool m_bTreeDrag : 1; bool m_bCanEdit : 1; bool m_bCanHide : 1; bool m_bCanShow : 1; bool m_bCanNew : 1; bool m_bUpdateFamily : 1; bool m_bCanDel : 1; bool m_bBindingUpdate : 1; SfxStyleSheetBasePool* m_pStyleSheetPool; sal_uInt16 m_nActFilter; std::unique_ptr m_xFmtLb; std::unique_ptr m_xTreeBox; std::unique_ptr mxMenuBuilder; std::unique_ptr mxMenu; std::optional m_xStyleFamilies; std::array, MAX_FAMILIES> m_pFamilyState; SfxObjectShell* m_pCurObjShell; sal_uInt16 m_nActFamily; SfxStyleSearchBits m_nAppFilter; // Filter, which has set the application (for automatic) std::unique_ptr m_xTreeView1DropTargetHelper; std::unique_ptr m_xTreeView2DropTargetHelper; SfxCommonTemplateDialog_Impl* m_pParentDialog; SfxBindings* m_pBindings; std::array, COUNT_BOUND_FUNC> pBoundItems; std::unique_ptr pIdle; OString sLastItemIdent; SfxModule* m_Module; sal_uInt16 m_nModifier; weld::Container* m_pContainer; };