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_reportdesign.hxx"
24 
25 #include "DesignView.hxx"
26 #include <tools/debug.hxx>
27 #include "ReportController.hxx"
28 #include <comphelper/types.hxx>
29 #include <unotools/syslocale.hxx>
30 #include <unotools/viewoptions.hxx>
31 #include "RptDef.hxx"
32 #include "UITools.hxx"
33 #include "RptObject.hxx"
34 #include "propbrw.hxx"
35 #include <toolkit/helper/convert.hxx>
36 #include "helpids.hrc"
37 #include "SectionView.hxx"
38 #include "ReportSection.hxx"
39 #include "rptui_slotid.hrc"
40 #include <svx/svxids.hrc>
41 #include "AddField.hxx"
42 #include "ScrollHelper.hxx"
43 #include "Navigator.hxx"
44 #include "SectionWindow.hxx"
45 #include "RptResId.hrc"
46 #include <vcl/svapp.hxx>
47 
48 namespace rptui
49 {
50 using namespace ::dbaui;
51 using namespace ::utl;
52 using namespace ::com::sun::star;
53 using namespace uno;
54 using namespace lang;
55 using namespace beans;
56 using namespace container;
57 
58 #define LINE_SIZE			50
59 #define START_SIZE_TASKPANE 30
60 #define COLSET_ID           1
61 #define REPORT_ID           2
62 #define TASKPANE_ID         3
63 
64 class OTaskWindow : public Window
65 {
66     PropBrw* m_pPropWin;
67 public:
68     OTaskWindow(Window* _pParent) : Window(_pParent),m_pPropWin(NULL){}
69 
70     inline void setPropertyBrowser(PropBrw* _pPropWin)
71     {
72         m_pPropWin = _pPropWin;
73     }
74 
75     virtual void Resize()
76     {
77         const Size aSize = GetOutputSizePixel();
78         if ( m_pPropWin && aSize.Height() && aSize.Width() )
79             m_pPropWin->SetSizePixel(aSize);
80     }
81     long getMinimumWidth() const
82     {
83         long nRet = 0;
84         if ( m_pPropWin )
85             nRet = m_pPropWin->getMinimumSize().Width();
86         return nRet;
87     }
88 };
89 class OwnSplitWindow : public SplitWindow
90 {
91 public:
92     OwnSplitWindow(Window* pParent) : SplitWindow(pParent,WB_DIALOGCONTROL){SetBackground( );}
93 
94     virtual void		Split()
95     {
96         SplitWindow::Split();
97         setItemSizes();
98     }
99     void setItemSizes()
100     {
101         const long nOutWidth = GetOutputSizePixel().Width();
102         long	nTaskPaneMinSplitSize = static_cast<OTaskWindow*>(GetItemWindow(TASKPANE_ID))->getMinimumWidth();
103         nTaskPaneMinSplitSize = static_cast<long>(nTaskPaneMinSplitSize*100/nOutWidth);
104         if ( !nTaskPaneMinSplitSize )
105             nTaskPaneMinSplitSize = START_SIZE_TASKPANE;
106 
107         const long nReportMinSplitSize = static_cast<long>(12000/nOutWidth);
108 
109 	    long nReportSize = GetItemSize( REPORT_ID );
110 	    long nTaskPaneSize = GetItemSize( TASKPANE_ID );
111 
112 	    sal_Bool		bMod = sal_False;
113 	    if( nReportSize < nReportMinSplitSize )
114 	    {
115 		    nReportSize = nReportMinSplitSize;
116 		    nTaskPaneSize = 99 - nReportMinSplitSize;
117 
118 		    bMod = sal_True;
119 	    }
120 	    else if( nTaskPaneSize < nTaskPaneMinSplitSize )
121 	    {
122 		    nTaskPaneSize = nTaskPaneMinSplitSize;
123 		    nReportSize = 99 - nTaskPaneMinSplitSize;
124 
125 		    bMod = sal_True;
126 	    }
127 
128 	    if( bMod )
129 	    {
130 		    SetItemSize( REPORT_ID, nReportSize );
131 		    SetItemSize( TASKPANE_ID, nTaskPaneSize );
132 	    }
133     }
134 };
135 //==================================================================
136 // class ODesignView
137 //==================================================================
138 DBG_NAME( rpt_ODesignView )
139 //------------------------------------------------------------------------------
140 ODesignView::ODesignView(   Window* pParent,
141 							const Reference< XMultiServiceFactory >& _rxOrb,
142 							OReportController& _rController) :
143 	ODataView( pParent, _rController, _rxOrb, WB_DIALOGCONTROL )
144     ,m_aSplitWin(this)
145     ,m_rReportController( _rController )
146     ,m_aScrollWindow(this)
147 	,m_pPropWin(NULL)
148 	,m_pAddField(NULL)
149 	,m_pCurrentView(NULL)
150     ,m_pReportExplorer(NULL)
151 	,m_eMode( RPTUI_SELECT )
152 	,m_nCurrentPosition(USHRT_MAX)
153 	,m_eActObj( OBJ_NONE )
154 	,m_bFirstDraw(sal_False)
155 	,m_aGridSizeCoarse( 1000, 1000 )	// #i93595# 100TH_MM changed to grid using coarse 1 cm grid
156     ,m_aGridSizeFine( 250, 250 )        // and a 0,25 cm subdivision for better visualisation
157 	,m_bGridVisible(sal_True)
158 	,m_bGridSnap(sal_True)
159 	,m_bDeleted( sal_False )
160 {
161 	DBG_CTOR( rpt_ODesignView,NULL);
162 	SetHelpId(UID_RPT_RPT_APP_VIEW);
163 	ImplInitSettings();
164 
165 	SetMapMode( MapMode( MAP_100TH_MM ) );
166 
167 	// now create the task pane on the right side :-)
168 	m_pTaskPane = new OTaskWindow(this);
169 	//m_pTaskPane->Show();
170 
171     m_aSplitWin.InsertItem( COLSET_ID,100,SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE | SWIB_COLSET );
172     m_aSplitWin.InsertItem( REPORT_ID, &m_aScrollWindow, 100/*m_aScrollWindow.getMaxMarkerWidth(sal_False)*/, SPLITWINDOW_APPEND, COLSET_ID, SWIB_PERCENTSIZE  /*SWIB_COLSET*/);
173 	//m_aSplitWin.InsertItem( TASKPANE_ID, m_pTaskPane, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE );
174 
175 	// Splitter einrichten
176 	//m_aSplitter.SetSplitHdl(LINK(this, ODesignView,SplitHdl));
177 	m_aSplitWin.SetSplitHdl(LINK(this, ODesignView,SplitHdl));
178     m_aSplitWin.ShowAutoHideButton();
179     m_aSplitWin.SetAlign(WINDOWALIGN_LEFT);
180     m_aSplitWin.Show();
181 
182 	m_aMarkTimer.SetTimeout( 100 );
183 	m_aMarkTimer.SetTimeoutHdl( LINK( this, ODesignView, MarkTimeout ) );
184 }
185 
186 //------------------------------------------------------------------------------
187 ODesignView::~ODesignView()
188 {
189 	DBG_DTOR( rpt_ODesignView,NULL);
190     m_bDeleted = sal_True;
191     Hide();
192     m_aScrollWindow.Hide();
193 	m_aMarkTimer.Stop();
194     if ( m_pPropWin )
195 	{
196         notifySystemWindow(this,m_pPropWin,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
197 		::std::auto_ptr<Window> aTemp2(m_pPropWin);
198 		m_pPropWin = NULL;
199 	}
200     if ( m_pAddField )
201 	{
202         SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromAscii( UID_RPT_RPT_APP_VIEW ) );
203         aDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( m_pAddField->GetWindowState(WINDOWSTATE_MASK_ALL).GetBuffer() ) );
204         notifySystemWindow(this,m_pAddField,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
205 		::std::auto_ptr<Window> aTemp2(m_pAddField);
206 		m_pAddField = NULL;
207 	}
208     if ( m_pReportExplorer )
209     {
210         SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromInt32( RID_NAVIGATOR ) );
211         aDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( m_pReportExplorer->GetWindowState(WINDOWSTATE_MASK_ALL).GetBuffer() ) );
212         notifySystemWindow(this,m_pReportExplorer,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
213 		::std::auto_ptr<Window> aTemp2(m_pReportExplorer);
214 		m_pReportExplorer = NULL;
215 	}
216 	{
217 		::std::auto_ptr<Window> aTemp2(m_pTaskPane);
218 		m_pTaskPane = NULL;
219 	}
220 }
221 // -----------------------------------------------------------------------------
222 void ODesignView::initialize()
223 {
224 	SetMapMode( MapMode( MAP_100TH_MM ) );
225 	m_aScrollWindow.initialize();
226 	m_aScrollWindow.Show();
227 }
228 //-----------------------------------------------------------------------------
229 void ODesignView::DataChanged( const DataChangedEvent& rDCEvt )
230 {
231 	ODataView::DataChanged( rDCEvt );
232 
233 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
234 		 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
235 	{
236 		ImplInitSettings();
237 		Invalidate();
238 	}
239 }
240 //------------------------------------------------------------------------------
241 long ODesignView::PreNotify( NotifyEvent& rNEvt )
242 {
243     long nRet = ODataView::PreNotify(rNEvt); // 1 := has to be handled here
244 	switch(rNEvt.GetType())
245 	{
246         case EVENT_KEYINPUT:
247             if ( (m_pPropWin && m_pPropWin->HasChildPathFocus()) )
248                 return 0L;
249             if ( (m_pAddField && m_pAddField->HasChildPathFocus()) )
250                 return 0L;
251             if ( (m_pReportExplorer && m_pReportExplorer->HasChildPathFocus()) )
252                 return 0L;
253             {
254                 const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
255                 if ( handleKeyEvent(*pKeyEvent) )
256                     nRet = 1L;
257                 else if ( nRet == 1L && m_pAccel.get() )
258                 {
259                     const KeyCode& rCode = pKeyEvent->GetKeyCode();
260                     util::URL aUrl;
261                     aUrl.Complete = m_pAccel->findCommand(svt::AcceleratorExecute::st_VCLKey2AWTKey(rCode));
262                     if ( !aUrl.Complete.getLength() || !m_rController.isCommandEnabled( aUrl.Complete ) )
263                         nRet = 0L;
264                 }
265             }
266             break;
267         default:
268             break;
269 	}
270 
271 	return nRet;
272 }
273 //------------------------------------------------------------------------------
274 void ODesignView::resizeDocumentView(Rectangle& _rPlayground)
275 {
276 	if ( !_rPlayground.IsEmpty() )
277 	{
278 		const Size aPlaygroundSize( _rPlayground.GetSize() );
279 
280 		// calc the split pos, and forward it to the controller
281 		sal_Int32 nSplitPos = getController().getSplitPos();
282 		if ( 0 != aPlaygroundSize.Width() )
283 		{
284 			if	(	( -1 == nSplitPos )
285 				||	( nSplitPos >= aPlaygroundSize.Width() )
286 				)
287 			{
288                 long nMinWidth = static_cast<long>(0.1*aPlaygroundSize.Width());
289                 if ( m_pPropWin && m_pPropWin->IsVisible() )
290                     nMinWidth = m_pPropWin->GetMinOutputSizePixel().Width();
291 				nSplitPos = static_cast<sal_Int32>(_rPlayground.Right() - nMinWidth);
292 				getController().setSplitPos(nSplitPos);
293 			}
294 		} // if ( 0 != _rPlaygroundSize.Width() )
295 
296         Size aReportWindowSize(aPlaygroundSize);
297         if ( m_aSplitWin.IsItemValid(TASKPANE_ID) )
298         {
299 		    // normalize the split pos
300             const long nSplitterWidth = GetSettings().GetStyleSettings().GetSplitSize();
301             Point aTaskPanePos(nSplitPos + nSplitterWidth, _rPlayground.Top());
302             if ( m_pTaskPane && m_pTaskPane->IsVisible() )
303             {
304                 aTaskPanePos.X() = aPlaygroundSize.Width() - m_pTaskPane->GetSizePixel().Width();
305                 sal_Int32 nMinWidth = m_pPropWin->getMinimumSize().Width();
306                 if ( nMinWidth > (aPlaygroundSize.Width() - aTaskPanePos.X()) )
307                 {
308                     aTaskPanePos.X() = aPlaygroundSize.Width() - nMinWidth;
309                 }
310                 nSplitPos = aTaskPanePos.X() - nSplitterWidth;
311                 getController().setSplitPos(nSplitPos);
312 
313                 const long nTaskPaneSize = static_cast<long>((aPlaygroundSize.Width() - aTaskPanePos.X())*100/aPlaygroundSize.Width());
314                 if ( m_aSplitWin.GetItemSize( TASKPANE_ID ) != nTaskPaneSize )
315                 {
316                     m_aSplitWin.SetItemSize( REPORT_ID, 99 - nTaskPaneSize );
317 		            m_aSplitWin.SetItemSize( TASKPANE_ID, nTaskPaneSize );
318                 }
319             }
320         }
321         // set the size of the report window
322         m_aSplitWin.SetPosSizePixel( _rPlayground.TopLeft(),aPlaygroundSize );
323 	}
324     	// just for completeness: there is no space left, we occupied it all ...
325 	_rPlayground.SetPos( _rPlayground.BottomRight() );
326 	_rPlayground.SetSize( Size( 0, 0 ) );
327 
328 }
329 // -----------------------------------------------------------------------------
330 // set the view readonly or not
331 void ODesignView::setReadOnly(sal_Bool /*_bReadOnly*/)
332 {
333 }
334 //----------------------------------------------------------------------------
335 IMPL_LINK( ODesignView, MarkTimeout, Timer *, EMPTYARG )
336 {
337 	if ( m_pPropWin && m_pPropWin->IsVisible() )
338 	{
339 		m_pPropWin->Update(m_pCurrentView);
340         uno::Reference<beans::XPropertySet> xProp(m_xReportComponent,uno::UNO_QUERY);
341 		if ( xProp.is() )
342         {
343 			m_pPropWin->Update(xProp);
344             static_cast<OTaskWindow*>(m_pTaskPane)->Resize();
345         }
346         Resize();
347 	}
348 
349     return 0;
350 }
351 
352 //----------------------------------------------------------------------------
353 void ODesignView::SetMode( DlgEdMode _eNewMode )
354 {
355 	m_eMode = _eNewMode;
356     if ( m_eMode == RPTUI_SELECT )
357         m_eActObj = OBJ_NONE;
358 
359 	m_aScrollWindow.SetMode(_eNewMode);
360 }
361 //----------------------------------------------------------------------------
362 void ODesignView::SetInsertObj( sal_uInt16 eObj,const ::rtl::OUString& _sShapeType )
363 {
364 	m_eActObj = eObj;
365 	m_aScrollWindow.SetInsertObj( eObj,_sShapeType );
366 }
367 //----------------------------------------------------------------------------
368 rtl::OUString ODesignView::GetInsertObjString() const
369 {
370 	return m_aScrollWindow.GetInsertObjString();
371 }
372 //----------------------------------------------------------------------------
373 
374 sal_uInt16 ODesignView::GetInsertObj() const
375 {
376 	return m_eActObj;
377 }
378 
379 //----------------------------------------------------------------------------
380 void ODesignView::Cut()
381 {
382 	Copy();
383 	Delete();
384 }
385 
386 //----------------------------------------------------------------------------
387 
388 void ODesignView::Copy()
389 {
390     m_aScrollWindow.Copy();
391 }
392 
393 //----------------------------------------------------------------------------
394 
395 void ODesignView::Paste()
396 {
397     m_aScrollWindow.Paste();
398 }
399 //----------------------------------------------------------------------------
400 void ODesignView::Delete()
401 {
402 	m_aScrollWindow.Delete();
403 }
404 //----------------------------------------------------------------------------
405 sal_Bool ODesignView::HasSelection() const
406 {
407 	return m_aScrollWindow.HasSelection();
408 }
409 //----------------------------------------------------------------------------
410 
411 sal_Bool ODesignView::IsPasteAllowed() const
412 {
413     return m_aScrollWindow.IsPasteAllowed();
414 }
415 
416 //----------------------------------------------------------------------------
417 void ODesignView::UpdatePropertyBrowserDelayed(OSectionView& _rView)
418 {
419 	if ( m_pCurrentView != &_rView )
420 	{
421 		if ( m_pCurrentView )
422 			m_aScrollWindow.setMarked(m_pCurrentView,sal_False);
423 		m_pCurrentView = &_rView;
424 		if ( m_pCurrentView )
425 			m_aScrollWindow.setMarked(m_pCurrentView,sal_True);
426 		m_xReportComponent.clear();
427         DlgEdHint aHint( RPTUI_HINT_SELECTIONCHANGED );
428 		Broadcast( aHint );
429 	}
430     m_aMarkTimer.Start();
431 }
432 
433 //----------------------------------------------------------------------------
434 void ODesignView::toggleGrid(sal_Bool _bGridVisible)
435 {
436 	 m_aScrollWindow.toggleGrid(_bGridVisible);
437 }
438 //----------------------------------------------------------------------------
439 sal_uInt16 ODesignView::getSectionCount() const
440 {
441     return m_aScrollWindow.getSectionCount();
442 }
443 //----------------------------------------------------------------------------
444 void ODesignView::showRuler(sal_Bool _bShow)
445 {
446 	 m_aScrollWindow.showRuler(_bShow);
447 }
448 //----------------------------------------------------------------------------
449 void ODesignView::removeSection(sal_uInt16 _nPosition)
450 {
451 	 m_aScrollWindow.removeSection(_nPosition);
452 }
453 //----------------------------------------------------------------------------
454 void ODesignView::addSection(const uno::Reference< report::XSection >& _xSection,const ::rtl::OUString& _sColorEntry,sal_uInt16 _nPosition)
455 {
456 	 m_aScrollWindow.addSection(_xSection,_sColorEntry,_nPosition);
457 }
458 // -----------------------------------------------------------------------------
459 void ODesignView::GetFocus()
460 {
461 	Window::GetFocus();
462 
463     if ( !m_bDeleted )
464     {
465         ::boost::shared_ptr<OSectionWindow> pSectionWindow = m_aScrollWindow.getMarkedSection();
466         if ( pSectionWindow )
467 		    pSectionWindow->GrabFocus();
468     }
469 }
470 // -----------------------------------------------------------------------------
471 void ODesignView::ImplInitSettings()
472 {
473 //#if OSL_DEBUG_LEVEL > 0
474 //    SetBackground( Wallpaper( COL_RED ));
475 //#else
476     SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetFaceColor() ));
477 //#endif
478 	SetFillColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
479 	SetTextFillColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
480 }
481 //-----------------------------------------------------------------------------
482 IMPL_LINK( ODesignView, SplitHdl, void*,  )
483 {
484 	const Size aOutputSize = GetOutputSizePixel();
485     const long nTest = aOutputSize.Width() * m_aSplitWin.GetItemSize(TASKPANE_ID) / 100;
486     long nMinWidth = static_cast<long>(0.1*aOutputSize.Width());
487     if ( m_pPropWin && m_pPropWin->IsVisible() )
488         nMinWidth = m_pPropWin->GetMinOutputSizePixel().Width();
489 
490 	if ( (aOutputSize.Width() - nTest) >= nMinWidth && nTest > m_aScrollWindow.getMaxMarkerWidth(sal_False) )
491 	{
492         long nOldSplitPos = getController().getSplitPos();
493         (void)nOldSplitPos;
494 		getController().setSplitPos(nTest);
495 	}
496 
497 	return 0L;
498 }
499 //-----------------------------------------------------------------------------
500 void ODesignView::SelectAll(const sal_uInt16 _nObjectType)
501 {
502 	 m_aScrollWindow.SelectAll(_nObjectType);
503 }
504 //-----------------------------------------------------------------------------
505 void ODesignView::unmarkAllObjects(OSectionView* _pSectionView)
506 {
507 	m_aScrollWindow.unmarkAllObjects(_pSectionView);
508 }
509 //-----------------------------------------------------------------------------
510 void ODesignView::togglePropertyBrowser(sal_Bool _bToogleOn)
511 {
512 	if ( !m_pPropWin && _bToogleOn )
513     {
514 		m_pPropWin = new PropBrw(getController().getORB(),m_pTaskPane,this);
515         m_pPropWin->Invalidate();
516         static_cast<OTaskWindow*>(m_pTaskPane)->setPropertyBrowser(m_pPropWin);
517         notifySystemWindow(this,m_pPropWin,::comphelper::mem_fun(&TaskPaneList::AddWindow));
518     }
519 	if ( m_pPropWin && _bToogleOn != m_pPropWin->IsVisible() )
520 	{
521 		if ( !m_pCurrentView && !m_xReportComponent.is() )
522 			m_xReportComponent = getController().getReportDefinition();
523 
524         const sal_Bool bWillBeVisible = _bToogleOn;
525 		m_pPropWin->Show(bWillBeVisible);
526         m_pTaskPane->Show(bWillBeVisible);
527         m_pTaskPane->Invalidate();
528 
529         if ( bWillBeVisible )
530             m_aSplitWin.InsertItem( TASKPANE_ID, m_pTaskPane,START_SIZE_TASKPANE, SPLITWINDOW_APPEND, COLSET_ID, SWIB_PERCENTSIZE/*|SWIB_COLSET */);
531         else
532             m_aSplitWin.RemoveItem(TASKPANE_ID);
533 
534         // TRY
535         // Invalidate(/*INVALIDATE_NOCHILDREN|INVALIDATE_NOERASE*/);
536 		if ( bWillBeVisible )
537 			m_aMarkTimer.Start();
538 	}
539 }
540 //-----------------------------------------------------------------------------
541 void ODesignView::showProperties(const uno::Reference< uno::XInterface>& _xReportComponent)
542 {
543     if ( m_xReportComponent != _xReportComponent )
544     {
545 	    m_xReportComponent = _xReportComponent;
546 	    if ( m_pCurrentView )
547 		    m_aScrollWindow.setMarked(m_pCurrentView,sal_False);
548 	    m_pCurrentView = NULL;
549         m_aMarkTimer.Start();
550     }
551 }
552 //-----------------------------------------------------------------------------
553 sal_Bool ODesignView::isReportExplorerVisible() const
554 {
555 	return m_pReportExplorer && m_pReportExplorer->IsVisible();
556 }
557 //-----------------------------------------------------------------------------
558 void ODesignView::toggleReportExplorer()
559 {
560     if ( !m_pReportExplorer )
561     {
562         OReportController& rReportController = getController();
563         m_pReportExplorer = new ONavigator(this,rReportController);
564         SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromInt32( RID_NAVIGATOR ) );
565         if ( aDlgOpt.Exists() )
566             m_pReportExplorer->SetWindowState( ByteString( aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
567         m_pReportExplorer->AddEventListener(LINK(&rReportController,OReportController,EventLstHdl));
568         notifySystemWindow(this,m_pReportExplorer,::comphelper::mem_fun(&TaskPaneList::AddWindow));
569     }
570     else
571 		m_pReportExplorer->Show(!m_pReportExplorer->IsVisible());
572 }
573 //-----------------------------------------------------------------------------
574 sal_Bool ODesignView::isAddFieldVisible() const
575 {
576 	return m_pAddField && m_pAddField->IsVisible();
577 }
578 //-----------------------------------------------------------------------------
579 void ODesignView::toggleAddField()
580 {
581     if ( !m_pAddField )
582 	{
583 		uno::Reference< report::XReportDefinition > xReport(m_xReportComponent,uno::UNO_QUERY);
584         uno::Reference< report::XReportComponent > xReportComponent(m_xReportComponent,uno::UNO_QUERY);
585         OReportController& rReportController = getController();
586         if ( !m_pCurrentView && !xReport.is() )
587 		{
588 			if ( xReportComponent.is() )
589 				xReport = xReportComponent->getSection()->getReportDefinition();
590 			else
591 				xReport = rReportController.getReportDefinition().get();
592 		}
593         else if ( m_pCurrentView )
594         {
595             uno::Reference< report::XSection > xSection = m_pCurrentView->getReportSection()->getSection();
596 			xReport = xSection->getReportDefinition();
597         }
598 		uno::Reference < beans::XPropertySet > xSet(rReportController.getRowSet(),uno::UNO_QUERY);
599 		m_pAddField = new OAddFieldWindow(this,xSet);
600         m_pAddField->SetCreateHdl(LINK( &rReportController, OReportController, OnCreateHdl ) );
601         SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromAscii( UID_RPT_RPT_APP_VIEW ) );
602         if ( aDlgOpt.Exists() )
603             m_pAddField->SetWindowState( ByteString( aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
604         m_pAddField->Update();
605 		m_pAddField->AddEventListener(LINK(&rReportController,OReportController,EventLstHdl));
606         notifySystemWindow(this,m_pAddField,::comphelper::mem_fun(&TaskPaneList::AddWindow));
607         m_pAddField->Show();
608 	}
609 	else
610 		m_pAddField->Show(!m_pAddField->IsVisible());
611 }
612 // -------------------------------------------------------------------------
613 uno::Reference< report::XSection > ODesignView::getCurrentSection() const
614 {
615 	uno::Reference< report::XSection > xSection;
616 	if ( m_pCurrentView )
617 		xSection = m_pCurrentView->getReportSection()->getSection();
618 
619     // why do we need the code below?
620 	//else
621  //   {
622  //       OReportController& rReportController = getController();
623  //       xSection = rReportController.getReportDefinition()->getDetail();
624  //   }
625 	return xSection;
626 }
627 // -----------------------------------------------------------------------------
628 uno::Reference< report::XReportComponent > ODesignView::getCurrentControlModel() const
629 {
630 	uno::Reference< report::XReportComponent > xModel;
631 	if ( m_pCurrentView )
632 	{
633 		xModel = m_pCurrentView->getReportSection()->getCurrentControlModel();
634 	}
635 	return xModel;
636 }
637 // -------------------------------------------------------------------------
638 ::boost::shared_ptr<OSectionWindow> ODesignView::getMarkedSection(NearSectionAccess nsa) const
639 {
640 	return  m_aScrollWindow.getMarkedSection(nsa);
641 }
642 //-----------------------------------------------------------------------------
643 ::boost::shared_ptr<OSectionWindow> ODesignView::getSectionWindow(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection) const
644 {
645 	return  m_aScrollWindow.getSectionWindow(_xSection);
646 }
647 // -------------------------------------------------------------------------
648 void ODesignView::markSection(const sal_uInt16 _nPos)
649 {
650 	m_aScrollWindow.markSection(_nPos);
651 }
652 // -----------------------------------------------------------------------------
653 void ODesignView::fillCollapsedSections(::std::vector<sal_uInt16>& _rCollapsedPositions) const
654 {
655     m_aScrollWindow.fillCollapsedSections(_rCollapsedPositions);
656 }
657 // -----------------------------------------------------------------------------
658 void ODesignView::collapseSections(const uno::Sequence< beans::PropertyValue>& _aCollpasedSections)
659 {
660     m_aScrollWindow.collapseSections(_aCollpasedSections);
661 }
662 // -----------------------------------------------------------------------------
663 ::rtl::OUString ODesignView::getCurrentPage() const
664 {
665     return m_pPropWin ? m_pPropWin->getCurrentPage() : ::rtl::OUString();
666 }
667 // -----------------------------------------------------------------------------
668 void ODesignView::setCurrentPage(const ::rtl::OUString& _sLastActivePage)
669 {
670     if ( m_pPropWin )
671         m_pPropWin->setCurrentPage(_sLastActivePage);
672 }
673 // -----------------------------------------------------------------------------
674 void ODesignView::alignMarkedObjects(sal_Int32 _nControlModification,bool _bAlignAtSection, bool bBoundRects)
675 {
676     m_aScrollWindow.alignMarkedObjects(_nControlModification, _bAlignAtSection,bBoundRects);
677 }
678 #if 0
679 // -----------------------------------------------------------------------------
680 sal_Bool ODesignView::isAlignPossible() const
681 {
682     ::boost::shared_ptr<OSectionWindow> pMarkedSection = getMarkedSection();
683     return pMarkedSection.get() && pMarkedSection->getReportSection().getSectionView().IsAlignPossible();
684 }
685 #endif
686 //------------------------------------------------------------------------------
687 sal_Bool ODesignView::handleKeyEvent(const KeyEvent& _rEvent)
688 {
689     if ( (m_pPropWin && m_pPropWin->HasChildPathFocus()) )
690         return sal_False;
691     if ( (m_pAddField && m_pAddField->HasChildPathFocus()) )
692         return sal_False;
693     if ( (m_pReportExplorer && m_pReportExplorer->HasChildPathFocus()) )
694         return sal_False;
695 	return m_aScrollWindow.handleKeyEvent(_rEvent);
696 }
697 //------------------------------------------------------------------------
698 void ODesignView::setMarked(const uno::Reference< report::XSection>& _xSection,sal_Bool _bMark)
699 {
700 	m_aScrollWindow.setMarked(_xSection,_bMark);
701     if ( _bMark )
702         UpdatePropertyBrowserDelayed(getMarkedSection()->getReportSection().getSectionView());
703     else
704         m_pCurrentView = NULL;
705 }
706 //------------------------------------------------------------------------
707 void ODesignView::setMarked(const uno::Sequence< uno::Reference< report::XReportComponent> >& _aShapes,sal_Bool _bMark)
708 {
709 	m_aScrollWindow.setMarked(_aShapes,_bMark);
710     if ( _aShapes.hasElements() && _bMark )
711         showProperties(_aShapes[0]);
712     else
713         m_xReportComponent.clear();
714 }
715 //------------------------------------------------------------------------------
716 void ODesignView::MouseButtonDown( const MouseEvent& rMEvt )
717 {
718 	if ( rMEvt.IsLeft() )
719 	{
720 		const uno::Sequence< beans::PropertyValue> aArgs;
721 		getController().executeChecked(SID_SELECT_REPORT,aArgs);
722 	}
723     ODataView::MouseButtonDown(rMEvt);
724 }
725 // -----------------------------------------------------------------------------
726 uno::Any ODesignView::getCurrentlyShownProperty() const
727 {
728     uno::Any aRet;
729     ::boost::shared_ptr<OSectionWindow> pSectionWindow = getMarkedSection();
730     if ( pSectionWindow )
731     {
732         ::std::vector< uno::Reference< uno::XInterface > > aSelection;
733         pSectionWindow->getReportSection().fillControlModelSelection(aSelection);
734         if ( !aSelection.empty() )
735         {
736             ::std::vector< uno::Reference< uno::XInterface > >::iterator aIter = aSelection.begin();
737             uno::Sequence< uno::Reference< report::XReportComponent > > aSeq(aSelection.size());
738             for(sal_Int32 i = 0; i < aSeq.getLength(); ++i,++aIter)
739             {
740                 aSeq[i].set(*aIter,uno::UNO_QUERY);
741             }
742             aRet <<= aSeq;
743         }
744     }
745     return aRet;
746 }
747 // -----------------------------------------------------------------------------
748 void ODesignView::fillControlModelSelection(::std::vector< uno::Reference< uno::XInterface > >& _rSelection) const
749 {
750     m_aScrollWindow.fillControlModelSelection(_rSelection);
751 }
752 // -----------------------------------------------------------------------------
753 void ODesignView::setGridSnap(sal_Bool bOn)
754 {
755     m_aScrollWindow.setGridSnap(bOn);
756 
757 }
758 // -----------------------------------------------------------------------------
759 void ODesignView::setDragStripes(sal_Bool bOn)
760 {
761     m_aScrollWindow.setDragStripes(bOn);
762 }
763 // -----------------------------------------------------------------------------
764 sal_Bool ODesignView::isHandleEvent(sal_uInt16 /*_nId*/) const
765 {
766     return m_pPropWin && m_pPropWin->HasChildPathFocus();
767 }
768 // -----------------------------------------------------------------------------
769 sal_uInt32 ODesignView::getMarkedObjectCount() const
770 {
771     return m_aScrollWindow.getMarkedObjectCount();
772 }
773 // -----------------------------------------------------------------------------
774 void ODesignView::zoom(const Fraction& _aZoom)
775 {
776     m_aScrollWindow.zoom(_aZoom);
777 }
778 // -----------------------------------------------------------------------------
779 sal_uInt16 ODesignView::getZoomFactor(SvxZoomType _eType) const
780 {
781     return m_aScrollWindow.getZoomFactor(_eType);
782 }
783 //============================================================================
784 } // rptui
785 //============================================================================
786