xref: /trunk/main/basctl/source/dlged/dlged.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_basctl.hxx"
30 #include "dlged.hxx"
31 #include "dlgedfunc.hxx"
32 #include "dlgedfac.hxx"
33 #include <dlgedmod.hxx>
34 #include "dlgedpage.hxx"
35 #include "dlgedview.hxx"
36 #include "dlgedobj.hxx"
37 #include "dlgedclip.hxx"
38 #include <dlgeddef.hxx>
39 #include "propbrw.hxx"
40 #include <localizationmgr.hxx>
41 
42 #include <basidesh.hxx>
43 #include <iderdll.hxx>
44 #include <vcl/scrbar.hxx>
45 #include <tools/shl.hxx>
46 #include <svl/itempool.hxx>
47 #include <sfx2/viewfrm.hxx>
48 
49 #ifndef _SVX_SVXIDS_HRC
50 #include <svx/svxids.hrc>
51 #endif
52 #include <svx/svdpagv.hxx>
53 #include <xmlscript/xml_helper.hxx>
54 #include <xmlscript/xmldlg_imexp.hxx>
55 #include <com/sun/star/beans/PropertyValue.hpp>
56 #include <com/sun/star/beans/XPropertySet.hpp>
57 #include <com/sun/star/beans/Property.hpp>
58 #include <com/sun/star/awt/XDialog.hpp>
59 #include <com/sun/star/util/XCloneable.hpp>
60 #include <com/sun/star/resource/XStringResourcePersistence.hpp>
61 #include <comphelper/processfactory.hxx>
62 #include <comphelper/types.hxx>
63 #include <vcl/svapp.hxx>
64 #include <toolkit/helper/vclunohelper.hxx>
65 
66 // #i74769#
67 #include <svx/sdrpaintwindow.hxx>
68 
69 using namespace comphelper;
70 using namespace ::com::sun::star;
71 using namespace ::com::sun::star::uno;
72 using namespace ::com::sun::star::beans;
73 using namespace ::com::sun::star::io;
74 using ::rtl::OUString;
75 
76 static ::rtl::OUString aResourceResolverPropName =
77     ::rtl::OUString::createFromAscii( "ResourceResolver" );
78 static ::rtl::OUString aDecorationPropName =
79     ::rtl::OUString::createFromAscii( "Decoration" );
80 static ::rtl::OUString aTitlePropName =
81     ::rtl::OUString::createFromAscii( "Title" );
82 
83 
84 //============================================================================
85 // DlgEdHint
86 //============================================================================
87 
88 TYPEINIT1( DlgEdHint, SfxHint );
89 
90 //----------------------------------------------------------------------------
91 
92 DlgEdHint::DlgEdHint( DlgEdHintKind eHint )
93     :eHintKind( eHint )
94 {
95 }
96 
97 //----------------------------------------------------------------------------
98 
99 DlgEdHint::DlgEdHint( DlgEdHintKind eHint, DlgEdObj* pObj )
100     :eHintKind( eHint )
101     ,pDlgEdObj( pObj )
102 {
103 }
104 
105 //----------------------------------------------------------------------------
106 
107 DlgEdHint::~DlgEdHint()
108 {
109 }
110 
111 
112 //============================================================================
113 // DlgEditor
114 //============================================================================
115 
116 void DlgEditor::ShowDialog()
117 {
118     uno::Reference< lang::XMultiServiceFactory >  xMSF = getProcessServiceFactory();
119 
120     // create a dialog
121     uno::Reference< awt::XControl > xDlg( xMSF->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialog" ) ) ), uno::UNO_QUERY );
122 
123     // clone the dialog model
124     uno::Reference< util::XCloneable > xC( m_xUnoControlDialogModel, uno::UNO_QUERY );
125     uno::Reference< util::XCloneable > xNew = xC->createClone();
126     uno::Reference< awt::XControlModel > xDlgMod( xNew, uno::UNO_QUERY );
127 
128     uno::Reference< beans::XPropertySet > xSrcDlgModPropSet( m_xUnoControlDialogModel, uno::UNO_QUERY );
129     uno::Reference< beans::XPropertySet > xNewDlgModPropSet( xDlgMod, uno::UNO_QUERY );
130     if( xNewDlgModPropSet.is() )
131     {
132         if( xSrcDlgModPropSet.is() )
133         {
134             try
135             {
136                 Any aResourceResolver = xSrcDlgModPropSet->getPropertyValue( aResourceResolverPropName );
137                 xNewDlgModPropSet->setPropertyValue( aResourceResolverPropName, aResourceResolver );
138             }
139             catch( UnknownPropertyException& )
140             {
141                 DBG_ERROR( "DlgEditor::ShowDialog(): No ResourceResolver property" );
142             }
143         }
144 
145         // Disable decoration
146         bool bDecoration = true;
147         try
148         {
149             Any aDecorationAny = xSrcDlgModPropSet->getPropertyValue( aDecorationPropName );
150             aDecorationAny >>= bDecoration;
151             if( !bDecoration )
152             {
153                 xNewDlgModPropSet->setPropertyValue( aDecorationPropName, makeAny( true ) );
154                 xNewDlgModPropSet->setPropertyValue( aTitlePropName, makeAny( ::rtl::OUString() ) );
155             }
156         }
157         catch( UnknownPropertyException& )
158         {}
159     }
160 
161     // set the model
162     xDlg->setModel( xDlgMod );
163 
164     // create a peer
165     uno::Reference< awt::XToolkit> xToolkit( xMSF->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.ExtToolkit" ) ) ), uno::UNO_QUERY );
166     xDlg->createPeer( xToolkit, pWindow->GetComponentInterface() );
167 
168     uno::Reference< awt::XDialog > xD( xDlg, uno::UNO_QUERY );
169     xD->execute();
170 
171     uno::Reference< lang::XComponent > xComponent(xDlg, uno::UNO_QUERY);
172     if (xComponent.is())
173         xComponent->dispose();
174 }
175 
176 //----------------------------------------------------------------------------
177 
178 sal_Bool DlgEditor::UnmarkDialog()
179 {
180     SdrObject*      pDlgObj = pDlgEdModel->GetPage(0)->GetObj(0);
181     SdrPageView*    pPgView = pDlgEdView->GetSdrPageView();
182 
183     sal_Bool bWasMarked = pDlgEdView->IsObjMarked( pDlgObj );
184 
185     if( bWasMarked )
186         pDlgEdView->MarkObj( pDlgObj, pPgView, sal_True );
187 
188     return bWasMarked;
189 }
190 
191 //----------------------------------------------------------------------------
192 
193 sal_Bool DlgEditor::RemarkDialog()
194 {
195     SdrObject*      pDlgObj = pDlgEdModel->GetPage(0)->GetObj(0);
196     SdrPageView*    pPgView = pDlgEdView->GetSdrPageView();
197 
198     sal_Bool bWasMarked = pDlgEdView->IsObjMarked( pDlgObj );
199 
200     if( !bWasMarked )
201         pDlgEdView->MarkObj( pDlgObj, pPgView, sal_False );
202 
203     return bWasMarked;
204 }
205 
206 //----------------------------------------------------------------------------
207 
208 DlgEditor::DlgEditor()
209     :pHScroll(NULL)
210     ,pVScroll(NULL)
211     ,pDlgEdModel(NULL)
212     ,pDlgEdPage(NULL)
213     ,pDlgEdView(NULL)
214     ,pDlgEdForm(NULL)
215     ,m_xUnoControlDialogModel(NULL)
216     ,m_ClipboardDataFlavors(1)
217     ,m_ClipboardDataFlavorsResource(2)
218     ,pObjFac(NULL)
219     ,pWindow(NULL)
220     ,pFunc(NULL)
221     ,eMode( DLGED_SELECT )
222     ,eActObj( OBJ_DLG_PUSHBUTTON )
223     ,bFirstDraw(sal_False)
224     ,aGridSize( 100, 100 )  // 100TH_MM
225     ,bGridVisible(sal_False)
226     ,bGridSnap(sal_True)
227     ,bCreateOK(sal_True)
228     ,bDialogModelChanged(sal_False)
229     ,mnPaintGuard(0)
230 {
231     pDlgEdModel = new DlgEdModel();
232     pDlgEdModel->GetItemPool().FreezeIdRanges();
233     pDlgEdModel->SetScaleUnit( MAP_100TH_MM );
234 
235     SdrLayerAdmin& rAdmin = pDlgEdModel->GetLayerAdmin();
236     rAdmin.NewLayer( rAdmin.GetControlLayerName() );
237     rAdmin.NewLayer( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "HiddenLayer" ) ) );
238 
239     pDlgEdPage = new DlgEdPage( *pDlgEdModel );
240     pDlgEdModel->InsertPage( pDlgEdPage );
241 
242     pObjFac = new DlgEdFactory();
243 
244     pFunc = new DlgEdFuncSelect( this );
245 
246     // set clipboard data flavors
247     m_ClipboardDataFlavors[0].MimeType =                ::rtl::OUString::createFromAscii("application/vnd.sun.xml.dialog");
248     m_ClipboardDataFlavors[0].HumanPresentableName =    ::rtl::OUString::createFromAscii("Dialog 6.0");
249     m_ClipboardDataFlavors[0].DataType =                ::getCppuType( (const Sequence< sal_Int8 >*) 0 );
250 
251     m_ClipboardDataFlavorsResource[0] =                         m_ClipboardDataFlavors[0];
252     m_ClipboardDataFlavorsResource[1].MimeType =                ::rtl::OUString::createFromAscii("application/vnd.sun.xml.dialogwithresource");
253     m_ClipboardDataFlavorsResource[1].HumanPresentableName =    ::rtl::OUString::createFromAscii("Dialog 8.0");
254     m_ClipboardDataFlavorsResource[1].DataType =                ::getCppuType( (const Sequence< sal_Int8 >*) 0 );
255 
256     aPaintTimer.SetTimeout( 1 );
257     aPaintTimer.SetTimeoutHdl( LINK( this, DlgEditor, PaintTimeout ) );
258 
259     aMarkTimer.SetTimeout( 100 );
260     aMarkTimer.SetTimeoutHdl( LINK( this, DlgEditor, MarkTimeout ) );
261 }
262 
263 //----------------------------------------------------------------------------
264 
265 DlgEditor::~DlgEditor()
266 {
267     aPaintTimer.Stop();
268     aMarkTimer.Stop();
269 
270     ::comphelper::disposeComponent( m_xControlContainer );
271 
272     delete pObjFac;
273     delete pFunc;
274     delete pDlgEdView;
275     delete pDlgEdModel;
276 }
277 
278 //----------------------------------------------------------------------------
279 
280 Reference< awt::XControlContainer > DlgEditor::GetWindowControlContainer()
281 {
282     if ( !m_xControlContainer.is() && pWindow )
283         m_xControlContainer = VCLUnoHelper::CreateControlContainer( pWindow );
284     return m_xControlContainer;
285 }
286 
287 //----------------------------------------------------------------------------
288 
289 void DlgEditor::SetWindow( Window* pWindow_ )
290 {
291     DlgEditor::pWindow = pWindow_;
292     pWindow_->SetMapMode( MapMode( MAP_100TH_MM ) );
293     pDlgEdPage->SetSize( pWindow_->PixelToLogic( Size( DLGED_PAGE_WIDTH_MIN, DLGED_PAGE_HEIGHT_MIN ) ) );
294 
295     pDlgEdView = new DlgEdView( pDlgEdModel, pWindow_, this );
296     pDlgEdView->ShowSdrPage(pDlgEdView->GetModel()->GetPage(0));
297     pDlgEdView->SetLayerVisible( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "HiddenLayer" ) ), sal_False );
298     pDlgEdView->SetMoveSnapOnlyTopLeft( sal_True );
299     pDlgEdView->SetWorkArea( Rectangle( Point( 0, 0 ), pDlgEdPage->GetSize() ) );
300 
301     pDlgEdView->SetGridCoarse( aGridSize );
302     pDlgEdView->SetSnapGridWidth(Fraction(aGridSize.Width(), 1), Fraction(aGridSize.Height(), 1));
303     pDlgEdView->SetGridSnap( bGridSnap );
304     pDlgEdView->SetGridVisible( bGridVisible );
305     pDlgEdView->SetDragStripes( sal_False );
306 
307     pDlgEdView->SetDesignMode( sal_True );
308 
309     ::comphelper::disposeComponent( m_xControlContainer );
310 }
311 
312 //----------------------------------------------------------------------------
313 
314 void DlgEditor::SetScrollBars( ScrollBar* pHS, ScrollBar* pVS )
315 {
316     pHScroll = pHS;
317     pVScroll = pVS;
318 
319     InitScrollBars();
320 }
321 
322 //----------------------------------------------------------------------------
323 
324 void DlgEditor::InitScrollBars()
325 {
326     DBG_ASSERT( pHScroll, "DlgEditor::InitScrollBars: no horizontal scroll bar!" );
327     DBG_ASSERT( pVScroll, "DlgEditor::InitScrollBars: no vertical scroll bar!" );
328     if ( !pHScroll || !pVScroll )
329         return;
330 
331     Size aOutSize = pWindow->GetOutputSize();
332     Size aPgSize  = pDlgEdPage->GetSize();
333 
334     pHScroll->SetRange( Range( 0, aPgSize.Width()  ));
335     pVScroll->SetRange( Range( 0, aPgSize.Height() ));
336     pHScroll->SetVisibleSize( (sal_uLong)aOutSize.Width() );
337     pVScroll->SetVisibleSize( (sal_uLong)aOutSize.Height() );
338 
339     pHScroll->SetLineSize( aOutSize.Width() / 10 );
340     pVScroll->SetLineSize( aOutSize.Height() / 10 );
341     pHScroll->SetPageSize( aOutSize.Width() / 2 );
342     pVScroll->SetPageSize( aOutSize.Height() / 2 );
343 
344     DoScroll( pHScroll );
345     DoScroll( pVScroll );
346 }
347 
348 //----------------------------------------------------------------------------
349 
350 void DlgEditor::DoScroll( ScrollBar* )
351 {
352     if( !pHScroll || !pVScroll )
353         return;
354 
355     MapMode aMap = pWindow->GetMapMode();
356     Point aOrg = aMap.GetOrigin();
357 
358     Size  aScrollPos( pHScroll->GetThumbPos(), pVScroll->GetThumbPos() );
359     aScrollPos = pWindow->LogicToPixel( aScrollPos );
360     aScrollPos = pWindow->PixelToLogic( aScrollPos );
361 
362     long  nX   = aScrollPos.Width() + aOrg.X();
363     long  nY   = aScrollPos.Height() + aOrg.Y();
364 
365     if( !nX && !nY )
366         return;
367 
368     pWindow->Update();
369 
370     // #i31562#
371     // When scrolling, someone was rescuing the Wallpaper and forced the window scroll to
372     // be done without background refresh. I do not know why, but that causes the repaint
373     // problems. Taking that out.
374     //  Wallpaper aOldBackground = pWindow->GetBackground();
375     //  pWindow->SetBackground();
376 
377     // #i74769# children should be scrolled
378     pWindow->Scroll( -nX, -nY, SCROLL_CHILDREN); // SCROLL_NOCHILDREN );
379     aMap.SetOrigin( Point( -aScrollPos.Width(), -aScrollPos.Height() ) );
380     pWindow->SetMapMode( aMap );
381     pWindow->Update();
382 
383     // pWindow->SetBackground( aOldBackground );
384 
385     DlgEdHint aHint( DLGED_HINT_WINDOWSCROLLED );
386     Broadcast( aHint );
387 }
388 
389 //----------------------------------------------------------------------------
390 
391 void DlgEditor::UpdateScrollBars()
392 {
393     MapMode aMap = pWindow->GetMapMode();
394     Point aOrg = aMap.GetOrigin();
395 
396     if ( pHScroll )
397         pHScroll->SetThumbPos( -aOrg.X() );
398 
399     if ( pVScroll )
400         pVScroll->SetThumbPos( -aOrg.Y() );
401 }
402 
403 //----------------------------------------------------------------------------
404 
405 void DlgEditor::SetDialog( uno::Reference< container::XNameContainer > xUnoControlDialogModel )
406 {
407     // set dialog model
408     m_xUnoControlDialogModel = xUnoControlDialogModel;
409 
410     // create dialog form
411     pDlgEdForm = new DlgEdForm();
412     uno::Reference< awt::XControlModel > xDlgMod( m_xUnoControlDialogModel , uno::UNO_QUERY );
413     pDlgEdForm->SetUnoControlModel(xDlgMod);
414     pDlgEdForm->SetDlgEditor( this );
415     ((DlgEdPage*)pDlgEdModel->GetPage(0))->SetDlgEdForm( pDlgEdForm );
416     pDlgEdModel->GetPage(0)->InsertObject( pDlgEdForm );
417     AdjustPageSize();
418     pDlgEdForm->SetRectFromProps();
419     pDlgEdForm->UpdateTabIndices();     // for backward compatibility
420     pDlgEdForm->StartListening();
421 
422     // create controls
423     Reference< ::com::sun::star::container::XNameAccess > xNameAcc( m_xUnoControlDialogModel, UNO_QUERY );
424     if ( xNameAcc.is() )
425     {
426         // get sequence of control names
427         Sequence< ::rtl::OUString > aNames = xNameAcc->getElementNames();
428         const ::rtl::OUString* pNames = aNames.getConstArray();
429         sal_Int32 nCtrls = aNames.getLength();
430 
431         // create a map of tab indices and control names, sorted by tab index
432         IndexToNameMap aIndexToNameMap;
433         for ( sal_Int32 i = 0; i < nCtrls; ++i )
434         {
435             // get name
436             ::rtl::OUString aName( pNames[i] );
437 
438             // get tab index
439             sal_Int16 nTabIndex = -1;
440             Any aCtrl = xNameAcc->getByName( aName );
441             Reference< ::com::sun::star::beans::XPropertySet > xPSet;
442             aCtrl >>= xPSet;
443             if ( xPSet.is() )
444                 xPSet->getPropertyValue( DLGED_PROP_TABINDEX ) >>= nTabIndex;
445 
446             // insert into map
447             aIndexToNameMap.insert( IndexToNameMap::value_type( nTabIndex, aName ) );
448         }
449 
450         // create controls and insert them into drawing page
451         for ( IndexToNameMap::iterator aIt = aIndexToNameMap.begin(); aIt != aIndexToNameMap.end(); ++aIt )
452         {
453             Any aCtrl = xNameAcc->getByName( aIt->second );
454             Reference< ::com::sun::star::awt::XControlModel > xCtrlModel;
455             aCtrl >>= xCtrlModel;
456             DlgEdObj* pCtrlObj = new DlgEdObj();
457             pCtrlObj->SetUnoControlModel( xCtrlModel );
458             pCtrlObj->SetDlgEdForm( pDlgEdForm );
459             pDlgEdForm->AddChild( pCtrlObj );
460             pDlgEdModel->GetPage(0)->InsertObject( pCtrlObj );
461             pCtrlObj->SetRectFromProps();
462             pCtrlObj->UpdateStep();
463             pCtrlObj->StartListening();
464         }
465     }
466 
467     bFirstDraw = sal_True;
468 
469     pDlgEdModel->SetChanged( sal_False );
470 }
471 
472 void DlgEditor::ResetDialog( void )
473 {
474     DlgEdForm* pOldDlgEdForm = pDlgEdForm;
475     DlgEdPage* pPage = (DlgEdPage*)pDlgEdModel->GetPage(0);
476     SdrPageView* pPgView = pDlgEdView->GetSdrPageView();
477     sal_Bool bWasMarked = pDlgEdView->IsObjMarked( pOldDlgEdForm );
478     pDlgEdView->UnmarkAll();
479     pPage->Clear();
480     pPage->SetDlgEdForm( NULL );
481     SetDialog( m_xUnoControlDialogModel );
482     if( bWasMarked )
483         pDlgEdView->MarkObj( pDlgEdForm, pPgView, sal_False );
484 }
485 
486 
487 //----------------------------------------------------------------------------
488 
489 Reference< util::XNumberFormatsSupplier > const & DlgEditor::GetNumberFormatsSupplier()
490 {
491     if ( !m_xSupplier.is() )
492     {
493         Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
494         Reference< util::XNumberFormatsSupplier > xSupplier( xMSF->createInstance(
495             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.NumberFormatsSupplier") ) ), UNO_QUERY );
496 
497         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
498         if ( !m_xSupplier.is() )
499         {
500             m_xSupplier = xSupplier;
501         }
502     }
503     return m_xSupplier;
504 }
505 
506 //----------------------------------------------------------------------------
507 
508 void DlgEditor::MouseButtonDown( const MouseEvent& rMEvt )
509 {
510     if( pWindow )
511         pWindow->GrabFocus();
512     pFunc->MouseButtonDown( rMEvt );
513 }
514 
515 //----------------------------------------------------------------------------
516 
517 void DlgEditor::MouseButtonUp( const MouseEvent& rMEvt )
518 {
519     sal_Bool bRet = pFunc->MouseButtonUp( rMEvt );
520 
521     if( (eMode == DLGED_INSERT) )
522         bCreateOK = bRet;
523 }
524 
525 //----------------------------------------------------------------------------
526 
527 void DlgEditor::MouseMove( const MouseEvent& rMEvt )
528 {
529     pFunc->MouseMove( rMEvt );
530 }
531 
532 //----------------------------------------------------------------------------
533 
534 sal_Bool DlgEditor::KeyInput( const KeyEvent& rKEvt )
535 {
536     return pFunc->KeyInput( rKEvt );
537 }
538 
539 //----------------------------------------------------------------------------
540 
541 void DlgEditor::Paint( const Rectangle& rRect )
542 {
543     aPaintRect = rRect;
544     PaintTimeout( &aPaintTimer );
545 }
546 
547 //----------------------------------------------------------------------------
548 
549 IMPL_LINK( DlgEditor, PaintTimeout, Timer *, EMPTYARG )
550 {
551     if( !pDlgEdView )
552         return 0;
553 
554     mnPaintGuard++;
555 
556     Size aMacSize;
557     if( bFirstDraw &&
558         pWindow->IsVisible() &&
559         (pWindow->GetOutputSize() != aMacSize) )
560     {
561         bFirstDraw = sal_False;
562 
563         // get property set
564         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  xPSet(pDlgEdForm->GetUnoControlModel(), ::com::sun::star::uno::UNO_QUERY);
565 
566         if ( xPSet.is() )
567         {
568             // get dialog size from properties
569             sal_Int32 nWidth = 0, nHeight = 0;
570             xPSet->getPropertyValue( DLGED_PROP_WIDTH ) >>= nWidth;
571             xPSet->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nHeight;
572 
573             if ( nWidth == 0 && nHeight == 0 )
574             {
575                 Size   aSize = pWindow->PixelToLogic( Size( 400, 300 ) );
576 
577                 // align with grid
578                 Size aGridSize_(long(pDlgEdView->GetSnapGridWidthX()), long(pDlgEdView->GetSnapGridWidthY()));
579                 aSize.Width()  -= aSize.Width()  % aGridSize_.Width();
580                 aSize.Height() -= aSize.Height() % aGridSize_.Height();
581 
582                 Point  aPos;
583                 Size   aOutSize = pWindow->GetOutputSize();
584                 aPos.X() = (aOutSize.Width()>>1)  -  (aSize.Width()>>1);
585                 aPos.Y() = (aOutSize.Height()>>1) -  (aSize.Height()>>1);
586 
587                 // align with grid
588                 aPos.X() -= aPos.X() % aGridSize_.Width();
589                 aPos.Y() -= aPos.Y() % aGridSize_.Height();
590 
591                 // don't put in the corner
592                 Point aMinPos = pWindow->PixelToLogic( Point( 30, 20 ) );
593                 if( (aPos.X() < aMinPos.X()) || (aPos.Y() < aMinPos.Y()) )
594                 {
595                     aPos = aMinPos;
596                     aPos.X() -= aPos.X() % aGridSize_.Width();
597                     aPos.Y() -= aPos.Y() % aGridSize_.Height();
598                 }
599 
600                 // set dialog position and size
601                 pDlgEdForm->SetSnapRect( Rectangle( aPos, aSize ) );
602                 pDlgEdForm->EndListening(sal_False);
603                 pDlgEdForm->SetPropsFromRect();
604                 pDlgEdForm->GetDlgEditor()->SetDialogModelChanged(sal_True);
605                 pDlgEdForm->StartListening();
606 
607                 // set position and size of controls
608                 sal_uLong nObjCount;
609                 if ( pDlgEdPage && ( ( nObjCount = pDlgEdPage->GetObjCount() ) > 0 ) )
610                 {
611                     for ( sal_uLong i = 0 ; i < nObjCount ; i++ )
612                     {
613                         SdrObject* pObj = pDlgEdPage->GetObj(i);
614                         DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pObj);
615                         if ( pDlgEdObj && !pDlgEdObj->ISA(DlgEdForm) )
616                             pDlgEdObj->SetRectFromProps();
617                     }
618                 }
619             }
620         }
621     }
622 
623     // repaint, get PageView and prepare Region
624     SdrPageView* pPgView = pDlgEdView->GetSdrPageView();
625     const Region aPaintRectRegion(aPaintRect);
626 
627 
628     // #i74769#
629     SdrPaintWindow* pTargetPaintWindow = 0;
630 
631     // mark repaint start
632     if(pPgView)
633     {
634         pTargetPaintWindow = pPgView->GetView().BeginDrawLayers(pWindow, aPaintRectRegion);
635         OSL_ENSURE(pTargetPaintWindow, "BeginDrawLayers: Got no SdrPaintWindow (!)");
636     }
637 
638     // draw background self using wallpaper
639     // #i79128# ...and use correct OutDev for that
640     if(pTargetPaintWindow)
641     {
642         OutputDevice& rTargetOutDev = pTargetPaintWindow->GetTargetOutputDevice();
643         rTargetOutDev.DrawWallpaper(aPaintRect, Wallpaper(Color(COL_WHITE)));
644     }
645 
646     // do paint (unbuffered) and mark repaint end
647     if(pPgView)
648     {
649         // paint of control layer is done in EndDrawLayers anyway...
650         pPgView->GetView().EndDrawLayers(*pTargetPaintWindow, true);
651     }
652 
653     mnPaintGuard--;
654 
655     DBG_ASSERT(pWindow,"Window not set");
656     return 0;
657 }
658 
659 //----------------------------------------------------------------------------
660 
661 IMPL_LINK( DlgEditor, MarkTimeout, Timer *, EMPTYARG )
662 {
663     BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
664 
665     SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
666     SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow( SID_SHOW_PROPERTYBROWSER ) : NULL;
667     if ( !pChildWin )
668         return 0L;
669 
670     ((PropBrw*)(pChildWin->GetWindow()))->Update( pIDEShell );
671 
672     return 1;
673 }
674 
675 //----------------------------------------------------------------------------
676 
677 void DlgEditor::SetMode( DlgEdMode eNewMode )
678 {
679     if ( eNewMode != eMode )
680     {
681         delete pFunc;
682 
683         if ( eNewMode == DLGED_INSERT )
684             pFunc = new DlgEdFuncInsert( this );
685         else
686             pFunc = new DlgEdFuncSelect( this );
687 
688         if ( eNewMode == DLGED_READONLY )
689             pDlgEdModel->SetReadOnly( sal_True );
690         else
691             pDlgEdModel->SetReadOnly( sal_False );
692     }
693 
694     if ( eNewMode == DLGED_TEST )
695         ShowDialog();
696 
697     eMode = eNewMode;
698 }
699 
700 //----------------------------------------------------------------------------
701 
702 void DlgEditor::SetInsertObj( sal_uInt16 eObj )
703 {
704     eActObj = eObj;
705 
706     if( pDlgEdView )
707         pDlgEdView->SetCurrentObj( eActObj, DlgInventor );
708 }
709 
710 //----------------------------------------------------------------------------
711 
712 sal_uInt16 DlgEditor::GetInsertObj() const
713 {
714     return eActObj;
715 }
716 
717 //----------------------------------------------------------------------------
718 
719 void DlgEditor::CreateDefaultObject()
720 {
721     // create object by factory
722     SdrObject* pObj = SdrObjFactory::MakeNewObject( pDlgEdView->GetCurrentObjInventor(), pDlgEdView->GetCurrentObjIdentifier(), pDlgEdPage );
723 
724     DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, pObj );
725     if ( pDlgEdObj )
726     {
727         // set position and size
728         Size aSize = pWindow->PixelToLogic( Size( 96, 24 ) );
729         Point aPoint = (pDlgEdForm->GetSnapRect()).Center();
730         aPoint.X() -= aSize.Width() / 2;
731         aPoint.Y() -= aSize.Height() / 2;
732         pDlgEdObj->SetSnapRect( Rectangle( aPoint, aSize ) );
733 
734         // set default property values
735         pDlgEdObj->SetDefaults();
736 
737         // insert object into drawing page
738         SdrPageView* pPageView = pDlgEdView->GetSdrPageView();
739         pDlgEdView->InsertObjectAtView( pDlgEdObj, *pPageView);
740 
741         // start listening
742         pDlgEdObj->StartListening();
743     }
744 }
745 
746 //----------------------------------------------------------------------------
747 
748 void DlgEditor::Cut()
749 {
750     Copy();
751     Delete();
752 }
753 
754 //----------------------------------------------------------------------------
755 
756 void implCopyStreamToByteSequence( Reference< XInputStream > xStream,
757     Sequence< sal_Int8 >& bytes )
758 {
759     sal_Int32 nRead = xStream->readBytes( bytes, xStream->available() );
760     for (;;)
761     {
762         Sequence< sal_Int8 > readBytes;
763         nRead = xStream->readBytes( readBytes, 1024 );
764         if (! nRead)
765             break;
766 
767         sal_Int32 nPos = bytes.getLength();
768         bytes.realloc( nPos + nRead );
769         ::rtl_copyMemory( bytes.getArray() + nPos, readBytes.getConstArray(), (sal_uInt32)nRead );
770     }
771 }
772 
773 void DlgEditor::Copy()
774 {
775     if( !pDlgEdView->AreObjectsMarked() )
776         return;
777 
778     // stop all drawing actions
779     pDlgEdView->BrkAction();
780 
781     // create an empty clipboard dialog model
782     Reference< util::XCloneable > xClone( m_xUnoControlDialogModel, UNO_QUERY );
783     Reference< util::XCloneable > xNewClone = xClone->createClone();
784     Reference< container::XNameContainer > xClipDialogModel( xNewClone, UNO_QUERY );
785 
786     Reference< container::XNameAccess > xNAcc( xClipDialogModel, UNO_QUERY );
787     if ( xNAcc.is() )
788     {
789         Sequence< OUString > aNames = xNAcc->getElementNames();
790         const OUString* pNames = aNames.getConstArray();
791         sal_uInt32 nCtrls = aNames.getLength();
792 
793         for ( sal_uInt32 n = 0; n < nCtrls; n++ )
794         {
795             xClipDialogModel->removeByName( pNames[n] );
796         }
797     }
798 
799     // insert control models of marked objects into clipboard dialog model
800     sal_uLong nMark = pDlgEdView->GetMarkedObjectList().GetMarkCount();
801     for( sal_uLong i = 0; i < nMark; i++ )
802     {
803         SdrObject* pObj = pDlgEdView->GetMarkedObjectList().GetMark(i)->GetMarkedSdrObj();
804         DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pObj);
805 
806         if (pDlgEdObj && !pDlgEdObj->ISA(DlgEdForm) )
807         {
808             ::rtl::OUString aName;
809             Reference< beans::XPropertySet >  xMarkPSet(pDlgEdObj->GetUnoControlModel(), uno::UNO_QUERY);
810             if (xMarkPSet.is())
811             {
812                 xMarkPSet->getPropertyValue( DLGED_PROP_NAME ) >>= aName;
813             }
814 
815             Reference< container::XNameAccess > xNameAcc(m_xUnoControlDialogModel, UNO_QUERY );
816             if ( xNameAcc.is() && xNameAcc->hasByName(aName) )
817             {
818                 Any aCtrl = xNameAcc->getByName( aName );
819 
820                 // clone control model
821                 Reference< util::XCloneable > xCtrl;
822                 aCtrl >>= xCtrl;
823                 Reference< util::XCloneable > xNewCtrl = xCtrl->createClone();
824                 Any aNewCtrl;
825                 aNewCtrl <<= xNewCtrl;
826 
827                 if (xClipDialogModel.is())
828                     xClipDialogModel->insertByName( aName , aNewCtrl );
829             }
830         }
831     }
832 
833     // export clipboard dialog model to xml
834     Reference< XComponentContext > xContext;
835     Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY );
836     OSL_ASSERT( xProps.is() );
837     OSL_VERIFY( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext );
838     Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xClipDialogModel, xContext );
839     Reference< XInputStream > xStream( xISP->createInputStream() );
840     Sequence< sal_Int8 > DialogModelBytes;
841     implCopyStreamToByteSequence( xStream, DialogModelBytes );
842     xStream->closeInput();
843 
844     // set clipboard content
845     Reference< datatransfer::clipboard::XClipboard > xClipboard = GetWindow()->GetClipboard();
846     if ( xClipboard.is() )
847     {
848         // With resource?
849         uno::Reference< beans::XPropertySet > xDialogModelPropSet( m_xUnoControlDialogModel, uno::UNO_QUERY );
850         uno::Reference< resource::XStringResourcePersistence > xStringResourcePersistence;
851         if( xDialogModelPropSet.is() )
852         {
853             try
854             {
855                 Any aResourceResolver = xDialogModelPropSet->getPropertyValue( aResourceResolverPropName );
856                 aResourceResolver >>= xStringResourcePersistence;
857             }
858             catch( UnknownPropertyException& )
859             {}
860         }
861 
862         DlgEdTransferableImpl* pTrans = NULL;
863         if( xStringResourcePersistence.is() )
864         {
865             // With resource, support old and new format
866 
867             // Export xClipDialogModel another time with ids replaced by current language string
868             uno::Reference< resource::XStringResourceManager >
869                 xStringResourceManager( xStringResourcePersistence, uno::UNO_QUERY );
870             LocalizationMgr::resetResourceForDialog( xClipDialogModel, xStringResourceManager );
871             Reference< XInputStreamProvider > xISP2 = ::xmlscript::exportDialogModel( xClipDialogModel, xContext );
872             Reference< XInputStream > xStream2( xISP2->createInputStream() );
873             Sequence< sal_Int8 > NoResourceDialogModelBytes;
874             implCopyStreamToByteSequence( xStream2, NoResourceDialogModelBytes );
875             xStream2->closeInput();
876 
877             // Old format contains dialog with replaced ids
878             Sequence< Any > aSeqData(2);
879             Any aNoResourceDialogModelBytesAny;
880             aNoResourceDialogModelBytesAny <<= NoResourceDialogModelBytes;
881             aSeqData[0] = aNoResourceDialogModelBytesAny;
882 
883             // New format contains dialog and resource
884             Sequence< sal_Int8 > aResData = xStringResourcePersistence->exportBinary();
885 
886             // Create sequence for combined dialog and resource
887             sal_Int32 nDialogDataLen = DialogModelBytes.getLength();
888             sal_Int32 nResDataLen = aResData.getLength();
889 
890             // Combined data = 4 Bytes 32Bit Offset to begin of resource data, lowest byte first
891             // + nDialogDataLen bytes dialog data + nResDataLen resource data
892             sal_Int32 nTotalLen = 4 + nDialogDataLen + nResDataLen;
893             sal_Int32 nResOffset = 4 + nDialogDataLen;
894             Sequence< sal_Int8 > aCombinedData( nTotalLen );
895             sal_Int8* pCombinedData = aCombinedData.getArray();
896 
897             // Write offset
898             sal_Int32 n = nResOffset;
899             for( sal_Int16 i = 0 ; i < 4 ; i++ )
900             {
901                 pCombinedData[i] = sal_Int8( n & 0xff );
902                 n >>= 8;
903             }
904             ::rtl_copyMemory( pCombinedData + 4, DialogModelBytes.getConstArray(), nDialogDataLen );
905             ::rtl_copyMemory( pCombinedData + nResOffset, aResData.getConstArray(), nResDataLen );
906 
907             Any aCombinedDataAny;
908             aCombinedDataAny <<= aCombinedData;
909             aSeqData[1] = aCombinedDataAny;
910 
911             pTrans = new DlgEdTransferableImpl( m_ClipboardDataFlavorsResource, aSeqData );
912         }
913         else
914         {
915             // No resource, support only old format
916             Sequence< Any > aSeqData(1);
917             Any aDialogModelBytesAny;
918             aDialogModelBytesAny <<= DialogModelBytes;
919             aSeqData[0] = aDialogModelBytesAny;
920             pTrans = new DlgEdTransferableImpl( m_ClipboardDataFlavors , aSeqData );
921         }
922         const sal_uInt32 nRef = Application::ReleaseSolarMutex();
923         xClipboard->setContents( pTrans , pTrans );
924         Application::AcquireSolarMutex( nRef );
925     }
926 }
927 
928 //----------------------------------------------------------------------------
929 
930 void DlgEditor::Paste()
931 {
932     // stop all drawing actions
933     pDlgEdView->BrkAction();
934 
935     // unmark all objects
936     pDlgEdView->UnmarkAll();
937 
938     // get clipboard
939     Reference< datatransfer::clipboard::XClipboard > xClipboard = GetWindow()->GetClipboard();
940     if ( xClipboard.is() )
941     {
942         // get clipboard content
943         const sal_uInt32 nRef = Application::ReleaseSolarMutex();
944         Reference< datatransfer::XTransferable > xTransf = xClipboard->getContents();
945         Application::AcquireSolarMutex( nRef );
946         if ( xTransf.is() )
947         {
948             // Is target dialog (library) localized?
949             uno::Reference< beans::XPropertySet > xDialogModelPropSet( m_xUnoControlDialogModel, uno::UNO_QUERY );
950             uno::Reference< resource::XStringResourceManager > xStringResourceManager;
951             if( xDialogModelPropSet.is() )
952             {
953                 try
954                 {
955                     Any aResourceResolver = xDialogModelPropSet->getPropertyValue( aResourceResolverPropName );
956                     aResourceResolver >>= xStringResourceManager;
957                 }
958                 catch( UnknownPropertyException& )
959                 {}
960             }
961             bool bLocalized = false;
962             if( xStringResourceManager.is() )
963                 bLocalized = ( xStringResourceManager->getLocales().getLength() > 0 );
964 
965             if ( xTransf->isDataFlavorSupported( m_ClipboardDataFlavors[0] ) )
966             {
967                 // create clipboard dialog model from xml
968                 Reference< lang::XMultiServiceFactory > xMSF = getProcessServiceFactory();
969                 Reference< container::XNameContainer > xClipDialogModel( xMSF->createInstance
970                     ( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ),
971                         uno::UNO_QUERY );
972 
973                 bool bSourceIsLocalized = false;
974                 Sequence< sal_Int8 > DialogModelBytes;
975                 Sequence< sal_Int8 > aResData;
976                 if( bLocalized && xTransf->isDataFlavorSupported( m_ClipboardDataFlavorsResource[1] ) )
977                 {
978                     bSourceIsLocalized = true;
979 
980                     Any aCombinedDataAny = xTransf->getTransferData( m_ClipboardDataFlavorsResource[1] );
981                     Sequence< sal_Int8 > aCombinedData;
982                     aCombinedDataAny >>= aCombinedData;
983                     const sal_Int8* pCombinedData = aCombinedData.getConstArray();
984 
985                     sal_Int32 nTotalLen = aCombinedData.getLength();
986 
987                     // Reading offset
988                     sal_Int32 nResOffset = 0;
989                     sal_Int32 nFactor = 1;
990                     for( sal_Int16 i = 0; i < 4; i++ )
991                     {
992                         nResOffset += nFactor * sal_uInt8( pCombinedData[i] );
993                         nFactor *= 256;
994                     }
995 
996                     sal_Int32 nResDataLen = nTotalLen - nResOffset;
997                     sal_Int32 nDialogDataLen = nTotalLen - nResDataLen - 4;
998 
999                     DialogModelBytes.realloc( nDialogDataLen );
1000                     ::rtl_copyMemory( DialogModelBytes.getArray(), pCombinedData + 4, nDialogDataLen );
1001 
1002                     aResData.realloc( nResDataLen );
1003                     ::rtl_copyMemory( aResData.getArray(), pCombinedData + nResOffset, nResDataLen );
1004                 }
1005                 else
1006                 {
1007                     Any aAny = xTransf->getTransferData( m_ClipboardDataFlavors[0] );
1008                     aAny >>= DialogModelBytes;
1009                 }
1010 
1011                 if ( xClipDialogModel.is() )
1012                 {
1013                     Reference< XComponentContext > xContext;
1014                     Reference< beans::XPropertySet > xProps( xMSF, UNO_QUERY );
1015                     OSL_ASSERT( xProps.is() );
1016                     OSL_VERIFY( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext );
1017                     ::xmlscript::importDialogModel( ::xmlscript::createInputStream( *((::rtl::ByteSequence*)(&DialogModelBytes)) ) , xClipDialogModel, xContext );
1018                 }
1019 
1020                 // get control models from clipboard dialog model
1021                 Reference< ::com::sun::star::container::XNameAccess > xNameAcc( xClipDialogModel, UNO_QUERY );
1022                 if ( xNameAcc.is() )
1023                 {
1024                     Sequence< OUString > aNames = xNameAcc->getElementNames();
1025                     const OUString* pNames = aNames.getConstArray();
1026                     sal_uInt32 nCtrls = aNames.getLength();
1027 
1028                     Reference< resource::XStringResourcePersistence > xStringResourcePersistence;
1029                     if( nCtrls > 0 && bSourceIsLocalized )
1030                     {
1031                         Reference< lang::XMultiServiceFactory > xSMgr = getProcessServiceFactory();
1032                         xStringResourcePersistence = Reference< resource::XStringResourcePersistence >( xSMgr->createInstance
1033                             ( ::rtl::OUString::createFromAscii( "com.sun.star.resource.StringResource" ) ), UNO_QUERY );
1034                         if( xStringResourcePersistence.is() )
1035                             xStringResourcePersistence->importBinary( aResData );
1036                     }
1037                     for( sal_uInt32 n = 0; n < nCtrls; n++ )
1038                     {
1039                         Any aA = xNameAcc->getByName( pNames[n] );
1040                         Reference< ::com::sun::star::awt::XControlModel > xCM;
1041                         aA >>= xCM;
1042 
1043                         // clone the control model
1044                         Reference< util::XCloneable > xClone( xCM, uno::UNO_QUERY );
1045                         Reference< awt::XControlModel > xCtrlModel( xClone->createClone(), uno::UNO_QUERY );
1046 
1047                         DlgEdObj* pCtrlObj = new DlgEdObj();
1048                         pCtrlObj->SetDlgEdForm(pDlgEdForm);         // set parent form
1049                         pDlgEdForm->AddChild(pCtrlObj);             // add child to parent form
1050                         pCtrlObj->SetUnoControlModel( xCtrlModel ); // set control model
1051 
1052                         // set new name
1053                         ::rtl::OUString aOUniqueName( pCtrlObj->GetUniqueName() );
1054                         Reference< beans::XPropertySet > xPSet( xCtrlModel , UNO_QUERY );
1055                         Any aUniqueName;
1056                         aUniqueName <<= aOUniqueName;
1057                         xPSet->setPropertyValue( DLGED_PROP_NAME, aUniqueName );
1058 
1059                         // set tabindex
1060                         Reference< container::XNameAccess > xNA( m_xUnoControlDialogModel , UNO_QUERY );
1061                         Sequence< OUString > aNames_ = xNA->getElementNames();
1062                         Any aTabIndex;
1063                         aTabIndex <<= (sal_Int16) aNames_.getLength();
1064                         xPSet->setPropertyValue( DLGED_PROP_TABINDEX, aTabIndex );
1065 
1066                         if( bLocalized )
1067                         {
1068                             Any aControlAny;
1069                             aControlAny <<= xCtrlModel;
1070                             if( bSourceIsLocalized && xStringResourcePersistence.is() )
1071                             {
1072                                 Reference< resource::XStringResourceResolver >
1073                                     xSourceStringResolver( xStringResourcePersistence, UNO_QUERY );
1074                                 LocalizationMgr::copyResourcesForPastedEditorObject( this,
1075                                     aControlAny, aOUniqueName, xSourceStringResolver );
1076                             }
1077                             else
1078                             {
1079                                 LocalizationMgr::setControlResourceIDsForNewEditorObject
1080                                     ( this, aControlAny, aOUniqueName );
1081                             }
1082                         }
1083 
1084                         // insert control model in editor dialog model
1085                         Any aCtrlModel;
1086                         aCtrlModel <<= xCtrlModel;
1087                         m_xUnoControlDialogModel->insertByName( aOUniqueName , aCtrlModel );
1088 
1089                         // insert object into drawing page
1090                         pDlgEdModel->GetPage(0)->InsertObject( pCtrlObj );
1091                         pCtrlObj->SetRectFromProps();
1092                         pCtrlObj->UpdateStep();
1093                         pDlgEdForm->UpdateTabOrderAndGroups();              // #110559#
1094                         pCtrlObj->StartListening();                         // start listening
1095 
1096                         // mark object
1097                         SdrPageView* pPgView = pDlgEdView->GetSdrPageView();
1098                         pDlgEdView->MarkObj( pCtrlObj, pPgView, sal_False, sal_True);
1099                     }
1100 
1101                     // center marked objects in dialog editor form
1102                     Point aMarkCenter = (pDlgEdView->GetMarkedObjRect()).Center();
1103                     Point aFormCenter = (pDlgEdForm->GetSnapRect()).Center();
1104                     Point aPoint = aFormCenter - aMarkCenter;
1105                     Size  aSize( aPoint.X() , aPoint.Y() );
1106                     pDlgEdView->MoveMarkedObj( aSize );                     // update of control model properties (position + size) in NbcMove
1107                     pDlgEdView->MarkListHasChanged();
1108 
1109                     // dialog model changed
1110                     SetDialogModelChanged(sal_True);
1111                 }
1112             }
1113         }
1114     }
1115 }
1116 
1117 //----------------------------------------------------------------------------
1118 
1119 void DlgEditor::Delete()
1120 {
1121     if( !pDlgEdView->AreObjectsMarked() )
1122         return;
1123 
1124     // remove control models of marked objects from dialog model
1125     sal_uLong nMark = pDlgEdView->GetMarkedObjectList().GetMarkCount();
1126 
1127     for( sal_uLong i = 0; i < nMark; i++ )
1128     {
1129         SdrObject* pObj = pDlgEdView->GetMarkedObjectList().GetMark(i)->GetMarkedSdrObj();
1130         DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pObj);
1131 
1132         if ( pDlgEdObj && !pDlgEdObj->ISA(DlgEdForm) )
1133         {
1134             // get name from property
1135             ::rtl::OUString aName;
1136             uno::Reference< beans::XPropertySet >  xPSet(pDlgEdObj->GetUnoControlModel(), uno::UNO_QUERY);
1137             if (xPSet.is())
1138             {
1139                 xPSet->getPropertyValue( DLGED_PROP_NAME ) >>= aName;
1140             }
1141 
1142             // remove control from dialog model
1143             Reference< ::com::sun::star::container::XNameAccess > xNameAcc(pDlgEdObj->GetDlgEdForm()->GetUnoControlModel(), UNO_QUERY );
1144             if ( xNameAcc.is() && xNameAcc->hasByName(aName) )
1145             {
1146                 Reference< ::com::sun::star::container::XNameContainer > xCont(xNameAcc, UNO_QUERY );
1147                 if ( xCont.is() )
1148                 {
1149                     if( xCont->hasByName( aName ) )
1150                     {
1151                         Any aAny = xCont->getByName( aName );
1152                         LocalizationMgr::deleteControlResourceIDsForDeletedEditorObject( this, aAny, aName );
1153                     }
1154                     xCont->removeByName( aName );
1155                 }
1156             }
1157 
1158             // remove child from parent form
1159             pDlgEdForm->RemoveChild( pDlgEdObj );
1160         }
1161     }
1162 
1163     // update tab indices
1164     pDlgEdForm->UpdateTabIndices();
1165 
1166     pDlgEdView->BrkAction();
1167 
1168     sal_Bool bDlgMarked = UnmarkDialog();
1169     pDlgEdView->DeleteMarked();
1170     if( bDlgMarked )
1171         RemarkDialog();
1172 }
1173 
1174 //----------------------------------------------------------------------------
1175 
1176 sal_Bool DlgEditor::IsPasteAllowed()
1177 {
1178     sal_Bool bPaste = sal_False;
1179 
1180     // get clipboard
1181     Reference< datatransfer::clipboard::XClipboard > xClipboard = GetWindow()->GetClipboard();
1182     if ( xClipboard.is() )
1183     {
1184         // get clipboard content
1185         const sal_uInt32 nRef = Application::ReleaseSolarMutex();
1186         Reference< datatransfer::XTransferable > xTransf = xClipboard->getContents();
1187         Application::AcquireSolarMutex( nRef );
1188         if ( xTransf.is() )
1189         {
1190             if ( xTransf->isDataFlavorSupported( m_ClipboardDataFlavors[0] ) )
1191             {
1192                 bPaste = sal_True;
1193             }
1194         }
1195     }
1196 
1197     return bPaste;
1198 }
1199 
1200 //----------------------------------------------------------------------------
1201 
1202 void DlgEditor::ShowProperties()
1203 {
1204     BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
1205     SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
1206     if ( pViewFrame && !pViewFrame->HasChildWindow( SID_SHOW_PROPERTYBROWSER ) )
1207         pViewFrame->ToggleChildWindow( SID_SHOW_PROPERTYBROWSER );
1208 }
1209 
1210 //----------------------------------------------------------------------------
1211 
1212 void DlgEditor::UpdatePropertyBrowserDelayed()
1213 {
1214     aMarkTimer.Start();
1215 }
1216 
1217 //----------------------------------------------------------------------------
1218 
1219 sal_Bool DlgEditor::IsModified() const
1220 {
1221     return pDlgEdModel->IsChanged() || bDialogModelChanged;
1222 }
1223 
1224 //----------------------------------------------------------------------------
1225 
1226 void DlgEditor::ClearModifyFlag()
1227 {
1228     pDlgEdModel->SetChanged( sal_False );
1229     bDialogModelChanged = sal_False;
1230 }
1231 
1232 //----------------------------------------------------------------------------
1233 
1234 #define LMARGPRN        1700
1235 #define RMARGPRN         900
1236 #define TMARGPRN        2000
1237 #define BMARGPRN        1000
1238 #define BORDERPRN       300
1239 
1240 //----------------------------------------------------------------------------
1241 
1242 void lcl_PrintHeader( Printer* pPrinter, const String& rTitle ) // not working yet
1243 {
1244     pPrinter->Push();
1245 
1246     short nLeftMargin = LMARGPRN;
1247     Size aSz = pPrinter->GetOutputSize();
1248     short nBorder = BORDERPRN;
1249 
1250     pPrinter->SetLineColor( COL_BLACK );
1251     pPrinter->SetFillColor();
1252 
1253     Font aFont( pPrinter->GetFont() );
1254     aFont.SetWeight( WEIGHT_BOLD );
1255     aFont.SetAlign( ALIGN_BOTTOM );
1256     pPrinter->SetFont( aFont );
1257 
1258     long nFontHeight = pPrinter->GetTextHeight();
1259 
1260     // 1.Border => Strich, 2+3 Border = Freiraum.
1261     long nYTop = TMARGPRN-3*nBorder-nFontHeight;
1262 
1263     long nXLeft = nLeftMargin-nBorder;
1264     long nXRight = aSz.Width()-RMARGPRN+nBorder;
1265 
1266     pPrinter->DrawRect( Rectangle(
1267         Point( nXLeft, nYTop ),
1268         Size( nXRight-nXLeft, aSz.Height() - nYTop - BMARGPRN + nBorder ) ) );
1269 
1270     long nY = TMARGPRN-2*nBorder;
1271     Point aPos( nLeftMargin, nY );
1272     pPrinter->DrawText( aPos, rTitle );
1273 
1274     nY = TMARGPRN-nBorder;
1275 
1276     pPrinter->DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) );
1277 
1278     pPrinter->Pop();
1279 }
1280 
1281 //----------------------------------------------------------------------------
1282 
1283 sal_Int32 DlgEditor::countPages( Printer* )
1284 {
1285     return 1;
1286 }
1287 
1288 void DlgEditor::printPage( sal_Int32 nPage, Printer* pPrinter, const String& rTitle )
1289 {
1290     if( nPage == 0 )
1291         Print( pPrinter, rTitle );
1292 }
1293 
1294 //----------------------------------------------------------------------------
1295 
1296 void DlgEditor::Print( Printer* pPrinter, const String& rTitle )    // not working yet
1297 {
1298     if( pDlgEdView )
1299     {
1300         MapMode aOldMap( pPrinter->GetMapMode());
1301         Font aOldFont( pPrinter->GetFont() );
1302 
1303         MapMode aMap( MAP_100TH_MM );
1304         pPrinter->SetMapMode( aMap );
1305         Font aFont;
1306 #ifdef OS2
1307         //aFont.SetName( System::GetStandardFont( STDFONT_SWISS ).GetName() );
1308 #endif
1309         aFont.SetAlign( ALIGN_BOTTOM );
1310         aFont.SetSize( Size( 0, 360 ));
1311         pPrinter->SetFont( aFont );
1312 
1313         Size aPaperSz = pPrinter->GetOutputSize();
1314         aPaperSz.Width() -= (LMARGPRN+RMARGPRN);
1315         aPaperSz.Height() -= (TMARGPRN+BMARGPRN);
1316 
1317         lcl_PrintHeader( pPrinter, rTitle );
1318 
1319         Bitmap aDlg;
1320 #ifdef OS2
1321         Bitmap* pDlg = new Bitmap;
1322         //pSbxForm->SnapShot( *pDlg );
1323         SvMemoryStream* pStrm = new SvMemoryStream;
1324         *pStrm << *pDlg;
1325         delete pDlg;
1326         pStrm->Seek(0);
1327         *pStrm >> aDlg;
1328         delete pStrm;
1329 #else
1330         //pSbxForm->SnapShot( aDlg );
1331 #endif
1332         Size aBmpSz( pPrinter->PixelToLogic( aDlg.GetSizePixel() ) );
1333         double nPaperSzWidth = aPaperSz.Width();
1334         double nPaperSzHeight = aPaperSz.Height();
1335         double nBmpSzWidth = aBmpSz.Width();
1336         double nBmpSzHeight = aBmpSz.Height();
1337         double nScaleX = (nPaperSzWidth / nBmpSzWidth );
1338         double nScaleY = (nPaperSzHeight / nBmpSzHeight );
1339 
1340         Size aOutputSz;
1341         if( nBmpSzHeight * nScaleX <= nPaperSzHeight )
1342         {
1343             aOutputSz.Width() = (long)(((double)nBmpSzWidth) * nScaleX);
1344             aOutputSz.Height() = (long)(((double)nBmpSzHeight) * nScaleX);
1345         }
1346         else
1347         {
1348             aOutputSz.Width() = (long)(((double)nBmpSzWidth) * nScaleY);
1349             aOutputSz.Height() = (long)(((double)nBmpSzHeight) * nScaleY);
1350         }
1351 
1352         Point aPosOffs(
1353             (aPaperSz.Width() / 2) - (aOutputSz.Width() / 2),
1354             (aPaperSz.Height()/ 2) - (aOutputSz.Height() / 2));
1355 
1356         aPosOffs.X() += LMARGPRN;
1357         aPosOffs.Y() += TMARGPRN;
1358 
1359         pPrinter->DrawBitmap( aPosOffs, aOutputSz, aDlg );
1360 
1361         pPrinter->SetMapMode( aOldMap );
1362         pPrinter->SetFont( aOldFont );
1363     }
1364 }
1365 
1366 //----------------------------------------------------------------------------
1367 
1368 bool DlgEditor::AdjustPageSize()
1369 {
1370     bool bAdjustedPageSize = false;
1371     Reference< beans::XPropertySet > xPSet( m_xUnoControlDialogModel, UNO_QUERY );
1372     if ( xPSet.is() )
1373     {
1374         sal_Int32 nFormXIn = 0, nFormYIn = 0, nFormWidthIn = 0, nFormHeightIn = 0;
1375         xPSet->getPropertyValue( DLGED_PROP_POSITIONX ) >>= nFormXIn;
1376         xPSet->getPropertyValue( DLGED_PROP_POSITIONY ) >>= nFormYIn;
1377         xPSet->getPropertyValue( DLGED_PROP_WIDTH ) >>= nFormWidthIn;
1378         xPSet->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nFormHeightIn;
1379 
1380         sal_Int32 nFormX, nFormY, nFormWidth, nFormHeight;
1381         if ( pDlgEdForm && pDlgEdForm->TransformFormToSdrCoordinates( nFormXIn, nFormYIn, nFormWidthIn, nFormHeightIn, nFormX, nFormY, nFormWidth, nFormHeight ) )
1382         {
1383             Size aPageSizeDelta( 400, 300 );
1384             DBG_ASSERT( pWindow, "DlgEditor::AdjustPageSize: no window!" );
1385             if ( pWindow )
1386                 aPageSizeDelta = pWindow->PixelToLogic( aPageSizeDelta, MapMode( MAP_100TH_MM ) );
1387 
1388             sal_Int32 nNewPageWidth = nFormX + nFormWidth + aPageSizeDelta.Width();
1389             sal_Int32 nNewPageHeight = nFormY + nFormHeight + aPageSizeDelta.Height();
1390 
1391             Size aPageSizeMin( DLGED_PAGE_WIDTH_MIN, DLGED_PAGE_HEIGHT_MIN );
1392             DBG_ASSERT( pWindow, "DlgEditor::AdjustPageSize: no window!" );
1393             if ( pWindow )
1394                 aPageSizeMin = pWindow->PixelToLogic( aPageSizeMin, MapMode( MAP_100TH_MM ) );
1395             sal_Int32 nPageWidthMin = aPageSizeMin.Width();
1396             sal_Int32 nPageHeightMin = aPageSizeMin.Height();
1397 
1398             if ( nNewPageWidth < nPageWidthMin )
1399                 nNewPageWidth = nPageWidthMin;
1400 
1401             if ( nNewPageHeight < nPageHeightMin )
1402                 nNewPageHeight = nPageHeightMin;
1403 
1404             if ( pDlgEdPage )
1405             {
1406                 Size aPageSize = pDlgEdPage->GetSize();
1407                 if ( nNewPageWidth != aPageSize.Width() || nNewPageHeight != aPageSize.Height() )
1408                 {
1409                     Size aNewPageSize( nNewPageWidth, nNewPageHeight );
1410                     pDlgEdPage->SetSize( aNewPageSize );
1411                     DBG_ASSERT( pDlgEdView, "DlgEditor::AdjustPageSize: no view!" );
1412                     if ( pDlgEdView )
1413                         pDlgEdView->SetWorkArea( Rectangle( Point( 0, 0 ), aNewPageSize ) );
1414                     bAdjustedPageSize = true;
1415                 }
1416             }
1417         }
1418     }
1419 
1420     return bAdjustedPageSize;
1421 }
1422 
1423 //----------------------------------------------------------------------------
1424