Author: af
Date: Tue May 21 08:49:40 2013
New Revision: 1484700

URL: http://svn.apache.org/r1484700
Log:
i122352: Do not allow selection of disabled decks via menu.

Modified:
    openoffice/trunk/main/sfx2/source/sidebar/SidebarController.cxx
    openoffice/trunk/main/sfx2/source/sidebar/SidebarController.hxx
    openoffice/trunk/main/sfx2/source/sidebar/TabBar.cxx
    openoffice/trunk/main/sfx2/source/sidebar/TabBar.hxx

Modified: openoffice/trunk/main/sfx2/source/sidebar/SidebarController.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sfx2/source/sidebar/SidebarController.cxx?rev=1484700&r1=1484699&r2=1484700&view=diff
==============================================================================
--- openoffice/trunk/main/sfx2/source/sidebar/SidebarController.cxx (original)
+++ openoffice/trunk/main/sfx2/source/sidebar/SidebarController.cxx Tue May 21 
08:49:40 2013
@@ -110,7 +110,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(),
@@ -802,10 +802,9 @@ IMPL_LINK(SidebarController, WindowEvent
 
 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
@@ -837,9 +836,9 @@ void SidebarController::ShowDetailMenu (
 
 
 ::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)
@@ -847,21 +846,36 @@ void SidebarController::ShowDetailMenu (
         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 (MID_FIRST_PANEL);
-        for(::std::vector<TabBar::DeckMenuData>::const_iterator
-                iItem(rDeckSelectionData.begin()),
-                iEnd(rDeckSelectionData.end());
-            iItem!=iEnd;
-            ++iItem)
+    sal_Int32 nIndex (0);
+    for(::std::vector<TabBar::DeckMenuData>::const_iterator
+            iItem(rMenuData.begin()),
+            iEnd(rMenuData.end());
+        iItem!=iEnd;
+        ++iItem,++nIndex)
+    {
+        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);
         }
     }
 
@@ -873,22 +887,6 @@ void SidebarController::ShowDetailMenu (
     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)));
     
@@ -934,7 +932,8 @@ IMPL_LINK(SidebarController, OnMenuItemS
                 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&)
             {

Modified: openoffice/trunk/main/sfx2/source/sidebar/SidebarController.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sfx2/source/sidebar/SidebarController.hxx?rev=1484700&r1=1484699&r2=1484700&view=diff
==============================================================================
--- openoffice/trunk/main/sfx2/source/sidebar/SidebarController.hxx (original)
+++ openoffice/trunk/main/sfx2/source/sidebar/SidebarController.hxx Tue May 21 
08:49:40 2013
@@ -182,12 +182,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);
 

Modified: openoffice/trunk/main/sfx2/source/sidebar/TabBar.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sfx2/source/sidebar/TabBar.cxx?rev=1484700&r1=1484699&r2=1484700&view=diff
==============================================================================
--- openoffice/trunk/main/sfx2/source/sidebar/TabBar.cxx (original)
+++ openoffice/trunk/main/sfx2/source/sidebar/TabBar.cxx Tue May 21 08:49:40 
2013
@@ -379,8 +379,7 @@ void TabBar::UpdateFocusManager (FocusMa
 
 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;
@@ -389,18 +388,14 @@ IMPL_LINK(TabBar, OnToolboxClicked, void
         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);
         }
     }
 
@@ -408,8 +403,7 @@ IMPL_LINK(TabBar, OnToolboxClicked, void
         Rectangle(
             mpMenuButton->GetPosPixel(),
             mpMenuButton->GetSizePixel()),
-        aSelectionData,
-        aShowData);
+        aMenuData);
     
     return 0;
 }

Modified: openoffice/trunk/main/sfx2/source/sidebar/TabBar.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sfx2/source/sidebar/TabBar.hxx?rev=1484700&r1=1484699&r2=1484700&view=diff
==============================================================================
--- openoffice/trunk/main/sfx2/source/sidebar/TabBar.hxx (original)
+++ openoffice/trunk/main/sfx2/source/sidebar/TabBar.hxx Tue May 21 08:49:40 
2013
@@ -56,11 +56,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,


Reply via email to