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