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 INCLUDED_SVX_SOURCE_INC_FMEXPL_HXX
20 : #define INCLUDED_SVX_SOURCE_INC_FMEXPL_HXX
21 :
22 : #include <svl/lstner.hxx>
23 : #include <svl/brdcst.hxx>
24 : #include <vcl/window.hxx>
25 : #include <sfx2/childwin.hxx>
26 : #include <svl/poolitem.hxx>
27 : #include <sfx2/bindings.hxx>
28 : #include <sfx2/dockwin.hxx>
29 : #include <sfx2/ctrlitem.hxx>
30 : #include <vcl/image.hxx>
31 :
32 : #include <com/sun/star/container/XNameContainer.hpp>
33 : #include <com/sun/star/form/XForm.hpp>
34 : #include <com/sun/star/form/XFormComponent.hpp>
35 : #include <com/sun/star/beans/PropertyChangeEvent.hpp>
36 : #include <com/sun/star/container/XContainerListener.hpp>
37 : #include <com/sun/star/container/XContainer.hpp>
38 : #include <com/sun/star/beans/XPropertyChangeListener.hpp>
39 : #include <com/sun/star/container/XIndexContainer.hpp>
40 :
41 : #include <svtools/treelistbox.hxx>
42 :
43 : #include <vcl/dialog.hxx>
44 : #include <vcl/group.hxx>
45 : #include <vcl/button.hxx>
46 : #include <vcl/fixed.hxx>
47 : #include <vcl/edit.hxx>
48 : #include <vcl/dockwin.hxx>
49 : #include <svx/fmview.hxx>
50 :
51 : #include "fmexch.hxx"
52 : #include <vector>
53 : #include <set>
54 :
55 : class SdrObjListIter;
56 : class FmFormShell;
57 : class SdrObject;
58 : class FmFormModel;
59 : class FmFormView;
60 : class SdrMarkList;
61 :
62 :
63 : class FmEntryData;
64 : class FmNavInsertedHint : public SfxHint
65 : {
66 : FmEntryData* pEntryData;
67 : sal_uInt32 nPos;
68 :
69 : public:
70 : TYPEINFO_OVERRIDE();
71 : FmNavInsertedHint( FmEntryData* pInsertedEntryData, sal_uInt32 nRelPos );
72 : virtual ~FmNavInsertedHint();
73 :
74 0 : FmEntryData* GetEntryData() const { return pEntryData; }
75 0 : sal_uInt32 GetRelPos() const { return nPos; }
76 : };
77 :
78 :
79 : class FmNavModelReplacedHint : public SfxHint
80 : {
81 : FmEntryData* pEntryData; // die Daten des Eintrages, der ein neues Model bekommen hat
82 :
83 : public:
84 : TYPEINFO_OVERRIDE();
85 : FmNavModelReplacedHint( FmEntryData* pAffectedEntryData );
86 : virtual ~FmNavModelReplacedHint();
87 :
88 0 : FmEntryData* GetEntryData() const { return pEntryData; }
89 : };
90 :
91 :
92 : class FmNavRemovedHint : public SfxHint
93 : {
94 : FmEntryData* pEntryData;
95 :
96 : public:
97 : TYPEINFO_OVERRIDE();
98 : FmNavRemovedHint( FmEntryData* pInsertedEntryData );
99 : virtual ~FmNavRemovedHint();
100 :
101 0 : FmEntryData* GetEntryData() const { return pEntryData; }
102 : };
103 :
104 :
105 : class FmNavNameChangedHint : public SfxHint
106 : {
107 : FmEntryData* pEntryData;
108 : OUString aNewName;
109 :
110 : public:
111 : TYPEINFO_OVERRIDE();
112 : FmNavNameChangedHint( FmEntryData* pData, const OUString& rNewName );
113 : virtual ~FmNavNameChangedHint();
114 :
115 0 : FmEntryData* GetEntryData() const { return pEntryData; }
116 0 : OUString GetNewName() const { return aNewName; }
117 : };
118 :
119 :
120 : class FmNavClearedHint : public SfxHint
121 : {
122 : public:
123 : TYPEINFO_OVERRIDE();
124 : FmNavClearedHint();
125 : virtual ~FmNavClearedHint();
126 : };
127 :
128 :
129 : class FmNavViewMarksChanged : public SfxHint
130 : {
131 : FmFormView* pView;
132 : public:
133 : TYPEINFO_OVERRIDE();
134 0 : FmNavViewMarksChanged(FmFormView* pWhichView) { pView = pWhichView; }
135 0 : virtual ~FmNavViewMarksChanged() {}
136 :
137 0 : FmFormView* GetAffectedView() { return pView; }
138 : };
139 :
140 :
141 : class FmEntryDataList;
142 : class FmEntryData
143 : {
144 : private:
145 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xNormalizedIFace;
146 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xProperties;
147 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XChild > m_xChild;
148 :
149 : protected:
150 : Image m_aNormalImage;
151 : OUString aText;
152 :
153 : FmEntryDataList* pChildList;
154 : FmEntryData* pParent;
155 :
156 : protected:
157 : void newObject( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxIFace );
158 :
159 : public:
160 : TYPEINFO();
161 :
162 : FmEntryData( FmEntryData* pParentData, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rIFace );
163 : FmEntryData( const FmEntryData& rEntryData );
164 : virtual ~FmEntryData();
165 :
166 : void Clear();
167 0 : void SetText( const OUString& rText ){ aText = rText; }
168 0 : void SetParent( FmEntryData* pParentData ){ pParent = pParentData; }
169 :
170 0 : const Image& GetNormalImage() const { return m_aNormalImage; }
171 :
172 0 : OUString GetText() const { return aText; }
173 0 : FmEntryData* GetParent() const { return pParent; }
174 0 : FmEntryDataList* GetChildList() const { return pChildList; }
175 :
176 : virtual sal_Bool IsEqualWithoutChildren( FmEntryData* pEntryData );
177 : virtual FmEntryData* Clone() = 0;
178 :
179 : // note that the interface returned is normalized, i.e. querying the given XInterface of the object
180 : // for XInterface must return the interface itself.
181 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& GetElement() const
182 : {
183 0 : return m_xNormalizedIFace;
184 : }
185 :
186 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& GetPropertySet() const
187 : {
188 0 : return m_xProperties;
189 : }
190 :
191 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::container::XChild >& GetChildIFace() const
192 : {
193 0 : return m_xChild;
194 : }
195 : };
196 :
197 :
198 : typedef ::std::vector< FmEntryData* > FmEntryDataBaseList;
199 :
200 : class FmEntryDataList
201 : {
202 : private:
203 : FmEntryDataBaseList maEntryDataList;
204 :
205 : public:
206 : FmEntryDataList();
207 : virtual ~FmEntryDataList();
208 :
209 0 : FmEntryData* at( size_t Index )
210 0 : { return ( Index < maEntryDataList.size() ) ? maEntryDataList[ Index ] : NULL; }
211 :
212 0 : size_t size() const { return maEntryDataList.size(); }
213 : FmEntryData* remove( FmEntryData* pItem );
214 : void insert( FmEntryData* pItem, size_t Index );
215 : void clear();
216 : };
217 :
218 :
219 : // FmNavRequestSelectHint - jemand teilt dem NavigatorTree mit, dass er bestimmte Eintraege selektieren soll
220 :
221 : typedef std::set<FmEntryData*> FmEntryDataArray;
222 :
223 : class FmNavRequestSelectHint : public SfxHint
224 : {
225 : FmEntryDataArray m_arredToSelect;
226 : sal_Bool m_bMixedSelection;
227 : public:
228 : TYPEINFO_OVERRIDE();
229 0 : FmNavRequestSelectHint()
230 0 : : m_bMixedSelection(sal_False)
231 : {
232 0 : }
233 0 : virtual ~FmNavRequestSelectHint() {}
234 :
235 0 : void SetMixedSelection(sal_Bool bMixedSelection) { m_bMixedSelection = bMixedSelection; }
236 0 : sal_Bool IsMixedSelection() { return m_bMixedSelection; }
237 0 : void AddItem(FmEntryData* pEntry) { m_arredToSelect.insert(pEntry); }
238 0 : void ClearItems() { m_arredToSelect.clear(); }
239 0 : FmEntryDataArray& GetItems() { return m_arredToSelect; }
240 : };
241 :
242 :
243 : class FmFormData : public FmEntryData
244 : {
245 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > m_xForm;
246 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer > m_xContainer;
247 :
248 : public:
249 : TYPEINFO_OVERRIDE();
250 :
251 : FmFormData(
252 : const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm,
253 : const ImageList& _rNormalImages,
254 : FmFormData* _pParent = NULL
255 : );
256 :
257 : FmFormData( const FmFormData& rFormData );
258 : virtual ~FmFormData();
259 :
260 : void SetForm( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm )
261 : {
262 : m_xForm = xForm;
263 : m_xContainer = m_xContainer.query( m_xForm );
264 : newObject( m_xForm );
265 : }
266 :
267 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& GetFormIface() const { return m_xForm; }
268 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainer >& GetContainer() const { return m_xContainer; }
269 :
270 : virtual sal_Bool IsEqualWithoutChildren( FmEntryData* pEntryData ) SAL_OVERRIDE;
271 : virtual FmEntryData* Clone() SAL_OVERRIDE;
272 : };
273 :
274 :
275 :
276 : class FmControlData : public FmEntryData
277 : {
278 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > m_xFormComponent;
279 :
280 : Image GetImage(const ImageList& ilNavigatorImages) const;
281 :
282 : public:
283 : TYPEINFO_OVERRIDE();
284 :
285 : FmControlData(
286 : const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& _rxComponent,
287 : const ImageList& _rNormalImages,
288 : FmFormData* _pParent
289 : );
290 : FmControlData( const FmControlData& rControlData );
291 : virtual ~FmControlData();
292 :
293 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& GetFormComponent() const { return m_xFormComponent; }
294 : virtual sal_Bool IsEqualWithoutChildren( FmEntryData* pEntryData ) SAL_OVERRIDE;
295 : virtual FmEntryData* Clone() SAL_OVERRIDE;
296 :
297 : void ModelReplaced(
298 : const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& _rxNew,
299 : const ImageList& _rNormalImages
300 : );
301 : };
302 :
303 :
304 :
305 :
306 : namespace svxform
307 : {
308 :
309 :
310 : class NavigatorTreeModel;
311 :
312 : // class OFormComponentObserver
313 :
314 0 : class OFormComponentObserver
315 : :public ::cppu::WeakImplHelper2 < ::com::sun::star::beans::XPropertyChangeListener
316 : , ::com::sun::star::container::XContainerListener
317 : >
318 : {
319 : ::svxform::NavigatorTreeModel* m_pNavModel;
320 : sal_uInt32 m_nLocks;
321 : sal_Bool m_bCanUndo;
322 :
323 : public:
324 : OFormComponentObserver( ::svxform::NavigatorTreeModel* pModel );
325 :
326 : // XEventListenerListener
327 : virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
328 :
329 : // ::com::sun::star::beans::XPropertyChangeListener
330 : virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
331 :
332 : // ::com::sun::star::container::XContainerListener
333 :
334 : virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
335 : virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
336 : virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& rEvent) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
337 :
338 0 : void Lock() { m_nLocks++; }
339 0 : void UnLock() { m_nLocks--; }
340 0 : sal_Bool IsLocked() const { return m_nLocks != 0; }
341 0 : sal_Bool CanUndo() const { return m_bCanUndo; }
342 0 : void ReleaseModel() { m_pNavModel = NULL; }
343 : protected:
344 : void Insert(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xIface, sal_Int32 nIndex);
345 : void Remove( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxElement );
346 : };
347 :
348 :
349 : //= NavigatorTreeModel
350 :
351 : class NavigatorTreeModel : public SfxBroadcaster
352 : ,public SfxListener
353 : {
354 : friend class NavigatorTree;
355 : friend class OFormComponentObserver;
356 :
357 : FmEntryDataList* m_pRootList;
358 : FmFormShell* m_pFormShell;
359 : FmFormPage* m_pFormPage;
360 : FmFormModel* m_pFormModel;
361 : OFormComponentObserver* m_pPropChangeList;
362 :
363 : ImageList m_aNormalImages;
364 :
365 : void UpdateContent( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForms >& xForms );
366 : FmControlData* CreateControlData( ::com::sun::star::form::XFormComponent* pFormComponent );
367 :
368 : void InsertForm(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& xForm, sal_uInt32 nRelPos);
369 : void RemoveForm(FmFormData* pFormData);
370 :
371 : void InsertFormComponent(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& xComp, sal_uInt32 nRelPos);
372 : void RemoveFormComponent(FmControlData* pControlData);
373 : void InsertSdrObj(const SdrObject* pSdrObj);
374 : void RemoveSdrObj(const SdrObject* pSdrObj);
375 :
376 : void ReplaceFormComponent(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& xOld, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& xNew);
377 :
378 : void BroadcastMarkedObjects(const SdrMarkList& mlMarked);
379 : // einen RequestSelectHint mit den aktuell markierten Objekten broadcasten
380 : sal_Bool InsertFormComponent(FmNavRequestSelectHint& rHint, SdrObject* pObject);
381 : // ist ein Helper fuer vorherige, managet das Abteigen in SdrObjGroups
382 : // Rueckgabe sal_True, wenn das Objekt eine FormComponent ist (oder rekursiv nur aus solchen besteht)
383 :
384 : public:
385 : NavigatorTreeModel( const ImageList& _rNormalImages );
386 : virtual ~NavigatorTreeModel();
387 :
388 : void FillBranch( FmFormData* pParentData );
389 : void ClearBranch( FmFormData* pParentData );
390 : void UpdateContent( FmFormShell* pNewShell );
391 :
392 : void Insert( FmEntryData* pEntryData, sal_uLong nRelPos = CONTAINER_APPEND,
393 : sal_Bool bAlterModel = sal_False );
394 : void Remove( FmEntryData* pEntryData, sal_Bool bAlterModel = sal_False );
395 :
396 : sal_Bool Rename( FmEntryData* pEntryData, const OUString& rNewText );
397 :
398 : void Clear();
399 : void SetModified( sal_Bool bMod=sal_True );
400 :
401 : ::com::sun::star::uno::Reference< ::com::sun::star::form::XForms > GetForms() const;
402 0 : FmFormShell* GetFormShell() const { return m_pFormShell; }
403 0 : FmFormPage* GetFormPage() const { return m_pFormPage; }
404 : FmEntryData* FindData( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xElement, FmEntryDataList* pDataList, sal_Bool bRecurs=sal_True );
405 : FmEntryData* FindData( const OUString& rText, FmFormData* pParentData, sal_Bool bRecurs=sal_True );
406 0 : FmEntryDataList* GetRootList() const { return m_pRootList; }
407 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > GetFormComponents( FmFormData* pParentFormData );
408 : SdrObject* Search(SdrObjListIter& rIter, const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent >& xComp);
409 :
410 : virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) SAL_OVERRIDE;
411 : };
412 :
413 :
414 : typedef std::set<SvTreeListEntry*> SvLBoxEntrySortedArray;
415 :
416 : class NavigatorTree : public SvTreeListBox, public SfxListener
417 : {
418 : enum DROP_ACTION { DA_SCROLLUP, DA_SCROLLDOWN, DA_EXPANDNODE };
419 : enum SELDATA_ITEMS { SDI_DIRTY, SDI_ALL, SDI_NORMALIZED, SDI_NORMALIZED_FORMARK };
420 :
421 : // beim Droppen will ich scrollen und Folder aufklappen koennen, dafuer :
422 : AutoTimer m_aDropActionTimer;
423 : Timer m_aSynchronizeTimer;
424 : // die Meta-Daten ueber meine aktuelle Selektion
425 : SvLBoxEntrySortedArray m_arrCurrentSelection;
426 : // the entries which, in the view, are currently marked as "cut" (painted semi-transparent)
427 : ListBoxEntrySet m_aCutEntries;
428 : // die Images, die ich brauche (und an FormDatas und EntryDatas weiterreiche)
429 : ImageList m_aNavigatorImages;
430 :
431 : ::svxform::OControlExchangeHelper m_aControlExchange;
432 :
433 : NavigatorTreeModel* m_pNavModel;
434 : SvTreeListEntry* m_pRootEntry;
435 : SvTreeListEntry* m_pEditEntry;
436 :
437 : sal_uLong nEditEvent;
438 :
439 : SELDATA_ITEMS m_sdiState;
440 : Point m_aTimerTriggered; // die Position, an der der DropTimer angeschaltet wurde
441 : DROP_ACTION m_aDropActionType;
442 :
443 : sal_uInt16 m_nSelectLock;
444 : sal_uInt16 m_nFormsSelected;
445 : sal_uInt16 m_nControlsSelected;
446 : sal_uInt16 m_nHiddenControls; // (die Zahl geht in m_nControlsSelected mit ein)
447 :
448 : unsigned short m_aTimerCounter;
449 :
450 : sal_Bool m_bDragDataDirty : 1; // dito
451 : sal_Bool m_bPrevSelectionMixed : 1;
452 : sal_Bool m_bMarkingObjects : 1; // wenn das sal_True ist, brauche ich auf die RequestSelectHints nicht reagieren
453 : sal_Bool m_bRootSelected : 1;
454 : sal_Bool m_bInitialUpdate : 1; // bin ich das erste Mal im UpdateContent ?
455 : sal_Bool m_bKeyboardCut : 1;
456 :
457 :
458 : void UpdateContent();
459 : FmControlData* NewControl( const OUString& rServiceName, SvTreeListEntry* pParentEntry, sal_Bool bEditName = sal_True );
460 : void NewForm( SvTreeListEntry* pParentEntry );
461 : SvTreeListEntry* Insert( FmEntryData* pEntryData, sal_uLong nRelPos=TREELIST_APPEND );
462 : void Remove( FmEntryData* pEntryData );
463 :
464 :
465 : void CollectSelectionData(SELDATA_ITEMS sdiHow);
466 : // sammelt in m_arrCurrentSelection die aktuell selektierten Eintraege, normalisiert die Liste wenn verlangt
467 : // SDI_NORMALIZED bedeutet einfach, dass alle Eintraege, die schon einen selektierten Vorfahren haben, nicht mit gesammelt
468 : // werden.
469 : // SDI_NORMALIZED_FORMARK bedeutet, dass wie bei SDI_NORMALIZED verfahren wird, aber Eintraege, deren direktes Elter nicht
470 : // selektiert ist, aufgenommen werden (unabhaengig vom Status weiterer Vorfahren), desgleichen Formulare, die selektiert sind,
471 : // unabhaengig vom Status irgendwelcher Vorfahren
472 : // Bei beiden Normalized-Modi enthalten die m_nFormsSelected, ... die richtige Anzahl, auch wenn nicht alle dieser Eintraege
473 : // in m_arrCurrentSelection landen.
474 : // SDI_DIRTY ist natuerlich nicht erlaubt als Parameter
475 :
476 : // ein einziges Interface fuer alle selektierten Eintraege zusammensetzen
477 : void ShowSelectionProperties(sal_Bool bForce = sal_False);
478 : // alle selektierten Elemnte loeschen
479 : void DeleteSelection();
480 :
481 : void SynchronizeSelection(FmEntryDataArray& arredToSelect);
482 : // nach dem Aufruf dieser Methode sind genau die Eintraege selektiert, die in dem Array bezeichnet sind
483 : void SynchronizeSelection();
484 : // macht das selbe, nimmt die MarkList der ::com::sun::star::sdbcx::View
485 : void SynchronizeMarkList();
486 : // umgekehrte Richtung von SynchronizeMarkList : markiert in der ::com::sun::star::sdbcx::View alle der aktuellen Selektion entsprechenden Controls
487 :
488 : void CollectObjects(FmFormData* pFormData, sal_Bool bDeep, ::std::set< ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > >& _rObjects);
489 :
490 : // im Select aktualisiere ich normalerweise die Marklist der zugehoerigen ::com::sun::star::sdbcx::View, mit folgenden Funktionen
491 : // kann ich das Locking dieses Verhaltens steuern
492 0 : void LockSelectionHandling() { ++m_nSelectLock; }
493 0 : void UnlockSelectionHandling() { --m_nSelectLock; }
494 0 : sal_Bool IsSelectionHandlingLocked() const { return m_nSelectLock>0; }
495 :
496 : sal_Bool IsHiddenControl(FmEntryData* pEntryData);
497 :
498 : DECL_LINK( OnEdit, void* );
499 : DECL_LINK( OnDropActionTimer, void* );
500 :
501 : DECL_LINK(OnEntrySelDesel, NavigatorTree*);
502 : DECL_LINK(OnSynchronizeTimer, void*);
503 :
504 : DECL_LINK( OnClipboardAction, void* );
505 :
506 : protected:
507 : virtual void Command( const CommandEvent& rEvt ) SAL_OVERRIDE;
508 :
509 : virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) SAL_OVERRIDE;
510 : virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) SAL_OVERRIDE;
511 : virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) SAL_OVERRIDE;
512 :
513 : public:
514 : NavigatorTree(Window* pParent );
515 : virtual ~NavigatorTree();
516 :
517 : void Clear();
518 : void UpdateContent( FmFormShell* pFormShell );
519 : void MarkViewObj( FmFormData* pFormData, sal_Bool bMark, sal_Bool bDeep = sal_False );
520 : void MarkViewObj( FmControlData* pControlData, sal_Bool bMarkHandles, sal_Bool bMark );
521 : void UnmarkAllViewObj();
522 :
523 : sal_Bool IsFormEntry( SvTreeListEntry* pEntry );
524 : sal_Bool IsFormComponentEntry( SvTreeListEntry* pEntry );
525 :
526 : OUString GenerateName( FmEntryData* pEntryData );
527 :
528 0 : NavigatorTreeModel* GetNavModel() const { return m_pNavModel; }
529 : SvTreeListEntry* FindEntry( FmEntryData* pEntryData );
530 :
531 : virtual bool EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewText ) SAL_OVERRIDE;
532 : virtual sal_Bool Select( SvTreeListEntry* pEntry, sal_Bool bSelect=sal_True );
533 : virtual bool EditingEntry( SvTreeListEntry* pEntry, Selection& ) SAL_OVERRIDE;
534 : virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) SAL_OVERRIDE;
535 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
536 :
537 : virtual void ModelHasRemoved( SvTreeListEntry* _pEntry ) SAL_OVERRIDE;
538 :
539 : using SvTreeListBox::Insert;
540 : using SvTreeListBox::ExecuteDrop;
541 : using SvTreeListBox::Select;
542 : using SvTreeListBox::Notify;
543 :
544 : private:
545 : sal_Int8 implAcceptDataTransfer( const DataFlavorExVector& _rFlavors, sal_Int8 _nAction, const Point& _rDropPos, sal_Bool _bDnD );
546 : sal_Int8 implAcceptDataTransfer( const DataFlavorExVector& _rFlavors, sal_Int8 _nAction, SvTreeListEntry* _pTargetEntry, sal_Bool _bDnD );
547 :
548 : sal_Int8 implExecuteDataTransfer( const OControlTransferData& _rData, sal_Int8 _nAction, const Point& _rDropPos, sal_Bool _bDnD );
549 : sal_Int8 implExecuteDataTransfer( const OControlTransferData& _rData, sal_Int8 _nAction, SvTreeListEntry* _pTargetEntry, sal_Bool _bDnD );
550 :
551 : // check if a cut, copy, or drag operation can be started in the current situation
552 : sal_Bool implAllowExchange( sal_Int8 _nAction, sal_Bool* _pHasNonHidden = NULL );
553 : // check if a paste with the current clipboard content can be accepted
554 : sal_Bool implAcceptPaste( );
555 :
556 : // fills m_aControlExchange in preparation of a DnD or clipboard operation
557 : sal_Bool implPrepareExchange( sal_Int8 _nAction );
558 :
559 : void doPaste();
560 : void doCopy();
561 : void doCut();
562 :
563 0 : sal_Bool doingKeyboardCut( ) const { return m_bKeyboardCut; }
564 : };
565 :
566 :
567 : class NavigatorFrame : public SfxDockingWindow, public SfxControllerItem
568 : {
569 : private:
570 : ::svxform::NavigatorTree* m_pNavigatorTree;
571 :
572 : protected:
573 : virtual void Resize() SAL_OVERRIDE;
574 : virtual bool Close() SAL_OVERRIDE;
575 : virtual void GetFocus() SAL_OVERRIDE;
576 : virtual Size CalcDockingSize( SfxChildAlignment ) SAL_OVERRIDE;
577 : virtual SfxChildAlignment CheckAlignment( SfxChildAlignment, SfxChildAlignment ) SAL_OVERRIDE;
578 :
579 : using SfxDockingWindow::StateChanged;
580 :
581 : public:
582 : NavigatorFrame( SfxBindings *pBindings, SfxChildWindow *pMgr,
583 : Window* pParent );
584 : virtual ~NavigatorFrame();
585 :
586 : void UpdateContent( FmFormShell* pFormShell );
587 : void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) SAL_OVERRIDE;
588 : void FillInfo( SfxChildWinInfo& rInfo ) const SAL_OVERRIDE;
589 : };
590 :
591 :
592 0 : class SVX_DLLPUBLIC NavigatorFrameManager : public SfxChildWindow
593 : {
594 : public:
595 : SVX_DLLPRIVATE NavigatorFrameManager( Window *pParent, sal_uInt16 nId, SfxBindings *pBindings,
596 : SfxChildWinInfo *pInfo );
597 : SFX_DECL_CHILDWINDOW( NavigatorFrameManager );
598 : };
599 :
600 :
601 : } // namespace svxform
602 :
603 :
604 : #endif // INCLUDED_SVX_SOURCE_INC_FMEXPL_HXX
605 :
606 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|