1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 #ifndef INCLUDED_SVX_FMGRIDCL_HXX 20 #define INCLUDED_SVX_FMGRIDCL_HXX 21 22 #include <svx/gridctrl.hxx> 23 #include <vcl/transfer.hxx> 24 #include <svx/svxdllapi.h> 25 #include <memory> 26 27 namespace com::sun::star::beans { class XPropertySet; } 28 namespace com::sun::star::container { class XIndexContainer; } 29 namespace com::sun::star::container { class XNameAccess; } 30 31 // FmGridHeader 32 33 struct FmGridHeaderData; 34 class SAL_WARN_UNUSED SVX_DLLPUBLIC FmGridHeader 35 :public ::svt::EditBrowserHeader 36 ,public DropTargetHelper 37 { 38 protected: 39 std::unique_ptr<FmGridHeaderData> m_pImpl; 40 41 public: 42 FmGridHeader( BrowseBox* pParent, WinBits nWinBits = WB_STDHEADERBAR | WB_DRAG ); 43 virtual ~FmGridHeader() override; 44 virtual void dispose() override; 45 46 public: 47 // trigger context menu execution 48 void triggerColumnContextMenu( const ::Point& _rPreferredPos ); 49 50 protected: 51 virtual void Command( const CommandEvent& rCEvt ) override; 52 virtual void RequestHelp( const HelpEvent& rHEvt ) override; 53 virtual void Select() override; 54 55 /** the value returned by GetItemPos is meaningless for the grid model if there are hidden columns, 56 so use GetModelColumnPos instead 57 */ 58 sal_uInt16 GetModelColumnPos(sal_uInt16 nId) const; 59 60 /** This is called before executing a context menu for a column. rMenu contains the initial entries 61 handled by this base class' method (which always has to be called). 62 Derived classes may alter the menu in any way and handle any additional entries in 63 PostExecuteColumnContextMenu. 64 All disabled entries will be removed before executing the menu, so be careful with separators 65 near entries you probably wish to disable ... 66 */ 67 virtual void PreExecuteColumnContextMenu(sal_uInt16 nColId, PopupMenu& rMenu); 68 /** After executing the context menu for a column this method is called. 69 */ 70 virtual void PostExecuteColumnContextMenu(sal_uInt16 nColId, const PopupMenu& rMenu, sal_uInt16 nExecutionResult); 71 72 // DropTargetHelper 73 virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; 74 virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; 75 76 /** selects the column at the selection supplier. 77 @param nColumnId 78 The column id. 79 */ 80 void notifyColumnSelect(sal_uInt16 nColumnId); 81 private: 82 DECL_LINK( OnAsyncExecuteDrop, void*, void ); 83 }; 84 85 86 // FmGridControl 87 88 class FmXGridPeer; 89 class SAL_WARN_UNUSED SVX_DLLPUBLIC FmGridControl : public DbGridControl 90 91 { 92 friend class FmGridHeader; 93 friend class FmXGridPeer; 94 95 FmXGridPeer* m_pPeer; 96 sal_Int32 m_nCurrentSelectedColumn; // this is the column model (not the view) position... 97 sal_uInt16 m_nMarkedColumnId; 98 bool m_bSelecting; 99 bool m_bInColumnMove : 1; 100 101 public: 102 FmGridControl( 103 const css::uno::Reference< css::uno::XComponentContext >&, 104 vcl::Window* pParent, 105 FmXGridPeer* _pPeer, 106 WinBits nBits); 107 108 // Window 109 virtual void KeyInput( const KeyEvent& rKEvt ) override; 110 111 // css::beans::XPropertyChangeListener 112 void propertyChange(const css::beans::PropertyChangeEvent& evt); 113 114 // css::form::XPositioningListener 115 void positioned(); 116 117 // XBound 118 bool commit(); 119 120 // css::form::XInsertListener 121 void inserted(); 122 123 void markColumn(sal_uInt16 nId); 124 bool isColumnMarked(sal_uInt16 nId) const; 125 GetSelectedColumn() const126 sal_Int32 GetSelectedColumn() const { return m_nCurrentSelectedColumn;} 127 128 /** return the name of the specified object. 129 @param eObjType 130 The type to ask for 131 @param _nPosition 132 The position of a tablecell (index position), header bar column/row cell 133 @return 134 The name of the specified object. 135 */ 136 virtual OUString GetAccessibleObjectName( ::vcl::AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const override; 137 138 /** return the description of the specified object. 139 @param eObjType 140 The type to ask for 141 @param _nPosition 142 The position of a tablecell (index position), header bar column/row cell 143 @return 144 The description of the specified object. 145 */ 146 virtual OUString GetAccessibleObjectDescription( ::vcl::AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const override; 147 148 protected: 149 virtual void Command(const CommandEvent& rEvt) override; 150 151 virtual VclPtr<BrowserHeader> imp_CreateHeaderBar(BrowseBox* pParent) override; 152 virtual long QueryMinimumRowHeight() override; 153 virtual void RowHeightChanged() override; 154 virtual void ColumnResized(sal_uInt16 nId) override; 155 virtual void ColumnMoved(sal_uInt16 nId) override; 156 virtual void DeleteSelectedRows() override; 157 virtual void SetDesignMode(bool bMode) override; 158 virtual void CellModified() override; 159 virtual void HideColumn(sal_uInt16 nId) override; 160 virtual void ShowColumn(sal_uInt16 nId) override; 161 IsInColumnMove() const162 bool IsInColumnMove() const {return m_bInColumnMove;} 163 164 virtual void BeginCursorAction() override; 165 virtual void EndCursorAction() override; 166 virtual void Select() override; 167 168 // Initialize columns 169 // a.) only by column description 170 void InitColumnsByModels(const css::uno::Reference< css::container::XIndexContainer >& xColumns); 171 // b.) during alivemode by database fields 172 virtual void InitColumnsByFields(const css::uno::Reference< css::container::XIndexAccess >& xFields) override; 173 174 // some kind of impl version (for one single column) of our version of InitColumnsByFields 175 static void InitColumnByField( 176 DbGridColumn* _pColumn, 177 const css::uno::Reference< css::beans::XPropertySet >& _rxColumnModel, 178 const css::uno::Reference< css::container::XNameAccess >& _rxFieldsByNames, 179 const css::uno::Reference< css::container::XIndexAccess >& _rxFieldsByIndex 180 ); 181 GetPeer() const182 FmXGridPeer* GetPeer() const {return m_pPeer;} 183 184 css::uno::Sequence< css::uno::Any> 185 getSelectionBookmarks(); 186 bool selectBookmarks(const css::uno::Sequence< css::uno::Any>& _rBookmarks); 187 188 /** returns if a column is selected 189 @param _pColumn 190 The column to compare with. 191 @return 192 <TRUE/> if the column is selected, otherwise <FALSE/> 193 */ 194 bool isColumnSelected(DbGridColumn const * _pColumn); 195 }; 196 197 #endif // INCLUDED_SVX_FMGRIDCL_HXX 198 199 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 200