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