1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #ifndef _SVX_FMEXCH_HXX 28 #define _SVX_FMEXCH_HXX 29 30 #include <comphelper/stl_types.hxx> 31 #include <svtools/transfer.hxx> 32 #include <com/sun/star/uno/Sequence.hxx> 33 #include <com/sun/star/container/XNameContainer.hpp> 34 #include <tools/link.hxx> 35 36 #include <svx/svxdllapi.h> 37 38 class FmFormShell; 39 class FmFormPage; 40 class SvLBoxEntry; 41 42 //======================================================================== 43 // Exchange types 44 #define SVX_FM_FIELD_EXCH String("SvxFormFieldExch", sizeof("SvxFormFieldExch")) 45 #define SVX_FM_CONTROL_EXCH String("SvxFormExplCtrlExch", sizeof("SvxFormExplCtrlExch")) 46 #define SVX_FM_CONTROLS_AS_PATH String("SvxFormControlsAsPathExchange", sizeof("SvxFormControlsAsPathExchange")) 47 #define SVX_FM_HIDDEN_CONTROLS String("SvxFormHiddenControlsExchange", sizeof("SvxFormHiddenControlsExchange")) 48 #define SVX_FM_FILTER_FIELDS String("SvxFilterFieldExchange", sizeof("SvxFilterFieldExchange")) 49 50 //======================================================================== 51 class SvTreeListBox; 52 53 //........................................................................ 54 namespace svxform 55 { 56 //........................................................................ 57 58 //==================================================================== 59 60 typedef ::std::set< SvLBoxEntry* > ListBoxEntrySet; 61 62 //==================================================================== 63 //= OLocalExchange 64 //==================================================================== 65 class SVX_DLLPUBLIC OLocalExchange : public TransferableHelper 66 { 67 private: 68 Link m_aClipboardListener; 69 sal_Bool m_bDragging : 1; 70 sal_Bool m_bClipboardOwner : 1; 71 72 public: 73 class GrantAccess 74 { 75 friend class OLocalExchangeHelper; 76 }; 77 78 public: 79 OLocalExchange( ); 80 81 sal_Bool isDragging() const { return m_bDragging; } 82 sal_Bool isClipboardOwner() const { return m_bClipboardOwner; } 83 84 void startDrag( Window* pWindow, sal_Int8 nDragSourceActions, const GrantAccess& ); 85 void copyToClipboard( Window* _pWindow, const GrantAccess& ); 86 87 void setClipboardListener( const Link& _rListener ) { m_aClipboardListener = _rListener; } 88 89 void clear(); 90 91 static sal_Bool hasFormat( const DataFlavorExVector& _rFormats, sal_uInt32 _nFormatId ); 92 93 protected: 94 // XClipboardOwner 95 virtual void SAL_CALL lostOwnership( const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard >& _rxClipboard, const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& _rxTrans ) throw(::com::sun::star::uno::RuntimeException); 96 97 // TransferableHelper 98 virtual void DragFinished( sal_Int8 nDropAction ); 99 virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); 100 101 private: 102 void StartDrag( Window* pWindow, sal_Int8 nDragSourceActions, sal_Int32 nDragPointer = DND_POINTER_NONE, sal_Int32 nDragImage = DND_IMAGE_NONE ) 103 { // don't allow this base class method to be called from outside 104 TransferableHelper::StartDrag(pWindow, nDragSourceActions, nDragPointer, nDragImage); 105 } 106 }; 107 108 //==================================================================== 109 //= OLocalExchangeHelper 110 //==================================================================== 111 /// a helper for navigator windows (SvTreeListBox'es) which allow DnD within themself 112 class SVX_DLLPUBLIC OLocalExchangeHelper 113 { 114 protected: 115 Window* m_pDragSource; 116 OLocalExchange* m_pTransferable; 117 118 public: 119 OLocalExchangeHelper( Window* _pDragSource ); 120 virtual ~OLocalExchangeHelper(); 121 122 void prepareDrag( ); 123 124 void startDrag( sal_Int8 nDragSourceActions ); 125 void copyToClipboard( ) const; 126 127 inline sal_Bool isDragSource() const { return m_pTransferable && m_pTransferable->isDragging(); } 128 inline sal_Bool isClipboardOwner() const { return m_pTransferable && m_pTransferable->isClipboardOwner(); } 129 inline sal_Bool isDataExchangeActive( ) const { return isDragSource() || isClipboardOwner(); } 130 inline void clear() { if ( isDataExchangeActive() ) m_pTransferable->clear(); } 131 132 SVX_DLLPRIVATE void setClipboardListener( const Link& _rListener ) { if ( m_pTransferable ) m_pTransferable->setClipboardListener( _rListener ); } 133 134 protected: 135 SVX_DLLPRIVATE virtual OLocalExchange* createExchange() const = 0; 136 137 protected: 138 SVX_DLLPRIVATE void implReset(); 139 }; 140 141 //==================================================================== 142 //= OControlTransferData 143 //==================================================================== 144 class OControlTransferData 145 { 146 private: 147 typedef ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< sal_uInt32 > > ControlPaths; 148 149 private: 150 DataFlavorExVector m_aCurrentFormats; 151 152 protected: 153 ListBoxEntrySet m_aSelectedEntries; 154 ControlPaths m_aControlPaths; 155 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > 156 m_aHiddenControlModels; 157 158 ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > 159 m_xFormsRoot; // the root of the forms collection where the entries we represent reside 160 // this uniquely identifies the page and the document 161 162 SvLBoxEntry* m_pFocusEntry; 163 164 protected: 165 // updates m_aCurrentFormats with all formats we currently could supply 166 void updateFormats( ); 167 168 public: 169 OControlTransferData( ); 170 171 // ctor to construct the data from an arbitrary Transferable (usually clipboard data) 172 OControlTransferData( 173 const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& _rxTransferable 174 ); 175 176 inline const DataFlavorExVector& GetDataFlavorExVector() const; 177 178 void addSelectedEntry( SvLBoxEntry* _pEntry ); 179 void setFocusEntry( SvLBoxEntry* _pFocusEntry ); 180 181 /** notifies the data transfer object that a certain entry has been removed from the owning tree 182 183 In case the removed entry is part of the transfer object's selection, the entry is removed from 184 the selection. 185 186 @param _pEntry 187 @return the number of entries remaining in the selection. 188 */ 189 size_t onEntryRemoved( SvLBoxEntry* _pEntry ); 190 191 void setFormsRoot( 192 const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& _rxFormsRoot 193 ) { m_xFormsRoot = _rxFormsRoot; } 194 195 void buildPathFormat(SvTreeListBox* pTreeBox, SvLBoxEntry* pRoot); 196 // baut aus m_aSelectedEntries m_aControlPaths auf 197 // (es wird davon ausgegangen, dass die Eintraege in m_aSelectedEntries sortiert sind in Bezug auf die Nachbar-Beziehung) 198 199 200 void buildListFromPath(SvTreeListBox* pTreeBox, SvLBoxEntry* pRoot); 201 // der umgekehrte Weg : wirft alles aus m_aSelectedEntries weg und baut es mittels m_aControlPaths neu auf 202 203 void addHiddenControlsFormat(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > seqInterfaces); 204 // fuegt ein SVX_FML_HIDDEN_CONTROLS-Format hinzu und merk sich dafuer die uebergebenen Interfaces 205 // (es erfolgt KEINE Ueberpruefung, ob dadurch auch tatsaechlich nur hidden Controls bezeichnet werden, dass muss der 206 // Aufrufer sicherstellen) 207 208 SvLBoxEntry* focused() const { return m_pFocusEntry; } 209 const ListBoxEntrySet& selected() const { return m_aSelectedEntries; } 210 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > 211 hiddenControls() const { return m_aHiddenControlModels; } 212 213 ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > 214 getFormsRoot() const { return m_xFormsRoot; } 215 }; 216 217 //==================================================================== 218 inline const DataFlavorExVector& OControlTransferData::GetDataFlavorExVector() const 219 { 220 const_cast< OControlTransferData* >( this )->updateFormats( ); 221 return m_aCurrentFormats; 222 } 223 224 //==================================================================== 225 //= OControlExchange 226 //==================================================================== 227 class OControlExchange : public OLocalExchange, public OControlTransferData 228 { 229 public: 230 OControlExchange( ); 231 232 public: 233 static sal_uInt32 getFieldExchangeFormatId( ); 234 static sal_uInt32 getControlPathFormatId( ); 235 static sal_uInt32 getHiddenControlModelsFormatId( ); 236 237 inline static sal_Bool hasFieldExchangeFormat( const DataFlavorExVector& _rFormats ); 238 inline static sal_Bool hasControlPathFormat( const DataFlavorExVector& _rFormats ); 239 inline static sal_Bool hasHiddenControlModelsFormat( const DataFlavorExVector& _rFormats ); 240 241 protected: 242 virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); 243 virtual void AddSupportedFormats(); 244 }; 245 246 //==================================================================== 247 //= OControlExchangeHelper 248 //==================================================================== 249 class OControlExchangeHelper : public OLocalExchangeHelper 250 { 251 public: 252 OControlExchangeHelper(Window* _pDragSource) : OLocalExchangeHelper(_pDragSource) { } 253 254 OControlExchange* operator->() const { return static_cast< OControlExchange* >( m_pTransferable ); } 255 OControlExchange& operator*() const { return *static_cast< OControlExchange* >( m_pTransferable ); } 256 257 protected: 258 virtual OLocalExchange* createExchange() const; 259 }; 260 261 //==================================================================== 262 //==================================================================== 263 inline sal_Bool OControlExchange::hasFieldExchangeFormat( const DataFlavorExVector& _rFormats ) 264 { 265 return hasFormat( _rFormats, getFieldExchangeFormatId() ); 266 } 267 268 inline sal_Bool OControlExchange::hasControlPathFormat( const DataFlavorExVector& _rFormats ) 269 { 270 return hasFormat( _rFormats, getControlPathFormatId() ); 271 } 272 273 inline sal_Bool OControlExchange::hasHiddenControlModelsFormat( const DataFlavorExVector& _rFormats ) 274 { 275 return hasFormat( _rFormats, getHiddenControlModelsFormatId() ); 276 } 277 278 //........................................................................ 279 } // namespace svxform 280 //........................................................................ 281 282 #endif 283 284