LCOV - code coverage report
Current view: top level - sd/source/ui/sidebar - MasterPagesSelector.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 317 0.0 %
Date: 2014-04-14 Functions: 0 45 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "MasterPagesSelector.hxx"
      21             : 
      22             : #include "MasterPageContainer.hxx"
      23             : #include "DocumentHelper.hxx"
      24             : #include "pres.hxx"
      25             : #include "drawdoc.hxx"
      26             : #include "DrawDocShell.hxx"
      27             : #include "sdpage.hxx"
      28             : #include "glob.hxx"
      29             : #include "glob.hrc"
      30             : #include "app.hrc"
      31             : #include "res_bmp.hrc"
      32             : #include "strings.hrc"
      33             : #include "DrawViewShell.hxx"
      34             : #include "DrawController.hxx"
      35             : #include "SlideSorterViewShell.hxx"
      36             : #include "PreviewValueSet.hxx"
      37             : #include "ViewShellBase.hxx"
      38             : #include <sfx2/objface.hxx>
      39             : #include "sdresid.hxx"
      40             : #include "drawview.hxx"
      41             : #include <vcl/image.hxx>
      42             : #include <vcl/floatwin.hxx>
      43             : #include <svl/languageoptions.hxx>
      44             : #include <sfx2/app.hxx>
      45             : #include <sfx2/dispatch.hxx>
      46             : #include <sfx2/mnumgr.hxx>
      47             : #include <svl/itemset.hxx>
      48             : #include <svl/eitem.hxx>
      49             : #include <svx/dlgutil.hxx>
      50             : #include <svx/svdpagv.hxx>
      51             : #include <svx/svxids.hrc>
      52             : #include "FrameView.hxx"
      53             : #include "stlpool.hxx"
      54             : #include "unmovss.hxx"
      55             : #include <sfx2/request.hxx>
      56             : #include <svl/itempool.hxx>
      57             : #include <sfx2/sidebar/Theme.hxx>
      58             : 
      59             : 
      60             : using namespace ::com::sun::star::text;
      61             : 
      62             : 
      63             : 
      64             : namespace sd { namespace sidebar {
      65             : 
      66             : 
      67           0 : MasterPagesSelector::MasterPagesSelector (
      68             :     ::Window* pParent,
      69             :     SdDrawDocument& rDocument,
      70             :     ViewShellBase& rBase,
      71             :     const ::boost::shared_ptr<MasterPageContainer>& rpContainer,
      72             :     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
      73             :     : PreviewValueSet(pParent),
      74             :       maMutex(),
      75             :       mpContainer(rpContainer),
      76             :       mrDocument(rDocument),
      77             :       mbSmallPreviewSize(false),
      78             :       mrBase(rBase),
      79             :       mnDefaultClickAction(SID_TP_APPLY_TO_ALL_SLIDES),
      80             :       maPreviewUpdateQueue(),
      81             :       maCurrentItemList(),
      82             :       maTokenToValueSetIndex(),
      83             :       maLockedMasterPages(),
      84           0 :       mxSidebar(rxSidebar)
      85             : {
      86             :     PreviewValueSet::SetSelectHdl (
      87           0 :         LINK(this, MasterPagesSelector, ClickHandler));
      88             :     PreviewValueSet::SetRightMouseClickHandler (
      89           0 :         LINK(this, MasterPagesSelector, RightClickHandler));
      90           0 :     PreviewValueSet::SetStyle(PreviewValueSet::GetStyle() | WB_NO_DIRECTSELECT);
      91             : 
      92           0 :     if ( GetDPIScaleFactor() > 1 )
      93           0 :         mpContainer->SetPreviewSize(MasterPageContainer::LARGE);
      94             : 
      95           0 :     PreviewValueSet::SetPreviewSize(mpContainer->GetPreviewSizePixel());
      96           0 :     PreviewValueSet::Show();
      97             : 
      98           0 :     SetBackground(sfx2::sidebar::Theme::GetWallpaper(sfx2::sidebar::Theme::Paint_PanelBackground));
      99           0 :     SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Paint_PanelBackground));
     100             : 
     101           0 :     Link aChangeListener (LINK(this,MasterPagesSelector,ContainerChangeListener));
     102           0 :     mpContainer->AddChangeListener(aChangeListener);
     103           0 : }
     104             : 
     105             : 
     106             : 
     107             : 
     108           0 : MasterPagesSelector::~MasterPagesSelector (void)
     109             : {
     110           0 :     Clear();
     111           0 :     UpdateLocks(ItemList());
     112             : 
     113           0 :     Link aChangeListener (LINK(this,MasterPagesSelector,ContainerChangeListener));
     114           0 :     mpContainer->RemoveChangeListener(aChangeListener);
     115           0 : }
     116             : 
     117             : 
     118             : 
     119             : 
     120           0 : void MasterPagesSelector::LateInit (void)
     121             : {
     122           0 : }
     123             : 
     124             : 
     125             : 
     126             : 
     127           0 : sal_Int32 MasterPagesSelector::GetPreferredWidth (sal_Int32 nHeight)
     128             : {
     129           0 :     const ::osl::MutexGuard aGuard (maMutex);
     130             : 
     131           0 :     return PreviewValueSet::GetPreferredWidth (nHeight);
     132             : }
     133             : 
     134             : 
     135             : 
     136             : 
     137           0 : sal_Int32 MasterPagesSelector::GetPreferredHeight (sal_Int32 nWidth)
     138             : {
     139           0 :     const ::osl::MutexGuard aGuard (maMutex);
     140             : 
     141           0 :     return PreviewValueSet::GetPreferredHeight (nWidth);
     142             : }
     143             : 
     144             : 
     145             : 
     146             : 
     147           0 : Size MasterPagesSelector::GetPreferredSize (void)
     148             : {
     149             :     int nPreferredWidth = GetPreferredWidth(
     150           0 :         PreviewValueSet::GetOutputSizePixel().Height());
     151           0 :     int nPreferredHeight = GetPreferredHeight(nPreferredWidth);
     152           0 :     return Size (nPreferredWidth, nPreferredHeight);
     153             : 
     154             : }
     155             : 
     156             : 
     157             : 
     158             : 
     159           0 : void MasterPagesSelector::UpdateLocks (const ItemList& rItemList)
     160             : {
     161           0 :     ItemList aNewLockList;
     162             : 
     163             :     // In here we first lock the master pages in the given list and then
     164             :     // release the locks acquired in a previous call to this method.  When
     165             :     // this were done the other way round the lock count of some master
     166             :     // pages might drop temporarily to 0 and would lead to unnecessary
     167             :     // deletion and re-creation of MasterPageDescriptor objects.
     168             : 
     169             :     // Lock the master pages in the given list.
     170           0 :     ItemList::const_iterator iItem;
     171           0 :     for (iItem=rItemList.begin(); iItem!=rItemList.end(); ++iItem)
     172             :     {
     173           0 :         mpContainer->AcquireToken(*iItem);
     174           0 :         aNewLockList.push_back(*iItem);
     175             :     }
     176             : 
     177             :     // Release the previously locked master pages.
     178           0 :     ItemList::const_iterator iPage;
     179           0 :     ItemList::const_iterator iEnd (maLockedMasterPages.end());
     180           0 :     for (iPage=maLockedMasterPages.begin(); iPage!=iEnd; ++iPage)
     181           0 :         mpContainer->ReleaseToken(*iPage);
     182             : 
     183           0 :     maLockedMasterPages.swap(aNewLockList);
     184           0 : }
     185             : 
     186             : 
     187             : 
     188             : 
     189           0 : void MasterPagesSelector::Fill (void)
     190             : {
     191           0 :     ::std::auto_ptr<ItemList> pItemList (new ItemList());
     192             : 
     193           0 :     Fill(*pItemList);
     194             : 
     195           0 :     UpdateLocks(*pItemList);
     196           0 :     UpdateItemList(pItemList);
     197           0 : }
     198             : 
     199             : 
     200             : 
     201             : 
     202           0 : ResId MasterPagesSelector::GetContextMenuResId (void) const
     203             : {
     204           0 :     return SdResId(RID_TASKPANE_MASTERPAGESSELECTOR_POPUP);
     205             : }
     206             : 
     207             : 
     208             : 
     209             : 
     210           0 : IMPL_LINK_NOARG(MasterPagesSelector, ClickHandler)
     211             : {
     212             :     // We use the framework to assign the clicked-on master page because we
     213             :     // so use the same mechanism as the context menu does (where we do not
     214             :     // have the option to call the assignment method directly.)
     215           0 :     ExecuteCommand(mnDefaultClickAction);
     216             : 
     217           0 :     return 0;
     218             : }
     219             : 
     220             : 
     221             : 
     222             : 
     223           0 : IMPL_LINK(MasterPagesSelector, RightClickHandler, MouseEvent*, pEvent)
     224             : {
     225             :     // Here we only prepare the display of the context menu: the item under
     226             :     // the mouse is selected.  The actual display of the context menu is
     227             :     // done in ContextMenuCallback which is called indirectly through
     228             :     // PreviewValueSet::Command().
     229           0 :     PreviewValueSet::GrabFocus ();
     230           0 :     PreviewValueSet::ReleaseMouse();
     231           0 :     SfxViewFrame* pViewFrame = mrBase.GetViewFrame();
     232           0 :     if (pViewFrame != NULL)
     233             :     {
     234           0 :         SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
     235           0 :         if (pDispatcher != NULL &&  pEvent != NULL)
     236             :         {
     237           0 :             sal_uInt16 nIndex = PreviewValueSet::GetItemId (pEvent->GetPosPixel());
     238           0 :             if (nIndex > 0)
     239           0 :                 PreviewValueSet::SelectItem (nIndex);
     240             :         }
     241             :     }
     242           0 :     return 0;
     243             : }
     244             : 
     245             : 
     246             : 
     247             : 
     248           0 : void MasterPagesSelector::Command (const CommandEvent& rEvent)
     249             : {
     250           0 :     switch (rEvent.GetCommand())
     251             :     {
     252             :         case COMMAND_CONTEXTMENU:
     253             :         {
     254             :             // Use the currently selected item and show the popup menu in its
     255             :             // center.
     256           0 :             const sal_uInt16 nIndex = PreviewValueSet::GetSelectItemId();
     257           0 :             if (nIndex > 0)
     258             :             {
     259             :                 // The position of the upper left corner of the context menu is
     260             :                 // taken either from the mouse position (when the command was sent
     261             :                 // as reaction to a right click) or in the center of the selected
     262             :                 // item (when the command was sent as reaction to Shift+F10.)
     263           0 :                 Point aPosition (rEvent.GetMousePosPixel());
     264           0 :                 if ( ! rEvent.IsMouseEvent())
     265             :                 {
     266           0 :                     Rectangle aBBox (PreviewValueSet::GetItemRect(nIndex));
     267           0 :                     aPosition = aBBox.Center();
     268             :                 }
     269             : 
     270             :                 // Setup the menu.
     271           0 :                 ::boost::scoped_ptr<PopupMenu> pMenu (new PopupMenu(GetContextMenuResId()));
     272           0 :                 FloatingWindow* pMenuWindow = dynamic_cast<FloatingWindow*>(pMenu->GetWindow());
     273           0 :                 if (pMenuWindow != NULL)
     274             :                     pMenuWindow->SetPopupModeFlags(
     275           0 :                         pMenuWindow->GetPopupModeFlags() | FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE);
     276           0 :                 pMenu->SetSelectHdl(LINK(this, MasterPagesSelector, OnMenuItemSelected));
     277             : 
     278           0 :                 ProcessPopupMenu(*pMenu);
     279             : 
     280             :                 // Show the menu.
     281           0 :                 pMenu->Execute(this, Rectangle(aPosition,Size(1,1)), POPUPMENU_EXECUTE_DOWN);
     282             :             }
     283           0 :             break;
     284             :         }
     285             :     }
     286           0 : }
     287             : 
     288             : 
     289             : 
     290             : 
     291           0 : void MasterPagesSelector::ProcessPopupMenu (Menu& rMenu)
     292             : {
     293             :     // Disable some entries.
     294           0 :     if (mpContainer->GetPreviewSize() == MasterPageContainer::SMALL)
     295           0 :         rMenu.EnableItem(SID_TP_SHOW_SMALL_PREVIEW, false);
     296             :     else
     297           0 :         rMenu.EnableItem(SID_TP_SHOW_LARGE_PREVIEW, false);
     298           0 : }
     299             : 
     300             : 
     301             : 
     302             : 
     303           0 : IMPL_LINK(MasterPagesSelector, OnMenuItemSelected, Menu*, pMenu)
     304             : {
     305           0 :     if (pMenu == NULL)
     306             :     {
     307             :         OSL_ENSURE(pMenu!=NULL, "MasterPagesSelector::OnMenuItemSelected: illegal menu!");
     308           0 :         return 0;
     309             :     }
     310             : 
     311           0 :     pMenu->Deactivate();
     312           0 :     ExecuteCommand(pMenu->GetCurItemId());
     313           0 :     return 0;
     314             : }
     315             : 
     316             : 
     317             : 
     318             : 
     319           0 : void MasterPagesSelector::ExecuteCommand (const sal_Int32 nCommandId)
     320             : {
     321           0 :     switch (nCommandId)
     322             :     {
     323             :         case SID_TP_APPLY_TO_ALL_SLIDES:
     324           0 :             mrBase.SetBusyState (true);
     325           0 :             AssignMasterPageToAllSlides (GetSelectedMasterPage());
     326           0 :             mrBase.SetBusyState (false);
     327           0 :             break;
     328             : 
     329             :         case SID_TP_APPLY_TO_SELECTED_SLIDES:
     330           0 :             mrBase.SetBusyState (true);
     331           0 :             AssignMasterPageToSelectedSlides (GetSelectedMasterPage());
     332           0 :             mrBase.SetBusyState (false);
     333           0 :             break;
     334             : 
     335             :         case SID_TP_USE_FOR_NEW_PRESENTATIONS:
     336             :             DBG_ASSERT (false,
     337             :                 "Using slides as default for new presentations"
     338             :                 " is not yet implemented");
     339           0 :             break;
     340             : 
     341             :         case SID_TP_SHOW_SMALL_PREVIEW:
     342             :         case SID_TP_SHOW_LARGE_PREVIEW:
     343             :         {
     344           0 :             mrBase.SetBusyState (true);
     345             :             mpContainer->SetPreviewSize(
     346             :                 nCommandId==SID_TP_SHOW_SMALL_PREVIEW
     347             :                 ? MasterPageContainer::SMALL
     348           0 :                 : MasterPageContainer::LARGE);
     349           0 :             mrBase.SetBusyState (false);
     350           0 :             if (mxSidebar.is())
     351           0 :                 mxSidebar->requestLayout();
     352           0 :             break;
     353             :         }
     354             : 
     355             :         case SID_TP_EDIT_MASTER:
     356             :         {
     357             :             using namespace ::com::sun::star;
     358           0 :             uno::Reference<drawing::XDrawPage> xSelectedMaster;
     359           0 :             SdPage* pMasterPage = GetSelectedMasterPage();
     360             :             assert(pMasterPage); //rhbz#902884
     361           0 :             if (pMasterPage)
     362           0 :                 xSelectedMaster = uno::Reference<drawing::XDrawPage>(pMasterPage->getUnoPage(), uno::UNO_QUERY);
     363           0 :             SfxViewFrame* pViewFrame = mrBase.GetViewFrame();
     364           0 :             if (pViewFrame != NULL && xSelectedMaster.is())
     365             :             {
     366           0 :                 SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
     367           0 :                 if (pDispatcher != NULL)
     368             :                 {
     369           0 :                     sal_uInt16 nIndex = PreviewValueSet::GetSelectItemId();
     370           0 :                     pDispatcher->Execute(SID_MASTERPAGE, SFX_CALLMODE_SYNCHRON);
     371           0 :                     PreviewValueSet::SelectItem (nIndex);
     372           0 :                     mrBase.GetDrawController().setCurrentPage(xSelectedMaster);
     373             :                 }
     374             :             }
     375           0 :             break;
     376             :         }
     377             : 
     378             :         case SID_CUT:
     379             :         case SID_COPY:
     380             :         case SID_PASTE:
     381             :             // Cut, copy, and paste are not supported and thus are ignored.
     382           0 :             break;
     383             :     }
     384           0 : }
     385             : 
     386             : 
     387             : 
     388             : 
     389           0 : IMPL_LINK(MasterPagesSelector, ContainerChangeListener, MasterPageContainerChangeEvent*, pEvent)
     390             : {
     391           0 :     if (pEvent)
     392           0 :         NotifyContainerChangeEvent(*pEvent);
     393           0 :     return 0;
     394             : }
     395             : 
     396             : 
     397             : 
     398             : 
     399           0 : SdPage* MasterPagesSelector::GetSelectedMasterPage (void)
     400             : {
     401           0 :     const ::osl::MutexGuard aGuard (maMutex);
     402             : 
     403           0 :     SdPage* pMasterPage = NULL;
     404           0 :     sal_uInt16 nIndex = PreviewValueSet::GetSelectItemId();
     405           0 :     UserData* pData = GetUserData(nIndex);
     406           0 :     if (pData != NULL)
     407             :     {
     408           0 :         pMasterPage = mpContainer->GetPageObjectForToken(pData->second);
     409             :     }
     410           0 :     return pMasterPage;
     411             : }
     412             : 
     413             : 
     414             : 
     415             : 
     416             : /** Assemble a list of all slides of the document and pass it to
     417             :     AssignMasterPageToPageList().
     418             : */
     419           0 : void MasterPagesSelector::AssignMasterPageToAllSlides (SdPage* pMasterPage)
     420             : {
     421           0 :     if (pMasterPage == NULL)
     422           0 :         return;
     423             : 
     424           0 :     sal_uInt16 nPageCount = mrDocument.GetSdPageCount(PK_STANDARD);
     425           0 :     if (nPageCount == 0)
     426           0 :         return;
     427             : 
     428             :     // Get a list of all pages.  As a little optimization we only
     429             :     // include pages that do not already have the given master page
     430             :     // assigned.
     431           0 :     OUString sFullLayoutName(pMasterPage->GetLayoutName());
     432             :     ::sd::slidesorter::SharedPageSelection pPageList (
     433           0 :         new ::sd::slidesorter::SlideSorterViewShell::PageSelection());
     434           0 :     for (sal_uInt16 nPageIndex=0; nPageIndex<nPageCount; nPageIndex++)
     435             :     {
     436           0 :         SdPage* pPage = mrDocument.GetSdPage (nPageIndex, PK_STANDARD);
     437           0 :         if (pPage != NULL && pPage->GetLayoutName() != sFullLayoutName)
     438             :         {
     439           0 :             pPageList->push_back (pPage);
     440             :         }
     441             :     }
     442             : 
     443           0 :     AssignMasterPageToPageList(pMasterPage, pPageList);
     444             : }
     445             : 
     446             : 
     447             : 
     448             : 
     449             : /** Assemble a list of the currently selected slides (selected in a visible
     450             :     slide sorter) and pass it to AssignMasterPageToPageList().
     451             : */
     452           0 : void MasterPagesSelector::AssignMasterPageToSelectedSlides (
     453             :     SdPage* pMasterPage)
     454             : {
     455             :     using namespace ::sd::slidesorter;
     456             :     using namespace ::sd::slidesorter::controller;
     457             : 
     458           0 :     if (pMasterPage == NULL)
     459           0 :         return;
     460             : 
     461             :     // Find a visible slide sorter.
     462           0 :     SlideSorterViewShell* pSlideSorter = SlideSorterViewShell::GetSlideSorter(mrBase);
     463           0 :     if (pSlideSorter == NULL)
     464           0 :         return;
     465             : 
     466             :     // Get a list of selected pages.
     467           0 :     SharedPageSelection pPageSelection = pSlideSorter->GetPageSelection();
     468           0 :     if (pPageSelection->empty())
     469           0 :         return;
     470             : 
     471           0 :     AssignMasterPageToPageList(pMasterPage, pPageSelection);
     472             : 
     473             :     // Restore the previous selection.
     474           0 :     pSlideSorter->SetPageSelection(pPageSelection);
     475             : }
     476             : 
     477             : 
     478             : 
     479             : 
     480           0 : void MasterPagesSelector::AssignMasterPageToPageList (
     481             :     SdPage* pMasterPage,
     482             :     const ::sd::slidesorter::SharedPageSelection& rPageList)
     483             : {
     484           0 :     DocumentHelper::AssignMasterPageToPageList(mrDocument, pMasterPage, rPageList);
     485           0 : }
     486             : 
     487             : 
     488             : 
     489             : 
     490           0 : void MasterPagesSelector::NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent)
     491             : {
     492           0 :     const ::osl::MutexGuard aGuard (maMutex);
     493             : 
     494           0 :     switch (rEvent.meEventType)
     495             :     {
     496             :         case MasterPageContainerChangeEvent::SIZE_CHANGED:
     497           0 :             PreviewValueSet::SetPreviewSize(mpContainer->GetPreviewSizePixel());
     498           0 :             UpdateAllPreviews();
     499           0 :             break;
     500             : 
     501             :         case MasterPageContainerChangeEvent::PREVIEW_CHANGED:
     502             :         {
     503           0 :             int nIndex (GetIndexForToken(rEvent.maChildToken));
     504           0 :             if (nIndex >= 0)
     505             :             {
     506             :                 PreviewValueSet::SetItemImage (
     507             :                     (sal_uInt16)nIndex,
     508           0 :                     mpContainer->GetPreviewForToken(rEvent.maChildToken));
     509           0 :                 PreviewValueSet::Invalidate(PreviewValueSet::GetItemRect((sal_uInt16)nIndex));
     510             :             }
     511             :         }
     512           0 :         break;
     513             : 
     514             :         case MasterPageContainerChangeEvent::DATA_CHANGED:
     515             :         {
     516           0 :             InvalidateItem(rEvent.maChildToken);
     517           0 :             Fill();
     518             :         }
     519           0 :         break;
     520             : 
     521             :         case MasterPageContainerChangeEvent::CHILD_REMOVED:
     522             :         {
     523           0 :             int nIndex (GetIndexForToken(rEvent.maChildToken));
     524           0 :             SetItem(nIndex, MasterPageContainer::NIL_TOKEN);
     525             :         }
     526             : 
     527             :         default:
     528           0 :             break;
     529           0 :    }
     530           0 : }
     531             : 
     532             : 
     533             : 
     534             : 
     535           0 : MasterPagesSelector::UserData* MasterPagesSelector::CreateUserData (
     536             :     int nIndex,
     537             :     MasterPageContainer::Token aToken) const
     538             : {
     539           0 :     return new UserData(nIndex,aToken);
     540             : }
     541             : 
     542             : 
     543             : 
     544             : 
     545           0 : MasterPagesSelector::UserData* MasterPagesSelector::GetUserData (int nIndex) const
     546             : {
     547           0 :     const ::osl::MutexGuard aGuard (maMutex);
     548             : 
     549           0 :     if (nIndex>0 && static_cast<unsigned int>(nIndex)<=PreviewValueSet::GetItemCount())
     550           0 :         return reinterpret_cast<UserData*>(PreviewValueSet::GetItemData((sal_uInt16)nIndex));
     551             :     else
     552           0 :         return NULL;
     553             : }
     554             : 
     555             : 
     556             : 
     557             : 
     558           0 : void MasterPagesSelector::SetUserData (int nIndex, UserData* pData)
     559             : {
     560           0 :     const ::osl::MutexGuard aGuard (maMutex);
     561             : 
     562           0 :     if (nIndex>0 && static_cast<unsigned int>(nIndex)<=PreviewValueSet::GetItemCount())
     563             :     {
     564           0 :         UserData* pOldData = GetUserData(nIndex);
     565           0 :         if (pOldData!=NULL && pOldData!=pData)
     566           0 :             delete pOldData;
     567           0 :         PreviewValueSet::SetItemData((sal_uInt16)nIndex, pData);
     568           0 :     }
     569           0 : }
     570             : 
     571             : 
     572             : 
     573             : 
     574           0 : bool MasterPagesSelector::IsResizable (void)
     575             : {
     576           0 :     return false;
     577             : }
     578             : 
     579             : 
     580             : 
     581             : 
     582           0 : ::Window* MasterPagesSelector::GetWindow (void)
     583             : {
     584           0 :     return this;
     585             : }
     586             : 
     587             : 
     588             : 
     589             : 
     590           0 : sal_Int32 MasterPagesSelector::GetMinimumWidth (void)
     591             : {
     592           0 :     return mpContainer->GetPreviewSizePixel().Width() + 2*3;
     593             : }
     594             : 
     595             : 
     596             : 
     597             : 
     598           0 : void MasterPagesSelector::UpdateSelection (void)
     599             : {
     600           0 : }
     601             : 
     602             : 
     603             : 
     604             : 
     605           0 : void MasterPagesSelector::SetItem (
     606             :     sal_uInt16 nIndex,
     607             :     MasterPageContainer::Token aToken)
     608             : {
     609           0 :     const ::osl::MutexGuard aGuard (maMutex);
     610             : 
     611           0 :     RemoveTokenToIndexEntry(nIndex,aToken);
     612             : 
     613           0 :     if (nIndex > 0)
     614             :     {
     615           0 :         if (aToken != MasterPageContainer::NIL_TOKEN)
     616             :         {
     617           0 :             Image aPreview (mpContainer->GetPreviewForToken(aToken));
     618           0 :             MasterPageContainer::PreviewState eState (mpContainer->GetPreviewState(aToken));
     619             : 
     620           0 :             if (aPreview.GetSizePixel().Width()>0)
     621             :             {
     622           0 :                 if (PreviewValueSet::GetItemPos(nIndex) != VALUESET_ITEM_NOTFOUND)
     623             :                 {
     624           0 :                     PreviewValueSet::SetItemImage(nIndex,aPreview);
     625           0 :                     PreviewValueSet::SetItemText(nIndex, mpContainer->GetPageNameForToken(aToken));
     626             :                 }
     627             :                 else
     628             :                 {
     629             :                     PreviewValueSet::InsertItem (
     630             :                         nIndex,
     631             :                         aPreview,
     632             :                         mpContainer->GetPageNameForToken(aToken),
     633           0 :                         nIndex);
     634             :                 }
     635           0 :                 SetUserData(nIndex, CreateUserData(nIndex,aToken));
     636             : 
     637           0 :                 AddTokenToIndexEntry(nIndex,aToken);
     638             :             }
     639             : 
     640           0 :             if (eState == MasterPageContainer::PS_CREATABLE)
     641           0 :                 mpContainer->RequestPreview(aToken);
     642             :         }
     643             :         else
     644             :         {
     645           0 :             PreviewValueSet::RemoveItem(nIndex);
     646             :         }
     647           0 :     }
     648             : 
     649           0 : }
     650             : 
     651             : 
     652             : 
     653             : 
     654           0 : void MasterPagesSelector::AddTokenToIndexEntry (
     655             :     sal_uInt16 nIndex,
     656             :     MasterPageContainer::Token aToken)
     657             : {
     658           0 :     const ::osl::MutexGuard aGuard (maMutex);
     659             : 
     660           0 :     maTokenToValueSetIndex[aToken] = nIndex;
     661           0 : }
     662             : 
     663             : 
     664             : 
     665             : 
     666           0 : void MasterPagesSelector::RemoveTokenToIndexEntry (
     667             :     sal_uInt16 nIndex,
     668             :     MasterPageContainer::Token aNewToken)
     669             : {
     670           0 :     const ::osl::MutexGuard aGuard (maMutex);
     671             : 
     672           0 :     UserData* pData = GetUserData(nIndex);
     673           0 :     if (pData != NULL)
     674             :     {
     675             :         // Get the token that the index pointed to previously.
     676           0 :         MasterPageContainer::Token aOldToken (pData->second);
     677             : 
     678           0 :         if (aNewToken != aOldToken
     679           0 :             && nIndex == GetIndexForToken(aOldToken))
     680             :         {
     681           0 :             maTokenToValueSetIndex[aOldToken] = 0;
     682             :         }
     683           0 :     }
     684           0 : }
     685             : 
     686             : 
     687             : 
     688             : 
     689           0 : void MasterPagesSelector::InvalidatePreview (const SdPage* pPage)
     690             : {
     691           0 :     const ::osl::MutexGuard aGuard (maMutex);
     692             : 
     693           0 :     for (sal_uInt16 nIndex=1; nIndex<=PreviewValueSet::GetItemCount(); nIndex++)
     694             :     {
     695           0 :         UserData* pData = GetUserData(nIndex);
     696           0 :         if (pData != NULL)
     697             :         {
     698           0 :             MasterPageContainer::Token aToken (pData->second);
     699           0 :             if (pPage == mpContainer->GetPageObjectForToken(aToken,false))
     700             :             {
     701           0 :                 mpContainer->InvalidatePreview(aToken);
     702           0 :                 mpContainer->RequestPreview(aToken);
     703           0 :                 break;
     704             :             }
     705             :         }
     706           0 :     }
     707           0 : }
     708             : 
     709           0 : void MasterPagesSelector::UpdateAllPreviews (void)
     710             : {
     711           0 :     const ::osl::MutexGuard aGuard (maMutex);
     712             : 
     713           0 :     for (sal_uInt16 nIndex=1; nIndex<=PreviewValueSet::GetItemCount(); nIndex++)
     714             :     {
     715           0 :         UserData* pData = GetUserData(nIndex);
     716           0 :         if (pData != NULL)
     717             :         {
     718           0 :             MasterPageContainer::Token aToken (pData->second);
     719             :             PreviewValueSet::SetItemImage(
     720             :                 nIndex,
     721           0 :                 mpContainer->GetPreviewForToken(aToken));
     722           0 :             if (mpContainer->GetPreviewState(aToken) == MasterPageContainer::PS_CREATABLE)
     723           0 :                 mpContainer->RequestPreview(aToken);
     724             :         }
     725             :     }
     726           0 :     PreviewValueSet::Rearrange(true);
     727           0 : }
     728             : 
     729             : 
     730             : 
     731             : 
     732           0 : void MasterPagesSelector::ClearPageSet (void)
     733             : {
     734           0 :     const ::osl::MutexGuard aGuard (maMutex);
     735             : 
     736           0 :     for (sal_uInt16 nIndex=1; nIndex<=PreviewValueSet::GetItemCount(); nIndex++)
     737             :     {
     738           0 :         UserData* pData = GetUserData(nIndex);
     739           0 :         if (pData != NULL)
     740           0 :             delete pData;
     741             :     }
     742           0 :     PreviewValueSet::Clear();
     743           0 : }
     744             : 
     745             : 
     746             : 
     747             : 
     748           0 : void MasterPagesSelector::SetHelpId( const OString& aId )
     749             : {
     750           0 :     const ::osl::MutexGuard aGuard (maMutex);
     751             : 
     752           0 :     PreviewValueSet::SetHelpId( aId );
     753           0 : }
     754             : 
     755             : 
     756             : 
     757             : 
     758           0 : sal_Int32 MasterPagesSelector::GetIndexForToken (MasterPageContainer::Token aToken) const
     759             : {
     760           0 :     const ::osl::MutexGuard aGuard (maMutex);
     761             : 
     762           0 :     TokenToValueSetIndex::const_iterator iIndex (maTokenToValueSetIndex.find(aToken));
     763           0 :     if (iIndex != maTokenToValueSetIndex.end())
     764           0 :         return iIndex->second;
     765             :     else
     766           0 :         return -1;
     767             : }
     768             : 
     769             : 
     770             : 
     771             : 
     772           0 : void MasterPagesSelector::Clear (void)
     773             : {
     774           0 :     const ::osl::MutexGuard aGuard (maMutex);
     775             : 
     776           0 :     ClearPageSet();
     777           0 : }
     778             : 
     779             : 
     780             : 
     781             : 
     782           0 : void MasterPagesSelector::InvalidateItem (MasterPageContainer::Token aToken)
     783             : {
     784           0 :     const ::osl::MutexGuard aGuard (maMutex);
     785             : 
     786           0 :     ItemList::iterator iItem;
     787           0 :     for (iItem=maCurrentItemList.begin(); iItem!=maCurrentItemList.end(); ++iItem)
     788             :     {
     789           0 :         if (*iItem == aToken)
     790             :         {
     791           0 :             *iItem = MasterPageContainer::NIL_TOKEN;
     792           0 :             break;
     793             :         }
     794           0 :     }
     795           0 : }
     796             : 
     797             : 
     798             : 
     799             : SAL_WNODEPRECATED_DECLARATIONS_PUSH
     800           0 : void MasterPagesSelector::UpdateItemList (::std::auto_ptr<ItemList> pNewItemList)
     801             : {
     802           0 :     const ::osl::MutexGuard aGuard (maMutex);
     803             : 
     804           0 :     ItemList::const_iterator iNewItem (pNewItemList->begin());
     805           0 :     ItemList::const_iterator iCurrentItem (maCurrentItemList.begin());
     806           0 :     ItemList::const_iterator iNewEnd (pNewItemList->end());
     807           0 :     ItemList::const_iterator iCurrentEnd (maCurrentItemList.end());
     808           0 :     sal_uInt16 nIndex (1);
     809             : 
     810             :     // Update existing items.
     811           0 :     for ( ; iNewItem!=iNewEnd && iCurrentItem!=iCurrentEnd; ++iNewItem, ++iCurrentItem,++nIndex)
     812             :     {
     813           0 :         if (*iNewItem != *iCurrentItem)
     814             :         {
     815           0 :             SetItem(nIndex,*iNewItem);
     816             :         }
     817             :     }
     818             : 
     819             :     // Append new items.
     820           0 :     for ( ; iNewItem!=iNewEnd; ++iNewItem,++nIndex)
     821             :     {
     822           0 :         SetItem(nIndex,*iNewItem);
     823             :     }
     824             : 
     825             :     // Remove trailing items.
     826           0 :     for ( ; iCurrentItem!=iCurrentEnd; ++iCurrentItem,++nIndex)
     827             :     {
     828           0 :         SetItem(nIndex,MasterPageContainer::NIL_TOKEN);
     829             :     }
     830             : 
     831           0 :     maCurrentItemList.swap(*pNewItemList);
     832             : 
     833           0 :     PreviewValueSet::Rearrange();
     834           0 :     if (mxSidebar.is())
     835           0 :         mxSidebar->requestLayout();
     836           0 : }
     837             : SAL_WNODEPRECATED_DECLARATIONS_POP
     838             : 
     839             : 
     840             : 
     841           0 : css::ui::LayoutSize MasterPagesSelector::GetHeightForWidth (const sal_Int32 nWidth)
     842             : {
     843           0 :     const sal_Int32 nHeight (GetPreferredHeight(nWidth));
     844           0 :     return css::ui::LayoutSize(nHeight,nHeight,nHeight);
     845             : }
     846             : 
     847             : } } // end of namespace sd::sidebar
     848             : 
     849             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10