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 #include "precompiled_rptui.hxx"
24 #include "ReportSection.hxx"
25 #include "ReportWindow.hxx"
26 #include "DesignView.hxx"
27 #include "uistrings.hrc"
28 #include "RptObject.hxx"
29 #include "RptModel.hxx"
30 #include "SectionView.hxx"
31 #include "RptPage.hxx"
32 #include "ReportController.hxx"
33 #include "UITools.hxx"
34 #include "ViewsWindow.hxx"
35 
36 #include <svx/svdpagv.hxx>
37 #include <editeng/eeitemid.hxx>
38 #include <editeng/adjitem.hxx>
39 #include <svx/sdrpaintwindow.hxx>
40 #include <svx/unoshape.hxx>
41 #include <svx/gallery.hxx>
42 #include <svx/svxids.hrc>
43 #include <svx/svditer.hxx>
44 #include <svx/dbaexchange.hxx>
45 
46 #include <vcl/svapp.hxx>
47 
48 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
49 #include <toolkit/helper/convert.hxx>
50 #include "RptDef.hxx"
51 #include "SectionWindow.hxx"
52 #include "helpids.hrc"
53 #include "RptResId.hrc"
54 #include "dlgedclip.hxx"
55 #include "UndoActions.hxx"
56 #include "rptui_slotid.hrc"
57 
58 #include <connectivity/dbtools.hxx>
59 
60 #include <vcl/lineinfo.hxx>
61 #include "ColorChanger.hxx"
62 
63 #include <svl/itempool.hxx>
64 #include <svtools/extcolorcfg.hxx>
65 #include <unotools/confignode.hxx>
66 #include <framework/imageproducer.hxx>
67 
68 // =============================================================================
69 namespace rptui
70 {
71 // =============================================================================
72 using namespace ::com::sun::star;
73 // -----------------------------------------------------------------------------
74 
lcl_getOverlappedControlColor()75 sal_Int32 lcl_getOverlappedControlColor(/*const uno::Reference <lang::XMultiServiceFactory> _rxFactory*/)
76 {
77 	svtools::ExtendedColorConfig aConfig;
78     sal_Int32 nColor = aConfig.GetColorValue(CFG_REPORTDESIGNER, DBOVERLAPPEDCONTROL).getColor();
79     return nColor;
80 }
81 //------------------------------------------------------------------------------
DBG_NAME(rpt_OReportSection)82 DBG_NAME( rpt_OReportSection )
83 OReportSection::OReportSection(OSectionWindow* _pParent,const uno::Reference< report::XSection >& _xSection)
84 : Window(_pParent,WB_DIALOGCONTROL)
85 , ::comphelper::OPropertyChangeListener(m_aMutex)
86 , DropTargetHelper(this)
87 ,m_pPage(NULL)
88 ,m_pView(NULL)
89 ,m_pParent(_pParent)
90 ,m_pFunc(NULL)
91 ,m_pMulti(NULL)
92 ,m_pReportListener(NULL)
93 ,m_xSection(_xSection)
94 ,m_nPaintEntranceCount(0)
95 ,m_eMode(RPTUI_SELECT)
96 ,m_bDialogModelChanged(sal_False)
97 ,m_bInDrag(sal_False)
98 {
99 	DBG_CTOR( rpt_OReportSection,NULL);
100     //EnableChildTransparentMode();
101 	SetHelpId(HID_REPORTSECTION);
102 	SetMapMode( MapMode( MAP_100TH_MM ) );
103     SetParentClipMode( PARENTCLIPMODE_CLIP );
104     EnableChildTransparentMode( sal_False );
105     SetPaintTransparent( sal_False );
106 
107 	try
108 	{
109 		fill();
110 	}
111 	catch(uno::Exception&)
112 	{
113 		OSL_ENSURE(0,"Exception catched!");
114 	}
115 
116     m_pFunc.reset(new DlgEdFuncSelect( this ));
117     m_pFunc->setOverlappedControlColor(lcl_getOverlappedControlColor( /* m_pParent->getViewsWindow()->getView()->getReportView()->getController().getORB() */ ) );
118 }
119 //------------------------------------------------------------------------------
~OReportSection()120 OReportSection::~OReportSection()
121 {
122 	DBG_DTOR( rpt_OReportSection,NULL);
123     m_pPage = NULL;
124 	//m_pModel->GetUndoEnv().RemoveSection(m_xSection.get());
125 	if ( m_pMulti.is() )
126     	m_pMulti->dispose();
127 
128 	if ( m_pReportListener.is() )
129 		m_pReportListener->dispose();
130 	m_pFunc = ::std::auto_ptr<DlgEdFunc>();
131 
132 	{
133 		::std::auto_ptr<OSectionView> aTemp( m_pView);
134 		if ( m_pView )
135 			m_pView->EndListening( *m_pModel );
136 		m_pView = NULL;
137 	}
138     /*m_pModel->DeletePage(m_pPage->GetPageNum());*/
139 }
140 //------------------------------------------------------------------------------
Paint(const Rectangle & rRect)141 void OReportSection::Paint( const Rectangle& rRect )
142 {
143     Window::Paint(rRect);
144 
145 	if ( m_pView && m_nPaintEntranceCount == 0)
146 	{
147         ++m_nPaintEntranceCount;
148          // repaint, get PageView and prepare Region
149         SdrPageView* pPgView = m_pView->GetSdrPageView();
150         const Region aPaintRectRegion(rRect);
151 
152         // #i74769#
153         SdrPaintWindow* pTargetPaintWindow = 0;
154 
155         // mark repaint start
156         if(pPgView)
157         {
158             pTargetPaintWindow = pPgView->GetView().BeginDrawLayers(this, aPaintRectRegion);
159             OSL_ENSURE(pTargetPaintWindow, "BeginDrawLayers: Got no SdrPaintWindow (!)");
160             // draw background self using wallpaper
161             OutputDevice& rTargetOutDev = pTargetPaintWindow->GetTargetOutputDevice();
162             rTargetOutDev.DrawWallpaper(rRect, Wallpaper(pPgView->GetApplicationDocumentColor()));
163         }
164 
165         // do paint (unbuffered) and mark repaint end
166         if(pPgView)
167         {
168             pPgView->DrawLayer(0, this);
169             pPgView->GetView().EndDrawLayers(*pTargetPaintWindow, true);
170         }
171 
172 		m_pView->CompleteRedraw(this,aPaintRectRegion);
173         --m_nPaintEntranceCount;
174 	}
175 }
176 //------------------------------------------------------------------------------
Resize()177 void OReportSection::Resize()
178 {
179 	Window::Resize();
180 }
181 //------------------------------------------------------------------------------
fill()182 void OReportSection::fill()
183 {
184 	if ( !m_xSection.is() )
185 		return;
186 
187 	m_pMulti = new comphelper::OPropertyChangeMultiplexer(this,m_xSection.get());
188 	m_pMulti->addProperty(PROPERTY_BACKCOLOR);
189 
190 	m_pReportListener = addStyleListener(m_xSection->getReportDefinition(),this);
191 
192     m_pModel = m_pParent->getViewsWindow()->getView()->getReportView()->getController().getSdrModel();
193     m_pPage = m_pModel->getPage(m_xSection);
194 
195 	m_pView = new OSectionView( m_pModel.get(), this, m_pParent->getViewsWindow()->getView() );
196 
197     // #i93597# tell SdrPage that only left and right page border is defined
198     // instead of the full rectangle definition
199     m_pPage->setPageBorderOnlyLeftRight(true);
200 
201     // without the following call, no grid is painted
202 	m_pView->ShowSdrPage( m_pPage );
203 
204 	m_pView->SetMoveSnapOnlyTopLeft( sal_True );
205 	ODesignView* pDesignView = m_pParent->getViewsWindow()->getView()->getReportView();
206 
207     // #i93595# Adapted grid to a more coarse grid and subdivisions for better visualisation. This
208     // is only for visualisation and has nothing to do with the actual snap
209     const Size aGridSizeCoarse(pDesignView->getGridSizeCoarse());
210     const Size aGridSizeFine(pDesignView->getGridSizeFine());
211     m_pView->SetGridCoarse(aGridSizeCoarse);
212     m_pView->SetGridFine(aGridSizeFine);
213 
214     // #i93595# set snap grid width to snap to all existing subdivisions
215     const Fraction aX(aGridSizeFine.A());
216     const Fraction aY(aGridSizeFine.B());
217     m_pView->SetSnapGridWidth(aX, aY);
218 
219 	m_pView->SetGridSnap( pDesignView->isGridSnap() );
220 	m_pView->SetGridFront( sal_False );
221 	m_pView->SetDragStripes( sal_True );
222 	m_pView->SetPageVisible();
223     sal_Int32 nColor = m_xSection->getBackColor();
224     if ( nColor == (sal_Int32)COL_TRANSPARENT )
225         nColor = getStyleProperty<sal_Int32>(m_xSection->getReportDefinition(),PROPERTY_BACKCOLOR);
226 	m_pView->SetApplicationDocumentColor(nColor);
227 
228     uno::Reference<report::XReportDefinition> xReportDefinition = m_xSection->getReportDefinition();
229     const sal_Int32 nLeftMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN);
230 	const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN);
231 	m_pPage->SetLftBorder(nLeftMargin);
232 	m_pPage->SetRgtBorder(nRightMargin);
233 
234 // LLA: TODO
235 //  m_pPage->SetUppBorder(-10000);
236 
237 	m_pView->SetDesignMode( sal_True );
238 
239 	m_pView->StartListening( *m_pModel  );
240 	/*Resize();*/
241 	m_pPage->SetSize( Size( getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width,5*m_xSection->getHeight()) );
242 	const Size aPageSize = m_pPage->GetSize();
243 	m_pView->SetWorkArea( Rectangle( Point( nLeftMargin, 0), Size(aPageSize.Width() - nLeftMargin - nRightMargin,aPageSize.Height()) ) );
244 
245     //SetBackground( Wallpaper( COL_BLUE ));
246 }
247 // -----------------------------------------------------------------------------
Paste(const uno::Sequence<beans::NamedValue> & _aAllreadyCopiedObjects,bool _bForce)248 void OReportSection::Paste(const uno::Sequence< beans::NamedValue >& _aAllreadyCopiedObjects,bool _bForce)
249 {
250     OSL_ENSURE(m_xSection.is(),"Why is the section here NULL!");
251     if ( m_xSection.is() && _aAllreadyCopiedObjects.getLength() )
252     {
253 	    // stop all drawing actions
254 	    m_pView->BrkAction();
255 
256 	    // unmark all objects
257 	    m_pView->UnmarkAll();
258         const ::rtl::OUString sSectionName = m_xSection->getName();
259         const sal_Int32 nLength = _aAllreadyCopiedObjects.getLength();
260         const beans::NamedValue* pIter = _aAllreadyCopiedObjects.getConstArray();
261         const beans::NamedValue* pEnd  = pIter + nLength;
262         for(;pIter != pEnd;++pIter)
263         {
264             if ( _bForce || pIter->Name == sSectionName)
265             {
266                 try
267                 {
268                     uno::Sequence< uno::Reference<report::XReportComponent> > aCopies;
269                     pIter->Value >>= aCopies;
270                     const uno::Reference<report::XReportComponent>* pCopiesIter = aCopies.getConstArray();
271                     const uno::Reference<report::XReportComponent>* pCopiesEnd = pCopiesIter + aCopies.getLength();
272                     for (;pCopiesIter != pCopiesEnd ; ++pCopiesIter)
273                     {
274 						SvxShape* pShape = SvxShape::getImplementation( *pCopiesIter );
275                         SdrObject* pObject = pShape ? pShape->GetSdrObject() : NULL;
276 						if ( pObject )
277 						{
278                             SdrObject* pNeuObj = pObject->Clone();
279 
280                             pNeuObj->SetPage( m_pPage );
281 							pNeuObj->SetModel( m_pModel.get() );
282 			                SdrInsertReason aReason(SDRREASON_VIEWCALL);
283 			                m_pPage->InsertObject(pNeuObj,CONTAINER_APPEND,&aReason);
284 
285 							Rectangle aRet(VCLPoint((*pCopiesIter)->getPosition()),VCLSize((*pCopiesIter)->getSize()));
286 							aRet.setHeight(aRet.getHeight() + 1);
287 							aRet.setWidth(aRet.getWidth() + 1);
288 							bool bOverlapping = true;
289 							while ( bOverlapping )
290 							{
291 								bOverlapping = isOver(aRet,*m_pPage,*m_pView,true,pNeuObj) != NULL;
292 								if ( bOverlapping )
293 								{
294 									aRet.Move(0,aRet.getHeight()+1);
295                                     pNeuObj->SetLogicRect(aRet);
296 									//(*pCopiesIter)->setPositionY(aRet.Top());
297 								}
298 							}
299 							m_pView->AddUndo( m_pView->GetModel()->GetSdrUndoFactory().CreateUndoNewObject( *pNeuObj ) );
300 							m_pView->MarkObj( pNeuObj, m_pView->GetSdrPageView() );
301                             if ( m_xSection.is() && (static_cast<sal_uInt32>(aRet.getHeight() + aRet.Top()) > m_xSection->getHeight()) )
302 			                    m_xSection->setHeight(aRet.getHeight() + aRet.Top());
303 						}
304                     }
305                 }
306                 catch(uno::Exception&)
307                 {
308                     OSL_ENSURE(0,"Exception caught while pasting a new object!");
309                 }
310                 if ( !_bForce )
311                     break;
312             }
313         }
314     }
315 }
316 //----------------------------------------------------------------------------
Delete()317 void OReportSection::Delete()
318 {
319 	if( !m_pView->AreObjectsMarked() )
320 		return;
321 
322 	m_pView->BrkAction();
323 	m_pView->DeleteMarked();
324 }
325 //----------------------------------------------------------------------------
SetMode(DlgEdMode eNewMode)326 void OReportSection::SetMode( DlgEdMode eNewMode )
327 {
328 	if ( eNewMode != m_eMode )
329 	{
330 		if ( eNewMode == RPTUI_INSERT )
331 		{
332 			m_pFunc.reset(new DlgEdFuncInsert( this ));
333 		}
334 		else
335 		{
336 			m_pFunc.reset(new DlgEdFuncSelect( this ));
337 		}
338         m_pFunc->setOverlappedControlColor(lcl_getOverlappedControlColor( ) );
339         m_pModel->SetReadOnly(eNewMode == RPTUI_READONLY);
340         m_eMode = eNewMode;
341 	}
342 }
343 // -----------------------------------------------------------------------------
Copy(uno::Sequence<beans::NamedValue> & _rAllreadyCopiedObjects)344 void OReportSection::Copy(uno::Sequence< beans::NamedValue >& _rAllreadyCopiedObjects)
345 {
346     Copy(_rAllreadyCopiedObjects,false);
347 }
348 //----------------------------------------------------------------------------
Copy(uno::Sequence<beans::NamedValue> & _rAllreadyCopiedObjects,bool _bEraseAnddNoClone)349 void OReportSection::Copy(uno::Sequence< beans::NamedValue >& _rAllreadyCopiedObjects,bool _bEraseAnddNoClone)
350 {
351     OSL_ENSURE(m_xSection.is(),"Why is the section here NULL!");
352 	if( !m_pView->AreObjectsMarked() || !m_xSection.is() )
353 		return;
354 
355 	// stop all drawing actions
356 	//m_pView->BrkAction();
357 
358 	// insert control models of marked objects into clipboard dialog model
359     const SdrMarkList& rMarkedList = m_pView->GetMarkedObjectList();
360 	const sal_uLong nMark = rMarkedList.GetMarkCount();
361 
362     ::std::vector< uno::Reference<report::XReportComponent> > aCopies;
363     aCopies.reserve(nMark);
364 
365     SdrUndoFactory& rUndo = m_pView->GetModel()->GetSdrUndoFactory();
366 
367 	for( sal_uLong i = nMark; i > 0; )
368 	{
369         --i;
370         SdrObject* pSdrObject = rMarkedList.GetMark(i)->GetMarkedSdrObj();
371         OObjectBase* pObj = dynamic_cast<OObjectBase*>(pSdrObject);
372 		if ( pObj  )
373 		{
374             try
375             {
376                 SdrObject* pNeuObj = pSdrObject->Clone();
377                 aCopies.push_back(uno::Reference<report::XReportComponent>(pNeuObj->getUnoShape(),uno::UNO_QUERY));
378                 if ( _bEraseAnddNoClone )
379                 {
380                     m_pView->AddUndo( rUndo.CreateUndoDeleteObject( *pSdrObject ) );
381                     m_pPage->RemoveObject(pSdrObject->GetOrdNum());
382                 }
383 
384             }
385             catch(uno::Exception&)
386             {
387                 OSL_ENSURE(0,"Can't copy report elements!");
388             }
389 		}
390 	} // for( sal_uLong i = 0; i < nMark; i++ )
391 
392     if ( !aCopies.empty() )
393     {
394         ::std::reverse(aCopies.begin(),aCopies.end());
395         const sal_Int32 nLength = _rAllreadyCopiedObjects.getLength();
396         _rAllreadyCopiedObjects.realloc( nLength + 1);
397         beans::NamedValue* pNewValue = _rAllreadyCopiedObjects.getArray() + nLength;
398         pNewValue->Name = m_xSection->getName();
399         pNewValue->Value <<= uno::Sequence< uno::Reference<report::XReportComponent> >(&(*aCopies.begin()),aCopies.size());
400     }
401 }
402 //----------------------------------------------------------------------------
MouseButtonDown(const MouseEvent & rMEvt)403 void OReportSection::MouseButtonDown( const MouseEvent& rMEvt )
404 {
405     m_pParent->getViewsWindow()->getView()->setMarked(m_pView,sal_True); // mark the section in which is clicked
406 	m_pFunc->MouseButtonDown( rMEvt );
407     Window::MouseButtonDown(rMEvt);
408 }
409 //----------------------------------------------------------------------------
MouseButtonUp(const MouseEvent & rMEvt)410 void OReportSection::MouseButtonUp( const MouseEvent& rMEvt )
411 {
412 	if ( !m_pFunc->MouseButtonUp( rMEvt ) )
413         m_pParent->getViewsWindow()->getView()->getReportView()->getController().executeUnChecked(SID_OBJECT_SELECT,uno::Sequence< beans::PropertyValue>());
414 }
415 
416 //----------------------------------------------------------------------------
417 
MouseMove(const MouseEvent & rMEvt)418 void OReportSection::MouseMove( const MouseEvent& rMEvt )
419 {
420 	m_pFunc->MouseMove( rMEvt );
421 
422 }
423 //----------------------------------------------------------------------------
SetGridVisible(sal_Bool _bVisible)424 void OReportSection::SetGridVisible(sal_Bool _bVisible)
425 {
426 	m_pView->SetGridVisible( _bVisible );
427 }
428 //------------------------------------------------------------------------------
SelectAll(const sal_uInt16 _nObjectType)429 void OReportSection::SelectAll(const sal_uInt16 _nObjectType)
430 {
431 	if ( m_pView )
432     {
433         if ( _nObjectType == OBJ_NONE )
434             m_pView->MarkAllObj();
435         else
436         {
437             m_pView->UnmarkAll();
438             SdrObjListIter aIter(*m_pPage,IM_DEEPNOGROUPS);
439             SdrObject* pObjIter = NULL;
440             while( (pObjIter = aIter.Next()) != NULL )
441             {
442                 if ( pObjIter->GetObjIdentifier() == _nObjectType )
443                     m_pView->MarkObj( pObjIter, m_pView->GetSdrPageView() );
444             }
445         }
446     }
447 }
lcl_insertMenuItemImages(PopupMenu & rContextMenu,OReportController & rController,const uno::Reference<report::XReportDefinition> & _xReportDefinition,uno::Reference<frame::XFrame> & _rFrame,sal_Bool _bHiContrast)448 void lcl_insertMenuItemImages(PopupMenu& rContextMenu,OReportController& rController,const uno::Reference< report::XReportDefinition>& _xReportDefinition,uno::Reference<frame::XFrame>& _rFrame,sal_Bool _bHiContrast)
449 {
450     const sal_uInt16 nCount = rContextMenu.GetItemCount();
451 	for (sal_uInt16 i = 0; i < nCount; ++i)
452 	{
453 		if ( MENUITEM_SEPARATOR != rContextMenu.GetItemType(i))
454 		{
455 			const sal_uInt16 nId = rContextMenu.GetItemId(i);
456             PopupMenu* pPopupMenu = rContextMenu.GetPopupMenu( nId );
457             if ( pPopupMenu )
458             {
459                 lcl_insertMenuItemImages(*pPopupMenu,rController,_xReportDefinition,_rFrame,_bHiContrast);
460             }
461             else
462             {
463                 const ::rtl::OUString sCommand = rContextMenu.GetItemCommand(nId);
464                 rContextMenu.SetItemImage(nId,framework::GetImageFromURL(_rFrame,sCommand,sal_False,_bHiContrast));
465                 if ( nId == SID_PAGEHEADERFOOTER )
466                 {
467                     String sText = String(ModuleRes((_xReportDefinition.is() && _xReportDefinition->getPageHeaderOn()) ? RID_STR_PAGEHEADERFOOTER_DELETE : RID_STR_PAGEHEADERFOOTER_INSERT));
468                     rContextMenu.SetItemText(nId,sText);
469                 }
470                 else if ( nId == SID_REPORTHEADERFOOTER )
471                 {
472                     String sText = String(ModuleRes((_xReportDefinition.is() && _xReportDefinition->getReportHeaderOn()) ? RID_STR_REPORTHEADERFOOTER_DELETE : RID_STR_REPORTHEADERFOOTER_INSERT));
473                     rContextMenu.SetItemText(nId,sText);
474                 }
475             }
476 			rContextMenu.CheckItem(nId,rController.isCommandChecked(nId));
477 			rContextMenu.EnableItem(nId,rController.isCommandEnabled(nId));
478 		}
479 	} // for (sal_uInt16 i = 0; i < nCount; ++i)
480 }
481 //----------------------------------------------------------------------------
Command(const CommandEvent & _rCEvt)482 void OReportSection::Command( const CommandEvent& _rCEvt )
483 {
484     Window::Command(_rCEvt);
485 	switch (_rCEvt.GetCommand())
486 	{
487 		case COMMAND_CONTEXTMENU:
488 		{
489             const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
490             sal_Bool bHiContrast = rSettings.GetHighContrastMode();
491             OReportController& rController = m_pParent->getViewsWindow()->getView()->getReportView()->getController();
492             uno::Reference<frame::XFrame> xFrame = rController.getFrame();
493             PopupMenu aContextMenu( ModuleRes( RID_MENU_REPORT ) );
494             uno::Reference< report::XReportDefinition> xReportDefinition = getSection()->getReportDefinition();
495 
496             lcl_insertMenuItemImages(aContextMenu,rController,xReportDefinition,xFrame,bHiContrast);
497 
498 			Point aPos = _rCEvt.GetMousePosPixel();
499 			m_pView->EndAction();
500 			const sal_uInt16 nId = aContextMenu.Execute(this, aPos);
501 			if ( nId )
502 			{
503                 uno::Sequence< beans::PropertyValue> aArgs;
504                 if ( nId == SID_ATTR_CHAR_COLOR_BACKGROUND )
505                 {
506                     aArgs.realloc(1);
507                     aArgs[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Selection"));
508                     aArgs[0].Value <<= m_xSection;
509                 }
510 				rController.executeChecked(nId,aArgs);
511 			}
512 		}
513 		break;
514 	}
515 }
516 // -----------------------------------------------------------------------------
_propertyChanged(const beans::PropertyChangeEvent & _rEvent)517 void OReportSection::_propertyChanged(const beans::PropertyChangeEvent& _rEvent) throw( uno::RuntimeException)
518 {
519 	if ( m_xSection.is() )
520 	{
521 		if ( _rEvent.Source == m_xSection || PROPERTY_BACKCOLOR == _rEvent.PropertyName )
522 		{
523             sal_Int32 nColor = m_xSection->getBackColor();
524             if ( nColor == (sal_Int32)COL_TRANSPARENT )
525                 nColor = getStyleProperty<sal_Int32>(m_xSection->getReportDefinition(),PROPERTY_BACKCOLOR);
526 			m_pView->SetApplicationDocumentColor(nColor);
527 			Invalidate(INVALIDATE_NOCHILDREN|INVALIDATE_NOERASE);
528 		}
529 		else
530 		{
531             uno::Reference<report::XReportDefinition> xReportDefinition = m_xSection->getReportDefinition();
532             const sal_Int32 nLeftMargin  = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_LEFTMARGIN);
533             const sal_Int32 nRightMargin = getStyleProperty<sal_Int32>(xReportDefinition,PROPERTY_RIGHTMARGIN);
534             const sal_Int32 nPaperWidth  = getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width;
535 
536             if ( _rEvent.PropertyName == PROPERTY_LEFTMARGIN )
537             {
538 	            m_pPage->SetLftBorder(nLeftMargin);
539             }
540             else if ( _rEvent.PropertyName == PROPERTY_RIGHTMARGIN )
541             {
542 	            m_pPage->SetRgtBorder(nRightMargin);
543             }
544             const Size aOldPageSize = m_pPage->GetSize();
545             sal_Int32 nNewHeight = 5*m_xSection->getHeight();
546             if ( aOldPageSize.Height() != nNewHeight || nPaperWidth != aOldPageSize.Width() )
547             {
548 		        m_pPage->SetSize( Size( nPaperWidth,nNewHeight) );
549 		        const Size aPageSize = m_pPage->GetSize();
550 		        m_pView->SetWorkArea( Rectangle( Point( nLeftMargin, 0), Size(aPageSize.Width() - nLeftMargin - nRightMargin,aPageSize.Height()) ) );
551             }
552             impl_adjustObjectSizePosition(nPaperWidth,nLeftMargin,nRightMargin);
553             m_pParent->Invalidate(INVALIDATE_UPDATE | INVALIDATE_TRANSPARENT);
554 		}
555 	}
556 }
impl_adjustObjectSizePosition(sal_Int32 i_nPaperWidth,sal_Int32 i_nLeftMargin,sal_Int32 i_nRightMargin)557 void OReportSection::impl_adjustObjectSizePosition(sal_Int32 i_nPaperWidth,sal_Int32 i_nLeftMargin,sal_Int32 i_nRightMargin)
558 {
559     try
560     {
561 	    sal_Int32 nRightBorder = i_nPaperWidth - i_nRightMargin;
562         const sal_Int32 nCount = m_xSection->getCount();
563         for (sal_Int32 i = 0; i < nCount; ++i)
564         {
565             bool bChanged = false;
566             uno::Reference< report::XReportComponent> xReportComponent(m_xSection->getByIndex(i),uno::UNO_QUERY_THROW);
567             awt::Point aPos = xReportComponent->getPosition();
568             awt::Size aSize = xReportComponent->getSize();
569             SvxShape* pShape = SvxShape::getImplementation( xReportComponent );
570             SdrObject* pObject = pShape ? pShape->GetSdrObject() : NULL;
571             if ( pObject )
572             {
573                 OObjectBase* pBase = dynamic_cast<OObjectBase*>(pObject);
574                 pBase->EndListening(sal_False);
575                 if ( aPos.X < i_nLeftMargin )
576                 {
577                     aPos.X  = i_nLeftMargin;
578                     bChanged = true;
579                 }
580                 if ( (aPos.X + aSize.Width) > nRightBorder )
581                 {
582                     aPos.X = nRightBorder - aSize.Width;
583                     if ( aPos.X < i_nLeftMargin )
584                     {
585                         aSize.Width += aPos.X - i_nLeftMargin;
586                         aPos.X = i_nLeftMargin;
587                         // add listener around
588                         pBase->StartListening();
589                         xReportComponent->setSize(aSize);
590                         pBase->EndListening(sal_False);
591                     }
592                     bChanged = true;
593                 }
594                 if ( aPos.Y < 0 )
595                     aPos.Y = 0;
596                 if ( bChanged )
597                 {
598                     xReportComponent->setPosition(aPos);
599                     correctOverlapping(pObject,*this,false);
600                     Rectangle aRet(VCLPoint(xReportComponent->getPosition()),VCLSize(xReportComponent->getSize()));
601 					aRet.setHeight(aRet.getHeight() + 1);
602 					aRet.setWidth(aRet.getWidth() + 1);
603                     if ( m_xSection.is() && (static_cast<sal_uInt32>(aRet.getHeight() + aRet.Top()) > m_xSection->getHeight()) )
604 			            m_xSection->setHeight(aRet.getHeight() + aRet.Top());
605 
606                     pObject->RecalcBoundRect();
607                 }
608                 pBase->StartListening();
609             }
610         } // for (sal_Int32 i = 0; i < nCount; ++i)
611     }
612     catch(uno::Exception)
613     {
614         OSL_ENSURE(0,"Exception caught: OReportSection::_propertyChanged(");
615     }
616 }
617 //------------------------------------------------------------------------------
handleKeyEvent(const KeyEvent & _rEvent)618 sal_Bool OReportSection::handleKeyEvent(const KeyEvent& _rEvent)
619 {
620 	return m_pFunc.get() ? m_pFunc->handleKeyEvent(_rEvent) : sal_False;
621 }
622 // -----------------------------------------------------------------------------
deactivateOle()623 void OReportSection::deactivateOle()
624 {
625     if ( m_pFunc.get() )
626 		m_pFunc->deactivateOle(true);
627 }
628 // -----------------------------------------------------------------------------
createDefault(const::rtl::OUString & _sType)629 void OReportSection::createDefault(const ::rtl::OUString& _sType)
630 {
631     SdrObject* pObj = m_pView->GetCreateObj();//rMarkList.GetMark(0)->GetObj();
632     if ( !pObj )
633         return;
634     createDefault(_sType,pObj);
635 }
636 // -----------------------------------------------------------------------------
createDefault(const::rtl::OUString & _sType,SdrObject * _pObj)637 void OReportSection::createDefault(const ::rtl::OUString& _sType,SdrObject* _pObj)
638 {
639     sal_Bool bAttributesAppliedFromGallery = sal_False;
640 
641 	if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) )
642 	{
643 		std::vector< rtl::OUString > aObjList;
644 		if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) )
645 		{
646             std::vector< rtl::OUString >::iterator aIter = aObjList.begin();
647             std::vector< rtl::OUString >::iterator aEnd = aObjList.end();
648 			for (sal_uInt32 i=0 ; aIter != aEnd; ++aIter,++i)
649 			{
650 				if ( aIter->equalsIgnoreAsciiCase( _sType ) )
651 				{
652 					OReportModel aReportModel(NULL);
653 					SfxItemPool& rPool = aReportModel.GetItemPool();
654 					rPool.FreezeIdRanges();
655 					if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aReportModel ) )
656 					{
657 						const SdrObject* pSourceObj = aReportModel.GetPage( 0 )->GetObj( 0 );
658 						if( pSourceObj )
659 						{
660 							const SfxItemSet& rSource = pSourceObj->GetMergedItemSet();
661 							SfxItemSet aDest( _pObj->GetModel()->GetItemPool(), 				// ranges from SdrAttrObj
662 							SDRATTR_START, SDRATTR_SHADOW_LAST,
663 							SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
664 							SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION,
665 							// Graphic Attributes
666 							SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST,
667 							// 3d Properties
668 							SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
669 							// CustomShape properties
670 							SDRATTR_CUSTOMSHAPE_FIRST, SDRATTR_CUSTOMSHAPE_LAST,
671 							// range from SdrTextObj
672 							EE_ITEMS_START, EE_ITEMS_END,
673 							// end
674 							0, 0);
675 							aDest.Set( rSource );
676 							_pObj->SetMergedItemSet( aDest );
677 							sal_Int32 nAngle = pSourceObj->GetRotateAngle();
678 							if ( nAngle )
679 							{
680 								double a = nAngle * F_PI18000;
681 								_pObj->NbcRotate( _pObj->GetSnapRect().Center(), nAngle, sin( a ), cos( a ) );
682 							}
683 							bAttributesAppliedFromGallery = sal_True;
684 						}
685 					}
686 					break;
687 				}
688 			}
689 		}
690 	}
691 	if ( !bAttributesAppliedFromGallery )
692 	{
693 		_pObj->SetMergedItem( SvxAdjustItem( SVX_ADJUST_CENTER ,ITEMID_ADJUST) );
694 		_pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
695 		_pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
696 		_pObj->SetMergedItem( SdrTextAutoGrowHeightItem( sal_False ) );
697 		((SdrObjCustomShape*)_pObj)->MergeDefaultAttributes( &_sType );
698 	}
699 }
700 // -----------------------------------------------------------------------------
getCurrentControlModel() const701 uno::Reference< report::XReportComponent > OReportSection::getCurrentControlModel() const
702 {
703 	uno::Reference< report::XReportComponent > xModel;
704 	if ( m_pView )
705 	{
706 		const SdrMarkList& rMarkList = m_pView->GetMarkedObjectList();
707         sal_uInt32 nMarkCount = rMarkList.GetMarkCount();
708 
709         if ( nMarkCount == 1 )
710         {
711 			SdrObject* pDlgEdObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
712 			OObjectBase* pObj = dynamic_cast<OObjectBase*>(pDlgEdObj);
713 			if ( pObj )
714 				xModel = pObj->getReportComponent().get();
715 		}
716 	}
717 	return xModel;
718 }
719 // -----------------------------------------------------------------------------
fillControlModelSelection(::std::vector<uno::Reference<uno::XInterface>> & _rSelection) const720 void OReportSection::fillControlModelSelection(::std::vector< uno::Reference< uno::XInterface > >& _rSelection) const
721 {
722     if ( m_pView )
723 	{
724 		const SdrMarkList& rMarkList = m_pView->GetMarkedObjectList();
725         const sal_uInt32 nMarkCount = rMarkList.GetMarkCount();
726 
727         for (sal_uInt32 i=0; i < nMarkCount; ++i)
728         {
729 			const SdrObject* pDlgEdObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
730 			const OObjectBase* pObj = dynamic_cast<const OObjectBase*>(pDlgEdObj);
731 			if ( pObj )
732                 _rSelection.push_back(pObj->getReportComponent());
733 		}
734 	}
735 }
736 // -----------------------------------------------------------------------------
AcceptDrop(const AcceptDropEvent & _rEvt)737 sal_Int8 OReportSection::AcceptDrop( const AcceptDropEvent& _rEvt )
738 {
739     OSL_TRACE("AcceptDrop::DropEvent.Action %i\n", _rEvt.mnAction);
740 
741     ::Point aDropPos(_rEvt.maPosPixel);
742     const MouseEvent aMouseEvt(aDropPos);
743     if ( m_pFunc->isOverlapping(aMouseEvt) )
744         return DND_ACTION_NONE;
745 
746     if ( _rEvt.mnAction == DND_ACTION_COPY ||
747          _rEvt.mnAction == DND_ACTION_LINK
748          )
749     {
750 		if (!m_pParent) return DND_ACTION_NONE;
751 		sal_uInt16 nCurrentPosition = 0;
752 		nCurrentPosition = m_pParent->getViewsWindow()->getPosition(m_pParent);
753 		if (_rEvt.mnAction == DND_ACTION_COPY )
754 		{
755 			// we must assure, we can't drop in the top section
756 			if (nCurrentPosition < 1)
757 			{
758 				return DND_ACTION_NONE;
759 			}
760 			return DND_ACTION_LINK;
761 		}
762 		if (_rEvt.mnAction == DND_ACTION_LINK)
763 		{
764 			// we must assure, we can't drop in the bottom section
765 			if (m_pParent->getViewsWindow()->getSectionCount() > (nCurrentPosition + 1)  )
766 			{
767 				return DND_ACTION_COPY;
768 			}
769 			return DND_ACTION_NONE;
770 		}
771     }
772     else
773     {
774         const DataFlavorExVector& rFlavors = GetDataFlavorExVector();
775         if (   ::svx::OMultiColumnTransferable::canExtractDescriptor(rFlavors)
776             || ::svx::OColumnTransferable::canExtractColumnDescriptor(rFlavors, CTF_FIELD_DESCRIPTOR | CTF_CONTROL_EXCHANGE | CTF_COLUMN_DESCRIPTOR) )
777             return _rEvt.mnAction;
778 
779         const sal_Int8 nDropOption = ( OReportExchange::canExtract(rFlavors) ) ? DND_ACTION_COPYMOVE : DND_ACTION_NONE;
780 
781         return nDropOption;
782     }
783     return DND_ACTION_NONE;
784 }
785 
786 // -----------------------------------------------------------------------------
ExecuteDrop(const ExecuteDropEvent & _rEvt)787 sal_Int8 OReportSection::ExecuteDrop( const ExecuteDropEvent& _rEvt )
788 {
789     OSL_TRACE("ExecuteDrop::DropEvent.Action %i\n", _rEvt.mnAction);
790     ::Point aDropPos(PixelToLogic(_rEvt.maPosPixel));
791     const MouseEvent aMouseEvt(aDropPos);
792     if ( m_pFunc->isOverlapping(aMouseEvt) )
793         return DND_ACTION_NONE;
794 
795     sal_Int8 nDropOption = DND_ACTION_NONE;
796     const TransferableDataHelper aDropped(_rEvt.maDropEvent.Transferable);
797     DataFlavorExVector& rFlavors = aDropped.GetDataFlavorExVector();
798     bool bMultipleFormat = ::svx::OMultiColumnTransferable::canExtractDescriptor(rFlavors);
799     if ( OReportExchange::canExtract(rFlavors) )
800     {
801         OReportExchange::TSectionElements aCopies = OReportExchange::extractCopies(aDropped);
802 		Paste(aCopies,true);
803         nDropOption = DND_ACTION_COPYMOVE;
804         m_pParent->getViewsWindow()->BrkAction();
805         m_pParent->getViewsWindow()->unmarkAllObjects(m_pView);
806         //m_pParent->getViewsWindow()->getView()->setMarked(m_pView,sal_True);
807     } // if ( OReportExchange::canExtract(rFlavors) )
808     else if ( bMultipleFormat
809         || ::svx::OColumnTransferable::canExtractColumnDescriptor(rFlavors, CTF_FIELD_DESCRIPTOR | CTF_CONTROL_EXCHANGE | CTF_COLUMN_DESCRIPTOR) )
810     {
811         m_pParent->getViewsWindow()->getView()->setMarked(m_pView,sal_True);
812         m_pView->UnmarkAll();
813         const Rectangle& rRect = m_pView->GetWorkArea();
814         if ( aDropPos.X() < rRect.Left() )
815             aDropPos.X() = rRect.Left();
816         else if ( aDropPos.X() > rRect.Right() )
817             aDropPos.X() = rRect.Right();
818 
819         if ( aDropPos.Y() > rRect.Bottom() )
820             aDropPos.Y() = rRect.Bottom();
821 
822         uno::Sequence<beans::PropertyValue> aValues;
823         if ( !bMultipleFormat )
824         {
825             ::svx::ODataAccessDescriptor aDescriptor = ::svx::OColumnTransferable::extractColumnDescriptor(aDropped);
826 
827             aValues.realloc(1);
828             aValues[0].Value <<= aDescriptor.createPropertyValueSequence();
829         } // if ( !bMultipleFormat )
830         else
831             aValues = ::svx::OMultiColumnTransferable::extractDescriptor(aDropped);
832 
833         beans::PropertyValue* pIter = aValues.getArray();
834         beans::PropertyValue* pEnd  = pIter + aValues.getLength();
835         for(;pIter != pEnd; ++pIter)
836         {
837             uno::Sequence<beans::PropertyValue> aCurrent;
838             pIter->Value >>= aCurrent;
839             sal_Int32 nLength = aCurrent.getLength();
840             if ( nLength )
841             {
842                 aCurrent.realloc(nLength + 3);
843                 aCurrent[nLength].Name = PROPERTY_POSITION;
844                 aCurrent[nLength++].Value <<= AWTPoint(aDropPos);
845                 // give also the DND Action (Shift|Ctrl) Key to really say what we want
846                 aCurrent[nLength].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DNDAction"));
847                 aCurrent[nLength++].Value <<= _rEvt.mnAction;
848 
849                 aCurrent[nLength].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Section"));
850                 aCurrent[nLength++].Value <<= getSection();
851                 pIter->Value <<= aCurrent;
852             }
853         }
854 
855         // we use this way to create undo actions
856         OReportController& rController = m_pParent->getViewsWindow()->getView()->getReportView()->getController();
857 		rController.executeChecked(SID_ADD_CONTROL_PAIR,aValues);
858         nDropOption = DND_ACTION_COPY;
859     }
860 	return nDropOption;
861 }
862 // -----------------------------------------------------------------------------
stopScrollTimer()863 void OReportSection::stopScrollTimer()
864 {
865     m_pFunc->stopScrollTimer();
866 }
867 // -----------------------------------------------------------------------------
isUiActive() const868 bool OReportSection::isUiActive() const
869 {
870     return m_pFunc->isUiActive();
871 }
872 // -----------------------------------------------------------------------------
873 // =============================================================================
874 }
875 // =============================================================================
876