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 :
20 :
21 : #include "svx/fmresids.hrc"
22 : #include "fmexpl.hxx"
23 :
24 : #include "fmhelp.hrc"
25 : #include <svx/fmglob.hxx>
26 : #include "fmservs.hxx"
27 : #include <svx/fmmodel.hxx>
28 : #include "fmexch.hxx"
29 : #include "fmundo.hxx"
30 : #include "fmpgeimp.hxx"
31 :
32 : #include <svx/svxids.hrc>
33 :
34 : #include "fmprop.hrc"
35 : #include <svx/dialmgr.hxx>
36 : #include "svx/svditer.hxx"
37 : #include <svx/svdouno.hxx>
38 : #include <svx/svdobj.hxx>
39 : #include <vcl/msgbox.hxx>
40 : #include <sfx2/dispatch.hxx>
41 : #include <sfx2/objsh.hxx>
42 : #include <sfx2/viewsh.hxx>
43 : #include <sfx2/viewfrm.hxx>
44 : #include <com/sun/star/lang/XServiceInfo.hpp>
45 : #include <com/sun/star/form/FormComponentType.hpp>
46 : #include <com/sun/star/awt/XTabControllerModel.hpp>
47 : #include <vcl/menu.hxx>
48 : #include <sfx2/objitem.hxx>
49 : #include <sfx2/request.hxx>
50 :
51 : #include <vcl/wrkwin.hxx>
52 : #include <svx/fmshell.hxx>
53 : #include "fmshimp.hxx"
54 : #include <svx/fmpage.hxx>
55 : #include <com/sun/star/io/XPersistObject.hpp>
56 : #include <com/sun/star/script/XEventAttacherManager.hpp>
57 : #include <com/sun/star/sdb/CommandType.hpp>
58 : #include <com/sun/star/beans/PropertyAttribute.hpp>
59 : #include <comphelper/property.hxx>
60 : #include <comphelper/processfactory.hxx>
61 : #include <osl/diagnose.h>
62 :
63 : using namespace ::svxform;
64 : using namespace ::com::sun::star::uno;
65 : using namespace ::com::sun::star::sdbc;
66 : using namespace ::com::sun::star::sdb;
67 : using namespace ::com::sun::star::form;
68 : using namespace ::com::sun::star::beans;
69 : using namespace ::com::sun::star::lang;
70 : using namespace ::com::sun::star::container;
71 :
72 0 : FmNavInsertedHint::FmNavInsertedHint( FmEntryData* pInsertedEntryData, sal_uInt32 nRelPos )
73 : :pEntryData( pInsertedEntryData )
74 0 : ,nPos( nRelPos )
75 :
76 : {
77 0 : }
78 :
79 :
80 0 : FmNavInsertedHint::~FmNavInsertedHint()
81 : {
82 0 : }
83 :
84 :
85 :
86 : // class FmNavInsertedHint
87 :
88 0 : FmNavModelReplacedHint::FmNavModelReplacedHint( FmEntryData* pAffectedEntryData )
89 0 : :pEntryData( pAffectedEntryData )
90 : {
91 0 : }
92 :
93 :
94 0 : FmNavModelReplacedHint::~FmNavModelReplacedHint()
95 : {
96 0 : }
97 :
98 0 : FmNavRemovedHint::FmNavRemovedHint( FmEntryData* pRemovedEntryData )
99 0 : :pEntryData( pRemovedEntryData )
100 : {
101 0 : }
102 :
103 :
104 0 : FmNavRemovedHint::~FmNavRemovedHint()
105 : {
106 0 : }
107 :
108 0 : FmNavNameChangedHint::FmNavNameChangedHint( FmEntryData* pData, const OUString& rNewName )
109 : :pEntryData( pData )
110 0 : ,aNewName( rNewName )
111 : {
112 0 : }
113 :
114 :
115 0 : FmNavNameChangedHint::~FmNavNameChangedHint()
116 : {
117 0 : }
118 :
119 0 : FmNavClearedHint::FmNavClearedHint()
120 : {
121 0 : }
122 :
123 :
124 0 : FmNavClearedHint::~FmNavClearedHint()
125 : {
126 0 : }
127 :
128 :
129 0 : FmEntryDataList::FmEntryDataList()
130 : {
131 0 : }
132 :
133 :
134 0 : FmEntryDataList::~FmEntryDataList()
135 : {
136 0 : }
137 :
138 :
139 0 : FmEntryData* FmEntryDataList::remove( FmEntryData* pItem )
140 : {
141 0 : for ( FmEntryDataBaseList::iterator it = maEntryDataList.begin();
142 0 : it != maEntryDataList.end();
143 : ++it
144 : )
145 : {
146 0 : if ( *it == pItem )
147 : {
148 0 : maEntryDataList.erase( it );
149 0 : break;
150 : }
151 : }
152 0 : return pItem;
153 : }
154 :
155 :
156 0 : void FmEntryDataList::insert( FmEntryData* pItem, size_t Index )
157 : {
158 0 : if ( Index < maEntryDataList.size() )
159 : {
160 0 : FmEntryDataBaseList::iterator it = maEntryDataList.begin();
161 0 : ::std::advance( it, Index );
162 0 : maEntryDataList.insert( it, pItem );
163 : }
164 : else
165 0 : maEntryDataList.push_back( pItem );
166 0 : }
167 :
168 :
169 0 : void FmEntryDataList::clear()
170 : {
171 0 : for ( size_t i = 0, n = maEntryDataList.size(); i < n; ++i )
172 0 : delete maEntryDataList[ i ];
173 0 : maEntryDataList.clear();
174 0 : }
175 :
176 0 : TYPEINIT0( FmEntryData );
177 :
178 0 : FmEntryData::FmEntryData( FmEntryData* pParentData, const Reference< XInterface >& _rxIFace )
179 0 : :pParent( pParentData )
180 : {
181 0 : pChildList = new FmEntryDataList();
182 :
183 0 : newObject( _rxIFace );
184 0 : }
185 :
186 :
187 0 : FmEntryData::~FmEntryData()
188 : {
189 0 : Clear();
190 0 : delete pChildList;
191 0 : }
192 :
193 :
194 0 : void FmEntryData::newObject( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxIFace )
195 : {
196 : // do not just copy, normalize it
197 0 : m_xNormalizedIFace = Reference< XInterface >( _rxIFace, UNO_QUERY );
198 0 : m_xProperties.set(m_xNormalizedIFace, css::uno::UNO_QUERY);
199 0 : m_xChild.set(m_xNormalizedIFace, css::uno::UNO_QUERY);
200 0 : }
201 :
202 :
203 0 : FmEntryData::FmEntryData( const FmEntryData& rEntryData )
204 : {
205 0 : pChildList = new FmEntryDataList();
206 0 : aText = rEntryData.GetText();
207 0 : m_aNormalImage = rEntryData.GetNormalImage();
208 0 : pParent = rEntryData.GetParent();
209 :
210 : FmEntryData* pChildData;
211 0 : size_t nEntryCount = rEntryData.GetChildList()->size();
212 0 : for( size_t i = 0; i < nEntryCount; i++ )
213 : {
214 0 : pChildData = rEntryData.GetChildList()->at( i );
215 0 : FmEntryData* pNewChildData = pChildData->Clone();
216 0 : pChildList->insert( pNewChildData, size_t(-1) );
217 : }
218 :
219 0 : m_xNormalizedIFace = rEntryData.m_xNormalizedIFace;
220 0 : m_xProperties = rEntryData.m_xProperties;
221 0 : m_xChild = rEntryData.m_xChild;
222 0 : }
223 :
224 :
225 0 : void FmEntryData::Clear()
226 : {
227 0 : GetChildList()->clear();
228 0 : }
229 :
230 :
231 0 : bool FmEntryData::IsEqualWithoutChildren( FmEntryData* pEntryData )
232 : {
233 0 : if(this == pEntryData)
234 0 : return true;
235 :
236 0 : if( !pEntryData )
237 0 : return false;
238 :
239 0 : if( !aText.equals(pEntryData->GetText()))
240 0 : return false;
241 :
242 0 : if( !pEntryData->GetParent() && pParent )
243 0 : return false;
244 :
245 0 : if( pEntryData->GetParent() && !pParent )
246 0 : return false;
247 :
248 0 : if( !pEntryData->GetParent() && !pParent )
249 0 : return true;
250 :
251 0 : if( !pParent->IsEqualWithoutChildren(pEntryData->GetParent()) )
252 0 : return false;
253 :
254 0 : return true;
255 : }
256 :
257 0 : TYPEINIT1( FmFormData, FmEntryData );
258 :
259 0 : FmFormData::FmFormData(
260 : const Reference< XForm >& _rxForm,
261 : const ImageList& _rNormalImages,
262 : FmFormData* _pParent
263 : )
264 : : FmEntryData( _pParent, _rxForm ),
265 0 : m_xForm( _rxForm )
266 : {
267 :
268 : // Images setzen
269 :
270 0 : m_aNormalImage = _rNormalImages.GetImage( RID_SVXIMG_FORM );
271 :
272 :
273 : // Titel setzen
274 0 : if (m_xForm.is())
275 : {
276 0 : Reference< XPropertySet > xSet(m_xForm, UNO_QUERY);
277 0 : if (xSet.is())
278 : {
279 0 : OUString aEntryName(::comphelper::getString(xSet->getPropertyValue( FM_PROP_NAME )));
280 0 : SetText(aEntryName);
281 0 : }
282 : }
283 : else
284 0 : SetText( OUString() );
285 0 : }
286 :
287 :
288 0 : FmFormData::~FmFormData()
289 : {
290 0 : }
291 :
292 :
293 0 : FmFormData::FmFormData( const FmFormData& rFormData )
294 0 : :FmEntryData( rFormData )
295 : {
296 0 : m_xForm = rFormData.GetFormIface();
297 0 : }
298 :
299 :
300 0 : FmEntryData* FmFormData::Clone()
301 : {
302 0 : return new FmFormData( *this );
303 : }
304 :
305 :
306 0 : bool FmFormData::IsEqualWithoutChildren( FmEntryData* pEntryData )
307 : {
308 0 : if(this == pEntryData)
309 0 : return true;
310 0 : if( !pEntryData->ISA(FmFormData) )
311 0 : return false;
312 0 : FmFormData* pFormData = static_cast<FmFormData*>(pEntryData);
313 0 : if( m_xForm.get() != pFormData->GetFormIface().get() )
314 0 : return false;
315 :
316 0 : return FmEntryData::IsEqualWithoutChildren( pFormData );
317 : }
318 :
319 0 : TYPEINIT1( FmControlData, FmEntryData );
320 :
321 0 : FmControlData::FmControlData(
322 : const Reference< XFormComponent >& _rxComponent,
323 : const ImageList& _rNormalImages,
324 : FmFormData* _pParent
325 : )
326 : : FmEntryData( _pParent, _rxComponent ),
327 0 : m_xFormComponent( _rxComponent )
328 : {
329 :
330 : // Images setzen
331 0 : m_aNormalImage = GetImage( _rNormalImages );
332 :
333 :
334 : // Titel setzen
335 0 : Reference< XPropertySet > xSet(m_xFormComponent, UNO_QUERY);
336 0 : if( xSet.is() )
337 : {
338 0 : SetText( ::comphelper::getString(xSet->getPropertyValue( FM_PROP_NAME )));
339 0 : }
340 0 : }
341 :
342 :
343 0 : FmControlData::~FmControlData()
344 : {
345 0 : }
346 :
347 :
348 0 : FmControlData::FmControlData( const FmControlData& rControlData )
349 0 : :FmEntryData( rControlData )
350 : {
351 0 : m_xFormComponent = rControlData.GetFormComponent();
352 0 : }
353 :
354 :
355 0 : FmEntryData* FmControlData::Clone()
356 : {
357 0 : return new FmControlData( *this );
358 : }
359 :
360 :
361 0 : Image FmControlData::GetImage(const ImageList& ilNavigatorImages) const
362 : {
363 :
364 : // Default-Image
365 0 : Image aImage = ilNavigatorImages.GetImage( RID_SVXIMG_CONTROL );
366 :
367 0 : Reference< XServiceInfo > xInfo( m_xFormComponent, UNO_QUERY );
368 0 : if (!m_xFormComponent.is())
369 0 : return aImage;
370 :
371 :
372 : // Spezielle Control-Images
373 0 : sal_Int16 nObjectType = getControlTypeByObject(xInfo);
374 0 : switch (nObjectType)
375 : {
376 : case OBJ_FM_BUTTON:
377 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_BUTTON );
378 0 : break;
379 :
380 : case OBJ_FM_FIXEDTEXT:
381 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_FIXEDTEXT );
382 0 : break;
383 :
384 : case OBJ_FM_EDIT:
385 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_EDIT );
386 0 : break;
387 :
388 : case OBJ_FM_RADIOBUTTON:
389 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_RADIOBUTTON );
390 0 : break;
391 :
392 : case OBJ_FM_CHECKBOX:
393 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_CHECKBOX );
394 0 : break;
395 :
396 : case OBJ_FM_LISTBOX:
397 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_LISTBOX );
398 0 : break;
399 :
400 : case OBJ_FM_COMBOBOX:
401 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_COMBOBOX );
402 0 : break;
403 :
404 : case OBJ_FM_NAVIGATIONBAR:
405 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_NAVIGATIONBAR );
406 0 : break;
407 :
408 : case OBJ_FM_GROUPBOX:
409 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_GROUPBOX );
410 0 : break;
411 :
412 : case OBJ_FM_IMAGEBUTTON:
413 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_IMAGEBUTTON );
414 0 : break;
415 :
416 : case OBJ_FM_FILECONTROL:
417 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_FILECONTROL );
418 0 : break;
419 :
420 : case OBJ_FM_HIDDEN:
421 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_HIDDEN );
422 0 : break;
423 :
424 : case OBJ_FM_DATEFIELD:
425 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_DATEFIELD );
426 0 : break;
427 :
428 : case OBJ_FM_TIMEFIELD:
429 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_TIMEFIELD );
430 0 : break;
431 :
432 : case OBJ_FM_NUMERICFIELD:
433 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_NUMERICFIELD );
434 0 : break;
435 :
436 : case OBJ_FM_CURRENCYFIELD:
437 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_CURRENCYFIELD );
438 0 : break;
439 :
440 : case OBJ_FM_PATTERNFIELD:
441 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_PATTERNFIELD );
442 0 : break;
443 :
444 : case OBJ_FM_IMAGECONTROL:
445 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_IMAGECONTROL );
446 0 : break;
447 :
448 : case OBJ_FM_FORMATTEDFIELD:
449 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_FORMATTEDFIELD );
450 0 : break;
451 :
452 : case OBJ_FM_GRID:
453 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_GRID );
454 0 : break;
455 :
456 : case OBJ_FM_SCROLLBAR:
457 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_SCROLLBAR );
458 0 : break;
459 :
460 : case OBJ_FM_SPINBUTTON:
461 0 : aImage = ilNavigatorImages.GetImage( RID_SVXIMG_SPINBUTTON);
462 0 : break;
463 : }
464 :
465 0 : return aImage;
466 : }
467 :
468 :
469 0 : bool FmControlData::IsEqualWithoutChildren( FmEntryData* pEntryData )
470 : {
471 0 : if(this == pEntryData)
472 0 : return true;
473 :
474 0 : if( !pEntryData->ISA(FmControlData) )
475 0 : return false;
476 0 : FmControlData* pControlData = static_cast<FmControlData*>(pEntryData);
477 :
478 0 : if( m_xFormComponent.get() != pControlData->GetFormComponent().get() )
479 0 : return false;
480 :
481 0 : return FmEntryData::IsEqualWithoutChildren( pControlData );
482 : }
483 :
484 :
485 0 : void FmControlData::ModelReplaced(
486 : const Reference< XFormComponent >& _rxNew,
487 : const ImageList& _rNormalImages
488 : )
489 : {
490 0 : m_xFormComponent = _rxNew;
491 0 : newObject( m_xFormComponent );
492 :
493 : // Images neu setzen
494 0 : m_aNormalImage = GetImage( _rNormalImages );
495 0 : }
496 :
497 :
498 : namespace svxform
499 : {
500 :
501 0 : NavigatorFrame::NavigatorFrame( SfxBindings* _pBindings, SfxChildWindow* _pMgr,
502 : vcl::Window* _pParent )
503 : :SfxDockingWindow( _pBindings, _pMgr, _pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_ROLLABLE|WB_3DLOOK|WB_DOCKABLE) )
504 0 : ,SfxControllerItem( SID_FM_FMEXPLORER_CONTROL, *_pBindings )
505 : {
506 0 : SetHelpId( HID_FORM_NAVIGATOR_WIN );
507 :
508 0 : m_pNavigatorTree = VclPtr<NavigatorTree>::Create( this );
509 0 : m_pNavigatorTree->Show();
510 0 : SetText( SVX_RES(RID_STR_FMEXPLORER) );
511 0 : SfxDockingWindow::SetFloatingSize( Size(200,200) );
512 0 : }
513 :
514 :
515 0 : NavigatorFrame::~NavigatorFrame()
516 : {
517 0 : disposeOnce();
518 0 : }
519 :
520 0 : void NavigatorFrame::dispose()
521 : {
522 0 : m_pNavigatorTree.disposeAndClear();
523 0 : ::SfxControllerItem::dispose();
524 0 : SfxDockingWindow::dispose();
525 0 : }
526 :
527 :
528 0 : void NavigatorFrame::UpdateContent( FmFormShell* pFormShell )
529 : {
530 0 : m_pNavigatorTree->UpdateContent( pFormShell );
531 0 : }
532 :
533 :
534 0 : void NavigatorFrame::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
535 : {
536 0 : if( !pState || SID_FM_FMEXPLORER_CONTROL != nSID )
537 0 : return;
538 :
539 0 : if( eState >= SfxItemState::DEFAULT )
540 : {
541 0 : FmFormShell* pShell = PTR_CAST( FmFormShell, static_cast<const SfxObjectItem*>(pState)->GetShell() );
542 0 : UpdateContent( pShell );
543 : }
544 : else
545 0 : UpdateContent( NULL );
546 : }
547 :
548 :
549 0 : void NavigatorFrame::GetFocus()
550 : {
551 0 : if ( m_pNavigatorTree )
552 0 : m_pNavigatorTree->GrabFocus();
553 : else
554 0 : SfxDockingWindow::GetFocus();
555 0 : }
556 :
557 :
558 0 : bool NavigatorFrame::Close()
559 : {
560 0 : UpdateContent( NULL );
561 0 : return SfxDockingWindow::Close();
562 : }
563 :
564 :
565 0 : void NavigatorFrame::FillInfo( SfxChildWinInfo& rInfo ) const
566 : {
567 0 : SfxDockingWindow::FillInfo( rInfo );
568 0 : rInfo.bVisible = false;
569 0 : }
570 :
571 :
572 0 : Size NavigatorFrame::CalcDockingSize( SfxChildAlignment eAlign )
573 : {
574 0 : if ( ( eAlign == SfxChildAlignment::TOP ) || ( eAlign == SfxChildAlignment::BOTTOM ) )
575 0 : return Size();
576 :
577 0 : return SfxDockingWindow::CalcDockingSize( eAlign );
578 : }
579 :
580 :
581 0 : SfxChildAlignment NavigatorFrame::CheckAlignment( SfxChildAlignment _eActAlign, SfxChildAlignment _eAlign )
582 : {
583 0 : if ( ( _eAlign == SfxChildAlignment::LEFT ) || ( _eAlign == SfxChildAlignment::RIGHT ) || ( _eAlign == SfxChildAlignment::NOALIGNMENT ) )
584 0 : return _eAlign;
585 0 : return _eActAlign;
586 : }
587 :
588 :
589 0 : void NavigatorFrame::Resize()
590 : {
591 0 : SfxDockingWindow::Resize();
592 :
593 0 : Size aLogOutputSize = PixelToLogic( GetOutputSizePixel(), MAP_APPFONT );
594 0 : Size aLogExplSize = aLogOutputSize;
595 0 : aLogExplSize.Width() -= 6;
596 0 : aLogExplSize.Height() -= 6;
597 :
598 0 : Point aExplPos = LogicToPixel( Point(3,3), MAP_APPFONT );
599 0 : Size aExplSize = LogicToPixel( aLogExplSize, MAP_APPFONT );
600 :
601 0 : m_pNavigatorTree->SetPosSizePixel( aExplPos, aExplSize );
602 0 : }
603 :
604 :
605 :
606 : // class NavigatorFrameManager
607 :
608 :
609 :
610 114 : SFX_IMPL_DOCKINGWINDOW( NavigatorFrameManager, SID_FM_SHOW_FMEXPLORER )
611 :
612 :
613 0 : NavigatorFrameManager::NavigatorFrameManager( vcl::Window* _pParent, sal_uInt16 _nId,
614 : SfxBindings* _pBindings, SfxChildWinInfo* _pInfo )
615 0 : :SfxChildWindow( _pParent, _nId )
616 : {
617 0 : pWindow = VclPtr<NavigatorFrame>::Create( _pBindings, this, _pParent );
618 0 : eChildAlignment = SfxChildAlignment::NOALIGNMENT;
619 0 : static_cast<SfxDockingWindow*>(pWindow.get())->Initialize( _pInfo );
620 0 : }
621 :
622 :
623 435 : }
624 :
625 :
626 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|