Branch data Line data Source code
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 _SVX_FMEXCH_HXX
20 : : #define _SVX_FMEXCH_HXX
21 : :
22 : : #include <comphelper/stl_types.hxx>
23 : : #include <svtools/transfer.hxx>
24 : : #include <com/sun/star/uno/Sequence.hxx>
25 : : #include <com/sun/star/container/XNameContainer.hpp>
26 : : #include <tools/link.hxx>
27 : :
28 : : #include <svx/svxdllapi.h>
29 : :
30 : : class SvLBoxEntry;
31 : :
32 : : //========================================================================
33 : : class SvTreeListBox;
34 : :
35 : : //........................................................................
36 : : namespace svxform
37 : : {
38 : : //........................................................................
39 : :
40 : : //====================================================================
41 : :
42 : : typedef ::std::set< SvLBoxEntry* > ListBoxEntrySet;
43 : :
44 : : //====================================================================
45 : : //= OLocalExchange
46 : : //====================================================================
47 [ # # ]: 0 : class SVX_DLLPUBLIC OLocalExchange : public TransferableHelper
48 : : {
49 : : private:
50 : : Link m_aClipboardListener;
51 : : sal_Bool m_bDragging : 1;
52 : : sal_Bool m_bClipboardOwner : 1;
53 : :
54 : : public:
55 : : class GrantAccess
56 : : {
57 : : friend class OLocalExchangeHelper;
58 : : };
59 : :
60 : : public:
61 : : OLocalExchange( );
62 : :
63 : 0 : sal_Bool isDragging() const { return m_bDragging; }
64 : 0 : sal_Bool isClipboardOwner() const { return m_bClipboardOwner; }
65 : :
66 : : void startDrag( Window* pWindow, sal_Int8 nDragSourceActions, const GrantAccess& );
67 : : void copyToClipboard( Window* _pWindow, const GrantAccess& );
68 : :
69 : 0 : void setClipboardListener( const Link& _rListener ) { m_aClipboardListener = _rListener; }
70 : :
71 : : void clear();
72 : :
73 : : static sal_Bool hasFormat( const DataFlavorExVector& _rFormats, sal_uInt32 _nFormatId );
74 : :
75 : : protected:
76 : : // XClipboardOwner
77 : : 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);
78 : :
79 : : // TransferableHelper
80 : : virtual void DragFinished( sal_Int8 nDropAction );
81 : : virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor );
82 : :
83 : : private:
84 : 0 : void StartDrag( Window* pWindow, sal_Int8 nDragSourceActions, sal_Int32 nDragPointer = DND_POINTER_NONE, sal_Int32 nDragImage = DND_IMAGE_NONE )
85 : : { // don't allow this base class method to be called from outside
86 : 0 : TransferableHelper::StartDrag(pWindow, nDragSourceActions, nDragPointer, nDragImage);
87 : 0 : }
88 : : };
89 : :
90 : : //====================================================================
91 : : //= OLocalExchangeHelper
92 : : //====================================================================
93 : : /// a helper for navigator windows (SvTreeListBox'es) which allow DnD within themself
94 : : class SVX_DLLPUBLIC OLocalExchangeHelper
95 : : {
96 : : protected:
97 : : Window* m_pDragSource;
98 : : OLocalExchange* m_pTransferable;
99 : :
100 : : public:
101 : : OLocalExchangeHelper( Window* _pDragSource );
102 : : virtual ~OLocalExchangeHelper();
103 : :
104 : : void prepareDrag( );
105 : :
106 : : void startDrag( sal_Int8 nDragSourceActions );
107 : : void copyToClipboard( ) const;
108 : :
109 [ # # ][ # # ]: 0 : inline sal_Bool isDragSource() const { return m_pTransferable && m_pTransferable->isDragging(); }
110 [ # # ][ # # ]: 0 : inline sal_Bool isClipboardOwner() const { return m_pTransferable && m_pTransferable->isClipboardOwner(); }
111 [ # # ][ # # ]: 0 : inline sal_Bool isDataExchangeActive( ) const { return isDragSource() || isClipboardOwner(); }
112 [ # # ]: 0 : inline void clear() { if ( isDataExchangeActive() ) m_pTransferable->clear(); }
113 : :
114 [ # # ]: 0 : SVX_DLLPRIVATE void setClipboardListener( const Link& _rListener ) { if ( m_pTransferable ) m_pTransferable->setClipboardListener( _rListener ); }
115 : :
116 : : protected:
117 : : SVX_DLLPRIVATE virtual OLocalExchange* createExchange() const = 0;
118 : :
119 : : protected:
120 : : SVX_DLLPRIVATE void implReset();
121 : : };
122 : :
123 : : //====================================================================
124 : : //= OControlTransferData
125 : : //====================================================================
126 [ # # ][ # # ]: 0 : class OControlTransferData
127 : : {
128 : : private:
129 : : typedef ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< sal_uInt32 > > ControlPaths;
130 : :
131 : : private:
132 : : DataFlavorExVector m_aCurrentFormats;
133 : :
134 : : protected:
135 : : ListBoxEntrySet m_aSelectedEntries;
136 : : ControlPaths m_aControlPaths;
137 : : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > >
138 : : m_aHiddenControlModels;
139 : :
140 : : ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >
141 : : m_xFormsRoot; // the root of the forms collection where the entries we represent reside
142 : : // this uniquely identifies the page and the document
143 : :
144 : : SvLBoxEntry* m_pFocusEntry;
145 : :
146 : : protected:
147 : : // updates m_aCurrentFormats with all formats we currently could supply
148 : : void updateFormats( );
149 : :
150 : : public:
151 : : OControlTransferData( );
152 : :
153 : : // ctor to construct the data from an arbitrary Transferable (usually clipboard data)
154 : : OControlTransferData(
155 : : const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& _rxTransferable
156 : : );
157 : :
158 : : inline const DataFlavorExVector& GetDataFlavorExVector() const;
159 : :
160 : : void addSelectedEntry( SvLBoxEntry* _pEntry );
161 : : void setFocusEntry( SvLBoxEntry* _pFocusEntry );
162 : :
163 : : /** notifies the data transfer object that a certain entry has been removed from the owning tree
164 : :
165 : : In case the removed entry is part of the transfer object's selection, the entry is removed from
166 : : the selection.
167 : :
168 : : @param _pEntry
169 : : @return the number of entries remaining in the selection.
170 : : */
171 : : size_t onEntryRemoved( SvLBoxEntry* _pEntry );
172 : :
173 : 0 : void setFormsRoot(
174 : : const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& _rxFormsRoot
175 : 0 : ) { m_xFormsRoot = _rxFormsRoot; }
176 : :
177 : : void buildPathFormat(SvTreeListBox* pTreeBox, SvLBoxEntry* pRoot);
178 : : // baut aus m_aSelectedEntries m_aControlPaths auf
179 : : // (es wird davon ausgegangen, dass die Eintraege in m_aSelectedEntries sortiert sind in Bezug auf die Nachbar-Beziehung)
180 : :
181 : :
182 : : void buildListFromPath(SvTreeListBox* pTreeBox, SvLBoxEntry* pRoot);
183 : : // der umgekehrte Weg : wirft alles aus m_aSelectedEntries weg und baut es mittels m_aControlPaths neu auf
184 : :
185 : : void addHiddenControlsFormat(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > seqInterfaces);
186 : : // fuegt ein SVX_FML_HIDDEN_CONTROLS-Format hinzu und merk sich dafuer die uebergebenen Interfaces
187 : : // (es erfolgt KEINE Ueberpruefung, ob dadurch auch tatsaechlich nur hidden Controls bezeichnet werden, dass muss der
188 : : // Aufrufer sicherstellen)
189 : :
190 : : SvLBoxEntry* focused() const { return m_pFocusEntry; }
191 : 0 : const ListBoxEntrySet& selected() const { return m_aSelectedEntries; }
192 : : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > >
193 : 0 : hiddenControls() const { return m_aHiddenControlModels; }
194 : :
195 : : ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >
196 : 0 : getFormsRoot() const { return m_xFormsRoot; }
197 : : };
198 : :
199 : : //====================================================================
200 : 0 : inline const DataFlavorExVector& OControlTransferData::GetDataFlavorExVector() const
201 : : {
202 : 0 : const_cast< OControlTransferData* >( this )->updateFormats( );
203 : 0 : return m_aCurrentFormats;
204 : : }
205 : :
206 : : //====================================================================
207 : : //= OControlExchange
208 : : //====================================================================
209 [ # # ][ # # ]: 0 : class OControlExchange : public OLocalExchange, public OControlTransferData
210 : : {
211 : : public:
212 : : OControlExchange( );
213 : :
214 : : public:
215 : : static sal_uInt32 getFieldExchangeFormatId( );
216 : : static sal_uInt32 getControlPathFormatId( );
217 : : static sal_uInt32 getHiddenControlModelsFormatId( );
218 : :
219 : : inline static sal_Bool hasFieldExchangeFormat( const DataFlavorExVector& _rFormats );
220 : : inline static sal_Bool hasControlPathFormat( const DataFlavorExVector& _rFormats );
221 : : inline static sal_Bool hasHiddenControlModelsFormat( const DataFlavorExVector& _rFormats );
222 : :
223 : : protected:
224 : : virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor );
225 : : virtual void AddSupportedFormats();
226 : : };
227 : :
228 : : //====================================================================
229 : : //= OControlExchangeHelper
230 : : //====================================================================
231 [ # # ]: 0 : class OControlExchangeHelper : public OLocalExchangeHelper
232 : : {
233 : : public:
234 : 0 : OControlExchangeHelper(Window* _pDragSource) : OLocalExchangeHelper(_pDragSource) { }
235 : :
236 : 0 : OControlExchange* operator->() const { return static_cast< OControlExchange* >( m_pTransferable ); }
237 : 0 : OControlExchange& operator*() const { return *static_cast< OControlExchange* >( m_pTransferable ); }
238 : :
239 : : protected:
240 : : virtual OLocalExchange* createExchange() const;
241 : : };
242 : :
243 : : //====================================================================
244 : : //====================================================================
245 : 0 : inline sal_Bool OControlExchange::hasFieldExchangeFormat( const DataFlavorExVector& _rFormats )
246 : : {
247 : 0 : return hasFormat( _rFormats, getFieldExchangeFormatId() );
248 : : }
249 : :
250 : 0 : inline sal_Bool OControlExchange::hasControlPathFormat( const DataFlavorExVector& _rFormats )
251 : : {
252 : 0 : return hasFormat( _rFormats, getControlPathFormatId() );
253 : : }
254 : :
255 : 0 : inline sal_Bool OControlExchange::hasHiddenControlModelsFormat( const DataFlavorExVector& _rFormats )
256 : : {
257 : 0 : return hasFormat( _rFormats, getHiddenControlModelsFormatId() );
258 : : }
259 : :
260 : : //........................................................................
261 : : } // namespace svxform
262 : : //........................................................................
263 : :
264 : : #endif
265 : :
266 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|