/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_sd.hxx" #include "LayoutMenu.hxx" #include "SidebarShellManager.hxx" #include "app.hrc" #include "drawdoc.hxx" #include "framework/FrameworkHelper.hxx" #include "glob.hrc" #include "glob.hxx" #include "helpids.h" #include "pres.hxx" #include "res_bmp.hrc" #include "sdpage.hxx" #include "sdresid.hxx" #include "strings.hrc" #include "tools/SlotStateListener.hxx" #include "DrawController.hxx" #include "DrawDocShell.hxx" #include "DrawViewShell.hxx" #include "EventMultiplexer.hxx" #include "SlideSorterViewShell.hxx" #include "ViewShellBase.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::text; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::drawing::framework; using namespace ::sd::slidesorter; using ::sd::framework::FrameworkHelper; namespace sd { namespace sidebar { struct snewfoil_value_info { sal_uInt16 mnBmpResId; sal_uInt16 mnHCBmpResId; sal_uInt16 mnStrResId; WritingMode meWritingMode; AutoLayout maAutoLayout; }; static snewfoil_value_info notes[] = { {BMP_FOILN_01, BMP_FOILN_01_H, STR_AUTOLAYOUT_NOTES, WritingMode_LR_TB, AUTOLAYOUT_NOTES}, {0, 0, 0, WritingMode_LR_TB, AUTOLAYOUT_NONE}, }; static snewfoil_value_info handout[] = { {BMP_FOILH_01, BMP_FOILH_01_H, STR_AUTOLAYOUT_HANDOUT1, WritingMode_LR_TB, AUTOLAYOUT_HANDOUT1}, {BMP_FOILH_02, BMP_FOILH_02_H, STR_AUTOLAYOUT_HANDOUT2, WritingMode_LR_TB, AUTOLAYOUT_HANDOUT2}, {BMP_FOILH_03, BMP_FOILH_03_H, STR_AUTOLAYOUT_HANDOUT3, WritingMode_LR_TB, AUTOLAYOUT_HANDOUT3}, {BMP_FOILH_04, BMP_FOILH_04_H, STR_AUTOLAYOUT_HANDOUT4, WritingMode_LR_TB, AUTOLAYOUT_HANDOUT4}, {BMP_FOILH_06, BMP_FOILH_06_H, STR_AUTOLAYOUT_HANDOUT6, WritingMode_LR_TB, AUTOLAYOUT_HANDOUT6}, {BMP_FOILH_09, BMP_FOILH_09_H, STR_AUTOLAYOUT_HANDOUT9, WritingMode_LR_TB, AUTOLAYOUT_HANDOUT9}, {0, 0, 0, WritingMode_LR_TB, AUTOLAYOUT_NONE}, }; static snewfoil_value_info standard[] = { {BMP_LAYOUT_EMPTY, BMP_LAYOUT_EMPTY_H, STR_AUTOLAYOUT_NONE, WritingMode_LR_TB, AUTOLAYOUT_NONE}, {BMP_LAYOUT_HEAD03, BMP_LAYOUT_HEAD03_H, STR_AUTOLAYOUT_TITLE, WritingMode_LR_TB, AUTOLAYOUT_TITLE}, {BMP_LAYOUT_HEAD02, BMP_LAYOUT_HEAD02_H, STR_AUTOLAYOUT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_ENUM}, {BMP_LAYOUT_HEAD02A, BMP_LAYOUT_HEAD02A_H, STR_AUTOLAYOUT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_2TEXT}, {BMP_LAYOUT_HEAD01, BMP_LAYOUT_HEAD01_H, STR_AUTOLAYOUT_ONLY_TITLE, WritingMode_LR_TB, AUTOLAYOUT_ONLY_TITLE}, {BMP_LAYOUT_TEXTONLY, BMP_LAYOUT_TEXTONLY_H, STR_AUTOLAYOUT_ONLY_TEXT, WritingMode_LR_TB, AUTOLAYOUT_ONLY_TEXT}, {BMP_LAYOUT_HEAD03B, BMP_LAYOUT_HEAD03B_H, STR_AUTOLAYOUT_2CONTENT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_2OBJTEXT}, {BMP_LAYOUT_HEAD03C, BMP_LAYOUT_HEAD03C_H, STR_AUTOLAYOUT_CONTENT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TEXT2OBJ}, {BMP_LAYOUT_HEAD03A, BMP_LAYOUT_HEAD03A_H, STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT,WritingMode_LR_TB, AUTOLAYOUT_2OBJOVERTEXT}, {BMP_LAYOUT_HEAD02B, BMP_LAYOUT_HEAD02B_H, STR_AUTOLAYOUT_CONTENT_OVER_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_OBJOVERTEXT}, {BMP_LAYOUT_HEAD04, BMP_LAYOUT_HEAD04_H, STR_AUTOLAYOUT_4CONTENT, WritingMode_LR_TB, AUTOLAYOUT_4OBJ}, {BMP_LAYOUT_HEAD06, BMP_LAYOUT_HEAD06_H, STR_AUTOLAYOUT_6CONTENT, WritingMode_LR_TB, AUTOLAYOUT_6CLIPART}, // vertical {BMP_LAYOUT_VERTICAL02, BMP_LAYOUT_VERTICAL02_H, STR_AL_VERT_TITLE_TEXT_CHART, WritingMode_TB_RL,AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART}, {BMP_LAYOUT_VERTICAL01, BMP_LAYOUT_VERTICAL01_H, STR_AL_VERT_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE}, {BMP_LAYOUT_HEAD02, BMP_LAYOUT_HEAD02_H, STR_AL_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_TITLE_VERTICAL_OUTLINE}, {BMP_LAYOUT_HEAD02A, BMP_LAYOUT_HEAD02A_H, STR_AL_TITLE_VERT_OUTLINE_CLIPART, WritingMode_TB_RL, AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART}, {0, 0, 0, WritingMode_LR_TB, AUTOLAYOUT_NONE} }; LayoutMenu::LayoutMenu ( ::Window* pParent, ViewShellBase& rViewShellBase, const cssu::Reference& rxSidebar) : ValueSet (pParent), DragSourceHelper(this), DropTargetHelper(this), mrBase(rViewShellBase), mbUseOwnScrollBar(false), mnPreferredColumnCount(3), mxListener(NULL), mbSelectionUpdatePending(true), mbIsMainViewChangePending(false), mxSidebar(rxSidebar), mbIsDisposed(false) { implConstruct( *mrBase.GetDocument()->GetDocSh() ); OSL_TRACE("created LayoutMenu at %x", this); SetStyle(GetStyle() | WB_ITEMBORDER | WB_FLATVALUESET | WB_TABSTOP); SetBackground(sfx2::sidebar::Theme::GetWallpaper(sfx2::sidebar::Theme::Paint_PanelBackground)); SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Paint_PanelBackground)); #ifdef DEBUG SetText(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sd:LayoutMenu"))); #endif } void LayoutMenu::implConstruct( DrawDocShell& rDocumentShell ) { OSL_ENSURE( mrBase.GetDocument()->GetDocSh() == &rDocumentShell, "LayoutMenu::implConstruct: hmm?" ); // if this fires, then my assumption that the rDocumentShell parameter to our first ctor is superfluous ... SetStyle ( ( GetStyle() & ~(WB_ITEMBORDER) ) | WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_NO_DIRECTSELECT ); if (mbUseOwnScrollBar) SetStyle (GetStyle() | WB_VSCROLL); SetExtraSpacing(2); SetSelectHdl (LINK(this, LayoutMenu, ClickHandler)); InvalidateContent(); Link aEventListenerLink (LINK(this,LayoutMenu,EventMultiplexerListener)); mrBase.GetEventMultiplexer()->AddEventListener(aEventListenerLink, ::sd::tools::EventMultiplexerEvent::EID_CURRENT_PAGE | ::sd::tools::EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION | ::sd::tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED | ::sd::tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED | ::sd::tools::EventMultiplexerEvent::EID_CONFIGURATION_UPDATED | ::sd::tools::EventMultiplexerEvent::EID_EDIT_MODE_NORMAL | ::sd::tools::EventMultiplexerEvent::EID_EDIT_MODE_MASTER); Window::SetHelpId(HID_SD_TASK_PANE_PREVIEW_LAYOUTS); SetAccessibleName(SdResId(STR_TASKPANEL_LAYOUT_MENU_TITLE)); Link aStateChangeLink (LINK(this,LayoutMenu,StateChangeHandler)); mxListener = new ::sd::tools::SlotStateListener( aStateChangeLink, Reference(mrBase.GetController()->getFrame(), UNO_QUERY), ::rtl::OUString::createFromAscii(".uno:VerticalTextState")); SetSizePixel(GetParent()->GetSizePixel()); Link aWindowEventHandlerLink (LINK(this,LayoutMenu,WindowEventHandler)); GetParent()->AddEventListener(aWindowEventHandlerLink); } LayoutMenu::~LayoutMenu (void) { OSL_TRACE("destroying LayoutMenu at %x", this); Dispose(); } void LayoutMenu::Dispose (void) { if (mbIsDisposed) return; OSL_TRACE("disposing LayoutMenu at %x", this); mbIsDisposed = true; Reference xComponent (mxListener, UNO_QUERY); if (xComponent.is()) xComponent->dispose(); Clear(); Link aLink (LINK(this,LayoutMenu,EventMultiplexerListener)); mrBase.GetEventMultiplexer()->RemoveEventListener (aLink); Link aWindowEventHandlerLink (LINK(this,LayoutMenu,WindowEventHandler)); GetParent()->RemoveEventListener(aWindowEventHandlerLink); } AutoLayout LayoutMenu::GetSelectedAutoLayout (void) { AutoLayout aResult = AUTOLAYOUT_NONE; if ( ! IsNoSelection() && GetSelectItemId()!=0) { AutoLayout* pLayout = static_cast(GetItemData(GetSelectItemId())); if (pLayout != NULL) aResult = *pLayout; } return aResult; } /** The preferred size depends on the preferred number of columns, the number of items, and the size of the items. */ Size LayoutMenu::GetPreferredSize (void) { Size aItemSize = CalcItemSizePixel (Size()); Size aPreferredWindowSize = CalcWindowSizePixel ( aItemSize, (sal_uInt16)mnPreferredColumnCount, (sal_uInt16)CalculateRowCount (aItemSize,mnPreferredColumnCount)); return aPreferredWindowSize; } sal_Int32 LayoutMenu::GetPreferredWidth (sal_Int32 nHeight) { sal_Int32 nPreferredWidth = 100; if (GetItemCount() > 0) { Image aImage = GetItemImage(GetItemId(0)); Size aItemSize = CalcItemSizePixel (aImage.GetSizePixel()); if (nHeight>0 && aItemSize.Height()>0) { int nRowCount = nHeight / aItemSize.Height(); if (nRowCount <= 0) nRowCount = 1; int nColumnCount = (GetItemCount() + nRowCount-1) / nRowCount; nPreferredWidth = nColumnCount * aItemSize.Width(); } } return nPreferredWidth; } ui::LayoutSize LayoutMenu::GetHeightForWidth (const sal_Int32 nWidth) { sal_Int32 nPreferredHeight = 200; if ( ! mbUseOwnScrollBar && GetItemCount()>0) { Image aImage = GetItemImage(GetItemId(0)); Size aItemSize = CalcItemSizePixel (aImage.GetSizePixel()); if (nWidth>0 && aItemSize.Width()>0) { aItemSize.Width() += 8; aItemSize.Height() += 8; int nColumnCount = nWidth / aItemSize.Width(); if (nColumnCount <= 0) nColumnCount = 1; else if (nColumnCount > 4) nColumnCount = 4; int nRowCount = (GetItemCount() + nColumnCount-1) / nColumnCount; nPreferredHeight = nRowCount * aItemSize.Height(); } } return ui::LayoutSize(nPreferredHeight,nPreferredHeight,nPreferredHeight); } sal_Int32 LayoutMenu::GetMinimumWidth (void) { sal_Int32 nMinimumWidth = 0; if (GetItemCount()>0) { Image aImage = GetItemImage(GetItemId(0)); Size aItemSize = CalcItemSizePixel (aImage.GetSizePixel()); nMinimumWidth = aItemSize.Width(); } return nMinimumWidth; } void LayoutMenu::UpdateEnabledState (const MasterMode eMode) { bool bIsEnabled (false); ::boost::shared_ptr pMainViewShell (mrBase.GetMainViewShell()); if (pMainViewShell) { switch (pMainViewShell->GetShellType()) { case ViewShell::ST_NONE: case ViewShell::ST_OUTLINE: case ViewShell::ST_PRESENTATION: case ViewShell::ST_SIDEBAR: // The complete task pane is disabled for these values or // not even visible. Disabling the LayoutMenu would be // logical but unnecessary. The main disadvantage is that // after re-enabling it (typically) another panel is // expanded. bIsEnabled = true; break; case ViewShell::ST_DRAW: case ViewShell::ST_IMPRESS: { switch (eMode) { case MM_UNKNOWN: { ::boost::shared_ptr pDrawViewShell ( ::boost::dynamic_pointer_cast(pMainViewShell)); if (pDrawViewShell) bIsEnabled = pDrawViewShell->GetEditMode() != EM_MASTERPAGE; break; } case MM_NORMAL: bIsEnabled = true; break; case MM_MASTER: bIsEnabled = false; break; } break; } case ViewShell::ST_HANDOUT: case ViewShell::ST_NOTES: case ViewShell::ST_SLIDE_SORTER: default: bIsEnabled = true; break; } } } void LayoutMenu::Paint (const Rectangle& rRect) { if (mbSelectionUpdatePending) { mbSelectionUpdatePending = false; UpdateSelection(); } ValueSet::Paint (rRect); } void LayoutMenu::Resize (void) { Size aWindowSize = GetOutputSizePixel(); if (IsVisible() && aWindowSize.Width() > 0) { // Calculate the number of rows and columns. if (GetItemCount() > 0) { Image aImage = GetItemImage(GetItemId(0)); Size aItemSize = CalcItemSizePixel ( aImage.GetSizePixel()); aItemSize.Width() += 8; aItemSize.Height() += 8; int nColumnCount = aWindowSize.Width() / aItemSize.Width(); if (nColumnCount < 1) nColumnCount = 1; else if (nColumnCount > 4) nColumnCount = 4; int nRowCount = CalculateRowCount (aItemSize, nColumnCount); SetColCount ((sal_uInt16)nColumnCount); SetLineCount ((sal_uInt16)nRowCount); } } ValueSet::Resize (); } void LayoutMenu::MouseButtonDown (const MouseEvent& rEvent) { // As a preparation for the context menu the item under the mouse is // selected. if (rEvent.IsRight()) { ReleaseMouse(); sal_uInt16 nIndex = GetItemId (rEvent.GetPosPixel()); if (nIndex > 0) SelectItem(nIndex); } ValueSet::MouseButtonDown (rEvent); } void LayoutMenu::InsertPageWithLayout (AutoLayout aLayout) { ViewShell* pViewShell = mrBase.GetMainViewShell().get(); if (pViewShell == NULL) return; SfxViewFrame* pViewFrame = mrBase.GetViewFrame(); if (pViewFrame == NULL) return; SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher(); if (pDispatcher == NULL) return; // Call SID_INSERTPAGE with the right arguments. This is because // the popup menu can not call this slot with arguments directly. SfxRequest aRequest (CreateRequest(SID_INSERTPAGE, aLayout)); if (aRequest.GetArgs() != NULL) { pDispatcher->Execute( SID_INSERTPAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, *aRequest.GetArgs()); } UpdateSelection(); } void LayoutMenu::InvalidateContent (void) { // Throw away the current set and fill the menu anew according to the // current settings (this includes the support for vertical writing.) Fill(); if (mxSidebar.is()) mxSidebar->requestLayout(); } int LayoutMenu::CalculateRowCount (const Size&, int nColumnCount) { int nRowCount = 0; if (GetItemCount() > 0 && nColumnCount > 0) { nRowCount = (GetItemCount() + nColumnCount - 1) / nColumnCount; // nRowCount = GetOutputSizePixel().Height() / rItemSize.Height(); if (nRowCount < 1) nRowCount = 1; } return nRowCount; } IMPL_LINK(LayoutMenu, ClickHandler, ValueSet*, EMPTYARG) { AssignLayoutToSelectedSlides (GetSelectedAutoLayout()); return 0; } /** The specified layout is assigned to the current page of the view shell in the center pane. */ void LayoutMenu::AssignLayoutToSelectedSlides (AutoLayout aLayout) { using namespace ::sd::slidesorter; using namespace ::sd::slidesorter::controller; do { // The view shell in the center pane has to be present. ViewShell* pMainViewShell = mrBase.GetMainViewShell().get(); if (pMainViewShell == NULL) break; // Determine if the current view is in an invalid master page mode. // The handout view is always in master page mode and therefore not // invalid. bool bMasterPageMode (false); switch (pMainViewShell->GetShellType()) { case ViewShell::ST_NOTES: case ViewShell::ST_IMPRESS: { DrawViewShell* pDrawViewShell = static_cast(pMainViewShell); if (pDrawViewShell != NULL) if (pDrawViewShell->GetEditMode() == EM_MASTERPAGE) bMasterPageMode = true; } default: break; } if (bMasterPageMode) break; // Get a list of all selected slides and call the SID_MODIFYPAGE // slot for all of them. ::sd::slidesorter::SharedPageSelection pPageSelection; // Get a list of selected pages. // First we try to obtain this list from a slide sorter. This is // possible only some of the view shells in the center pane. When // no valid slide sorter is available then ask the main view shell // for its current page. SlideSorterViewShell* pSlideSorter = NULL; switch (pMainViewShell->GetShellType()) { case ViewShell::ST_IMPRESS: case ViewShell::ST_NOTES: case ViewShell::ST_SLIDE_SORTER: pSlideSorter = SlideSorterViewShell::GetSlideSorter(mrBase); break; default: break; } if (pSlideSorter != NULL) { // There is a slide sorter visible so get the list of selected pages from it. pPageSelection = pSlideSorter->GetPageSelection(); } if( (pSlideSorter == NULL) || (pPageSelection.get() == 0) || pPageSelection->empty() ) { // No valid slide sorter available. Ask the main view shell for // its current page. pPageSelection.reset(new ::sd::slidesorter::SlideSorterViewShell::PageSelection()); pPageSelection->push_back(pMainViewShell->GetActualPage()); } if (pPageSelection->empty()) break; ::std::vector::iterator iPage; for (iPage=pPageSelection->begin(); iPage!=pPageSelection->end(); ++iPage) { if ((*iPage) == NULL) continue; // Call the SID_ASSIGN_LAYOUT slot with all the necessary parameters. SfxRequest aRequest (mrBase.GetViewFrame(), SID_ASSIGN_LAYOUT); aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATPAGE, ((*iPage)->GetPageNum()-1)/2)); aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, aLayout)); pMainViewShell->ExecuteSlot (aRequest, sal_Bool(sal_False)); } } while(false); } SfxRequest LayoutMenu::CreateRequest ( sal_uInt16 nSlotId, AutoLayout aLayout) { SfxRequest aRequest (mrBase.GetViewFrame(), nSlotId); do { SdrLayerAdmin& rLayerAdmin (mrBase.GetDocument()->GetLayerAdmin()); sal_uInt8 aBackground (rLayerAdmin.GetLayerID( String(SdResId(STR_LAYER_BCKGRND)), sal_False)); sal_uInt8 aBackgroundObject (rLayerAdmin.GetLayerID( String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False)); ViewShell* pViewShell = mrBase.GetMainViewShell().get(); if (pViewShell == NULL) break; SdPage* pPage = pViewShell->GetActualPage(); if (pPage == NULL) break; SetOfByte aVisibleLayers (pPage->TRG_GetMasterPageVisibleLayers()); aRequest.AppendItem( SfxStringItem (ID_VAL_PAGENAME, String()));//pPage->GetName())); aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, aLayout)); aRequest.AppendItem( SfxBoolItem(ID_VAL_ISPAGEBACK, aVisibleLayers.IsSet(aBackground))); aRequest.AppendItem( SfxBoolItem( ID_VAL_ISPAGEOBJ, aVisibleLayers.IsSet(aBackgroundObject))); } while (false); return aRequest; } void LayoutMenu::Fill (void) { const bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); SvtLanguageOptions aLanguageOptions; sal_Bool bVertical = aLanguageOptions.IsVerticalTextEnabled(); SdDrawDocument* pDocument = mrBase.GetDocument(); sal_Bool bRightToLeft = (pDocument!=NULL && pDocument->GetDefaultWritingMode() == WritingMode_RL_TB); // Get URL of the view in the center pane. ::rtl::OUString sCenterPaneViewName; try { Reference xControllerManager ( Reference(&mrBase.GetDrawController()), UNO_QUERY_THROW); Reference xPaneId (ResourceId::create( ::comphelper::getProcessComponentContext(), FrameworkHelper::msCenterPaneURL)); Reference xView (FrameworkHelper::Instance(mrBase)->GetView(xPaneId)); if (xView.is()) sCenterPaneViewName = xView->getResourceId()->getResourceURL(); } catch (RuntimeException&) {} snewfoil_value_info* pInfo = NULL; if (sCenterPaneViewName.equals(framework::FrameworkHelper::msNotesViewURL)) { pInfo = notes; } else if (sCenterPaneViewName.equals(framework::FrameworkHelper::msHandoutViewURL)) { pInfo = handout; } else if (sCenterPaneViewName.equals(framework::FrameworkHelper::msImpressViewURL) || sCenterPaneViewName.equals(framework::FrameworkHelper::msSlideSorterURL)) { pInfo = standard; } else { pInfo = NULL; } Clear(); int n = 0; for (sal_uInt16 i=1; pInfo!=NULL&&pInfo->mnBmpResId!=0; i++,pInfo++) { if ((WritingMode_TB_RL != pInfo->meWritingMode) || bVertical) { BitmapEx aBmp (SdResId (bHighContrast ? pInfo->mnHCBmpResId : pInfo->mnBmpResId)); if (bRightToLeft && (WritingMode_TB_RL != pInfo->meWritingMode)) aBmp.Mirror (BMP_MIRROR_HORZ); InsertItem (i, aBmp, String (SdResId (pInfo->mnStrResId))); SetItemData (i, new AutoLayout(pInfo->maAutoLayout)); n++; } } mbSelectionUpdatePending = true; } void LayoutMenu::Clear (void) { for (sal_uInt16 nId=1; nId<=GetItemCount(); nId++) delete static_cast(GetItemData(nId)); ValueSet::Clear(); } void LayoutMenu::StartDrag (sal_Int8 , const Point& ) { } sal_Int8 LayoutMenu::AcceptDrop (const AcceptDropEvent& ) { return 0; } sal_Int8 LayoutMenu::ExecuteDrop (const ExecuteDropEvent& ) { return 0; } void LayoutMenu::Command (const CommandEvent& rEvent) { switch (rEvent.GetCommand()) { case COMMAND_CONTEXTMENU: if ( ! SD_MOD()->GetWaterCan()) { // Determine the position where to show the menu. Point aMenuPosition; if (rEvent.IsMouseEvent()) { if (GetItemId(rEvent.GetMousePosPixel()) <= 0) return; aMenuPosition = rEvent.GetMousePosPixel(); } else { if (GetSelectItemId() == (sal_uInt16)-1) return; Rectangle aBBox (GetItemRect(GetSelectItemId())); aMenuPosition = aBBox.Center(); } // Setup the menu. ::boost::shared_ptr pMenu (new PopupMenu(SdResId(RID_TASKPANE_LAYOUTMENU_POPUP))); FloatingWindow* pMenuWindow = dynamic_cast(pMenu->GetWindow()); if (pMenuWindow != NULL) pMenuWindow->SetPopupModeFlags( pMenuWindow->GetPopupModeFlags() | FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE); pMenu->SetSelectHdl(LINK(this, LayoutMenu, OnMenuItemSelected)); // Disable the SID_INSERTPAGE_LAYOUT_MENU item when // the document is read-only. const SfxPoolItem* pItem = NULL; const SfxItemState aState ( mrBase.GetViewFrame()->GetDispatcher()->QueryState(SID_INSERTPAGE, pItem)); if (aState == SFX_ITEM_DISABLED) pMenu->EnableItem(SID_INSERTPAGE_LAYOUT_MENU, sal_False); // Show the menu. pMenu->Execute(this, Rectangle(aMenuPosition,Size(1,1)), POPUPMENU_EXECUTE_DOWN); } break; default: ValueSet::Command(rEvent); break; } } IMPL_LINK(LayoutMenu, StateChangeHandler, ::rtl::OUString*, EMPTYARG) { InvalidateContent(); return 0; } IMPL_LINK(LayoutMenu, OnMenuItemSelected, Menu*, pMenu) { if (pMenu == NULL) { OSL_ENSURE(pMenu!=NULL, "LayoutMenu::OnMenuItemSelected: illegal menu!"); return 0; } pMenu->Deactivate(); const sal_Int32 nIndex (pMenu->GetCurItemId()); if (nIndex == SID_TP_APPLY_TO_SELECTED_SLIDES) { AssignLayoutToSelectedSlides(GetSelectedAutoLayout()); } else if (nIndex == SID_INSERTPAGE_LAYOUT_MENU) { // Add arguments to this slot and forward it to the main view // shell. InsertPageWithLayout(GetSelectedAutoLayout()); } return 0; } void LayoutMenu::UpdateSelection (void) { bool bItemSelected = false; do { // Get current page of main view. ViewShell* pViewShell = mrBase.GetMainViewShell().get(); if (pViewShell == NULL) break; SdPage* pCurrentPage = pViewShell->getCurrentPage(); if (pCurrentPage == NULL) break; // Get layout of current page. AutoLayout aLayout (pCurrentPage->GetAutoLayout()); if (aLayoutAUTOLAYOUT__END) break; // Find the entry of the menu for to the layout. sal_uInt16 nItemCount (GetItemCount()); for (sal_uInt16 nId=1; nId<=nItemCount; nId++) { if (*static_cast(GetItemData(nId)) == aLayout) { SelectItem(nId); bItemSelected = true; break; } } } while (false); if ( ! bItemSelected) SetNoSelection(); } IMPL_LINK(LayoutMenu, EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent*, pEvent) { switch (pEvent->meEventId) { case ::sd::tools::EventMultiplexerEvent::EID_CURRENT_PAGE: case ::sd::tools::EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION: if ( ! mbSelectionUpdatePending) UpdateSelection(); break; case ::sd::tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED: mbIsMainViewChangePending = true; UpdateEnabledState(MM_UNKNOWN); break; case ::sd::tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED: HideFocus(); break; case ::sd::tools::EventMultiplexerEvent::EID_CONFIGURATION_UPDATED: if (mbIsMainViewChangePending) { mbIsMainViewChangePending = false; InvalidateContent(); } break; case ::sd::tools::EventMultiplexerEvent::EID_EDIT_MODE_NORMAL: UpdateEnabledState(MM_NORMAL); break; case ::sd::tools::EventMultiplexerEvent::EID_EDIT_MODE_MASTER: UpdateEnabledState(MM_MASTER); break; default: /* Ignored */ break; } return 0; } IMPL_LINK(LayoutMenu, WindowEventHandler, VclWindowEvent*, pEvent) { if (pEvent != NULL) { switch (pEvent->GetId()) { case VCLEVENT_WINDOW_SHOW: case VCLEVENT_WINDOW_RESIZE: SetSizePixel(GetParent()->GetSizePixel()); return sal_True; default: return sal_False; } const SfxSimpleHint* pSimpleHint = PTR_CAST(SfxSimpleHint, pEvent); if (pSimpleHint != NULL && pSimpleHint->GetId() == SFX_HINT_DYING) { return sal_True; } } return sal_False; } void LayoutMenu::DataChanged (const DataChangedEvent& rEvent) { Fill(); ValueSet::DataChanged(rEvent); SetBackground(sfx2::sidebar::Theme::GetWallpaper(sfx2::sidebar::Theme::Paint_PanelBackground)); SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Paint_PanelBackground)); } } } // end of namespace ::sd::sidebar