1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sd.hxx" 26 27 // include --------------------------------------------------------------- 28 29 30 #include <vcl/menu.hxx> 31 #include <vcl/status.hxx> 32 #include <svl/style.hxx> 33 #include <svl/stritem.hxx> 34 #include <sfx2/dispatch.hxx> 35 36 #include "tmplctrl.hxx" 37 #include "ViewShellBase.hxx" 38 #include "drawdoc.hxx" 39 #include "sdattr.hrc" 40 #include "app.hrc" 41 42 SFX_IMPL_STATUSBAR_CONTROL( SdTemplateControl, SfxStringItem ); 43 44 // class TemplatePopup_Impl -------------------------------------------------- 45 46 class TemplatePopup_Impl : public PopupMenu 47 { 48 public: 49 TemplatePopup_Impl(); 50 51 sal_uInt16 GetCurId() const { return nCurId; } 52 53 private: 54 sal_uInt16 nCurId; 55 56 virtual void Select(); 57 }; 58 59 // ----------------------------------------------------------------------- 60 61 TemplatePopup_Impl::TemplatePopup_Impl() : 62 PopupMenu(), 63 nCurId(USHRT_MAX) 64 { 65 } 66 67 // ----------------------------------------------------------------------- 68 69 void TemplatePopup_Impl::Select() 70 { 71 nCurId = GetCurItemId(); 72 } 73 74 // class SdTemplateControl ------------------------------------------ 75 76 SdTemplateControl::SdTemplateControl( sal_uInt16 _nSlotId, 77 sal_uInt16 _nId, 78 StatusBar& rStb ) : 79 SfxStatusBarControl( _nSlotId, _nId, rStb ) 80 { 81 } 82 83 // ----------------------------------------------------------------------- 84 85 SdTemplateControl::~SdTemplateControl() 86 { 87 } 88 89 // ----------------------------------------------------------------------- 90 91 void SdTemplateControl::StateChanged( 92 sal_uInt16 /*nSID*/, SfxItemState eState, const SfxPoolItem* pState ) 93 { 94 if( eState != SFX_ITEM_AVAILABLE || pState->ISA( SfxVoidItem ) ) 95 GetStatusBar().SetItemText( GetId(), String() ); 96 else if ( pState->ISA( SfxStringItem ) ) 97 { 98 msTemplate = ((SfxStringItem*)pState)->GetValue(); 99 GetStatusBar().SetItemText( GetId(), msTemplate ); 100 } 101 } 102 103 // ----------------------------------------------------------------------- 104 105 void SdTemplateControl::Paint( const UserDrawEvent& ) 106 { 107 GetStatusBar().SetItemText( GetId(), msTemplate ); 108 } 109 110 // ----------------------------------------------------------------------- 111 112 void SdTemplateControl::Command( const CommandEvent& rCEvt ) 113 { 114 if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU && GetStatusBar().GetItemText( GetId() ).Len() ) 115 { 116 SfxViewFrame* pViewFrame = SfxViewFrame::Current(); 117 118 sd::ViewShellBase* pViewShellBase = sd::ViewShellBase::GetViewShellBase( pViewFrame ); 119 if( !pViewShellBase ) 120 return; 121 122 SdDrawDocument* pDoc = pViewShellBase->GetDocument(); 123 if( !pDoc ) 124 return; 125 126 CaptureMouse(); 127 TemplatePopup_Impl aPop; 128 { 129 const sal_uInt16 nMasterCount = pDoc->GetMasterSdPageCount(PK_STANDARD); 130 131 sal_uInt16 nCount = 0; 132 for( sal_uInt16 nPage = 0; nPage < nMasterCount; ++nPage ) 133 { 134 SdPage* pMaster = pDoc->GetMasterSdPage(nPage, PK_STANDARD); 135 if( pMaster ) 136 aPop.InsertItem( ++nCount, pMaster->GetName() ); 137 } 138 aPop.Execute( &GetStatusBar(), rCEvt.GetMousePosPixel()); 139 140 sal_uInt16 nCurrId = aPop.GetCurId()-1; 141 if( nCurrId < nMasterCount ) 142 { 143 SdPage* pMaster = pDoc->GetMasterSdPage(nCurrId, PK_STANDARD); 144 SfxStringItem aStyle( ATTR_PRESLAYOUT_NAME, pMaster->GetName() ); 145 pViewFrame->GetDispatcher()->Execute(SID_PRESENTATION_LAYOUT,SFX_CALLMODE_SLOT, &aStyle, 0L ); 146 pViewFrame->GetBindings().Invalidate(SID_PRESENTATION_LAYOUT); 147 pViewFrame->GetBindings().Invalidate(SID_STATUS_LAYOUT); 148 } 149 } 150 151 ReleaseMouse(); 152 } 153 } 154 155 156 157