diff options
author | Andre Fischer <af@apache.org> | 2013-05-21 08:49:40 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-05-21 18:45:51 +0100 |
commit | d456545fb1215eda69f6970d4207b2b062384877 (patch) | |
tree | 7c150f15c6bd922c5f0cdfbfc8e354b2b7fa884c /sfx2 | |
parent | 9a32ed36709cb03a8b5d3bcff0276bc31c934848 (diff) |
Resolves: #i122352# Do not allow selection of disabled decks via menu
(cherry picked from commit b27563ac5988d7ce407b045466e952114f54e07c)
Change-Id: Id36b8fd12d0fce8f8717e5dd21538d1871a005b0
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/sidebar/SidebarController.cxx | 63 | ||||
-rw-r--r-- | sfx2/source/sidebar/SidebarController.hxx | 6 | ||||
-rw-r--r-- | sfx2/source/sidebar/TabBar.cxx | 26 | ||||
-rw-r--r-- | sfx2/source/sidebar/TabBar.hxx | 13 |
4 files changed, 53 insertions, 55 deletions
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 7cc315e7acf7..e1e00426e852 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -102,7 +102,7 @@ SidebarController::SidebarController ( mpParentWindow, rxFrame, ::boost::bind(&SidebarController::OpenThenSwitchToDeck, this, _1), - ::boost::bind(&SidebarController::ShowPopupMenu, this, _1,_2,_3))), + ::boost::bind(&SidebarController::ShowPopupMenu, this, _1,_2))), mxFrame(rxFrame), maCurrentContext(OUString(), OUString()), maRequestedContext(), @@ -794,10 +794,9 @@ IMPL_LINK(SidebarController, WindowEventHandler, VclWindowEvent*, pEvent) void SidebarController::ShowPopupMenu ( const Rectangle& rButtonBox, - const ::std::vector<TabBar::DeckMenuData>& rDeckSelectionData, - const ::std::vector<TabBar::DeckMenuData>& rDeckShowData) const + const ::std::vector<TabBar::DeckMenuData>& rMenuData) const { - ::boost::shared_ptr<PopupMenu> pMenu = CreatePopupMenu(rDeckSelectionData, rDeckShowData); + ::boost::shared_ptr<PopupMenu> pMenu = CreatePopupMenu(rMenuData); pMenu->SetSelectHdl(LINK(this, SidebarController, OnMenuItemSelected)); // pass toolbox button rect so the menu can stay open on button up @@ -829,9 +828,9 @@ void SidebarController::ShowDetailMenu (const ::rtl::OUString& rsMenuCommand) co ::boost::shared_ptr<PopupMenu> SidebarController::CreatePopupMenu ( - const ::std::vector<TabBar::DeckMenuData>& rDeckSelectionData, - const ::std::vector<TabBar::DeckMenuData>& rDeckShowData) const + const ::std::vector<TabBar::DeckMenuData>& rMenuData) const { + // Create the top level popup menu. ::boost::shared_ptr<PopupMenu> pMenu (new PopupMenu()); FloatingWindow* pMenuWindow = dynamic_cast<FloatingWindow*>(pMenu->GetWindow()); if (pMenuWindow != NULL) @@ -839,21 +838,36 @@ void SidebarController::ShowDetailMenu (const ::rtl::OUString& rsMenuCommand) co pMenuWindow->SetPopupModeFlags(pMenuWindow->GetPopupModeFlags() | FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE); } + // Create sub menu for customization (hiding of deck tabs.) + PopupMenu* pCustomizationMenu = new PopupMenu(); + SidebarResource aLocalResource; // Add one entry for every tool panel element to individually make // them visible or hide them. + sal_Int32 nIndex (0); + for(::std::vector<TabBar::DeckMenuData>::const_iterator + iItem(rMenuData.begin()), + iEnd(rMenuData.end()); + iItem!=iEnd; + ++iItem,++nIndex) { - sal_Int32 nIndex (MID_FIRST_PANEL); - for(::std::vector<TabBar::DeckMenuData>::const_iterator - iItem(rDeckSelectionData.begin()), - iEnd(rDeckSelectionData.end()); - iItem!=iEnd; - ++iItem) + const sal_Int32 nMenuIndex (nIndex+MID_FIRST_PANEL); + pMenu->InsertItem(nMenuIndex, iItem->msDisplayName, MIB_RADIOCHECK); + pMenu->CheckItem(nMenuIndex, iItem->mbIsCurrentDeck ? sal_True : sal_False); + pMenu->EnableItem(nMenuIndex, (iItem->mbIsEnabled&&iItem->mbIsActive) ? sal_True : sal_False); + + const sal_Int32 nSubMenuIndex (nIndex+MID_FIRST_HIDE); + if (iItem->mbIsCurrentDeck) + { + // Don't allow the currently visible deck to be disabled. + pCustomizationMenu->InsertItem(nSubMenuIndex, iItem->msDisplayName, MIB_RADIOCHECK); + pCustomizationMenu->CheckItem(nSubMenuIndex, sal_True); + } + else { - pMenu->InsertItem(nIndex, iItem->get<0>(), MIB_RADIOCHECK); - pMenu->CheckItem(nIndex, iItem->get<2>()); - ++nIndex; + pCustomizationMenu->InsertItem(nSubMenuIndex, iItem->msDisplayName, MIB_CHECKABLE); + pCustomizationMenu->CheckItem(nSubMenuIndex, iItem->mbIsActive ? sal_True : sal_False); } } @@ -865,22 +879,6 @@ void SidebarController::ShowDetailMenu (const ::rtl::OUString& rsMenuCommand) co else pMenu->InsertItem(MID_UNLOCK_TASK_PANEL, String(SfxResId(STR_SFX_UNDOCK))); - // Add sub menu for customization (hiding of deck tabs.) - PopupMenu* pCustomizationMenu = new PopupMenu(); - { - sal_Int32 nIndex (MID_FIRST_HIDE); - for(::std::vector<TabBar::DeckMenuData>::const_iterator - iItem(rDeckShowData.begin()), - iEnd(rDeckShowData.end()); - iItem!=iEnd; - ++iItem) - { - pCustomizationMenu->InsertItem(nIndex, iItem->get<0>(), MIB_CHECKABLE); - pCustomizationMenu->CheckItem(nIndex, iItem->get<2>()); - ++nIndex; - } - } - pCustomizationMenu->InsertSeparator(); pCustomizationMenu->InsertItem(MID_RESTORE_DEFAULT, String(SfxResId(STRING_RESTORE))); @@ -926,7 +924,8 @@ IMPL_LINK(SidebarController, OnMenuItemSelected, Menu*, pMenu) if (nIndex >= MID_FIRST_PANEL && nIndex<MID_FIRST_HIDE) SwitchToDeck(mpTabBar->GetDeckIdForIndex(nIndex - MID_FIRST_PANEL)); else if (nIndex >=MID_FIRST_HIDE) - mpTabBar->ToggleHideFlag(nIndex-MID_FIRST_HIDE); + if (pMenu->GetItemBits(nIndex) == MIB_CHECKABLE) + mpTabBar->ToggleHideFlag(nIndex-MID_FIRST_HIDE); } catch (RuntimeException&) { diff --git a/sfx2/source/sidebar/SidebarController.hxx b/sfx2/source/sidebar/SidebarController.hxx index dc62f7af1b04..7eeab7fb06b5 100644 --- a/sfx2/source/sidebar/SidebarController.hxx +++ b/sfx2/source/sidebar/SidebarController.hxx @@ -178,12 +178,10 @@ private: const Context& rContext); void ShowPopupMenu ( const Rectangle& rButtonBox, - const ::std::vector<TabBar::DeckMenuData>& rDeckSelectionData, - const ::std::vector<TabBar::DeckMenuData>& rDeckShowData) const; + const ::std::vector<TabBar::DeckMenuData>& rMenuData) const; void ShowDetailMenu (const ::rtl::OUString& rsMenuCommand) const; ::boost::shared_ptr<PopupMenu> CreatePopupMenu ( - const ::std::vector<TabBar::DeckMenuData>& rDeckSelectionData, - const ::std::vector<TabBar::DeckMenuData>& rDeckShowData) const; + const ::std::vector<TabBar::DeckMenuData>& rMenuData) const; DECL_LINK(OnMenuItemSelected, Menu*); void BroadcastPropertyChange (void); diff --git a/sfx2/source/sidebar/TabBar.cxx b/sfx2/source/sidebar/TabBar.cxx index 11f8e2ea6459..21beb0f548a7 100644 --- a/sfx2/source/sidebar/TabBar.cxx +++ b/sfx2/source/sidebar/TabBar.cxx @@ -363,8 +363,7 @@ void TabBar::UpdateFocusManager (FocusManager& rFocusManager) IMPL_LINK(TabBar, OnToolboxClicked, void*, EMPTYARG) { - ::std::vector<DeckMenuData> aSelectionData; - ::std::vector<DeckMenuData> aShowData; + ::std::vector<DeckMenuData> aMenuData; for(ItemContainer::const_iterator iItem(maItems.begin()),iEnd(maItems.end()); iItem!=iEnd; @@ -373,18 +372,14 @@ IMPL_LINK(TabBar, OnToolboxClicked, void*, EMPTYARG) const DeckDescriptor* pDeckDescriptor = ResourceManager::Instance().GetDeckDescriptor(iItem->msDeckId); if (pDeckDescriptor != NULL) { - if ( ! iItem->mbIsHidden) - aSelectionData.push_back( - DeckMenuData( - pDeckDescriptor->msTitle, - pDeckDescriptor->msId, - iItem->mpButton->IsChecked())); - - aShowData.push_back( - DeckMenuData( - pDeckDescriptor->msTitle, - pDeckDescriptor->msId, - !iItem->mbIsHidden)); + DeckMenuData aData; + aData.msDisplayName = pDeckDescriptor->msTitle; + aData.msDeckId = pDeckDescriptor->msId; + aData.mbIsCurrentDeck = iItem->mpButton->IsChecked(); + aData.mbIsActive = !iItem->mbIsHidden; + aData.mbIsEnabled = iItem->mpButton->IsEnabled(); + + aMenuData.push_back(aData); } } @@ -392,8 +387,7 @@ IMPL_LINK(TabBar, OnToolboxClicked, void*, EMPTYARG) Rectangle( mpMenuButton->GetPosPixel(), mpMenuButton->GetSizePixel()), - aSelectionData, - aShowData); + aMenuData); return 0; } diff --git a/sfx2/source/sidebar/TabBar.hxx b/sfx2/source/sidebar/TabBar.hxx index a9479cb20c60..7cecc42e68b1 100644 --- a/sfx2/source/sidebar/TabBar.hxx +++ b/sfx2/source/sidebar/TabBar.hxx @@ -52,11 +52,18 @@ public: - isCurrentDeck for the deck selection data - isEnabled for the show/hide menu */ - typedef ::boost::tuple<rtl::OUString,rtl::OUString,bool> DeckMenuData; + class DeckMenuData + { + public: + ::rtl::OUString msDisplayName; + ::rtl::OUString msDeckId; + bool mbIsCurrentDeck; + bool mbIsActive; + bool mbIsEnabled; + }; typedef ::boost::function<void( const Rectangle&, - const ::std::vector<DeckMenuData>& rDeckSelectionData, - const ::std::vector<DeckMenuData>& rDeckShowData)> PopupMenuProvider; + const ::std::vector<DeckMenuData>& rMenuData)> PopupMenuProvider; TabBar ( Window* pParentWindow, const cssu::Reference<css::frame::XFrame>& rxFrame, |