Author: af Date: Tue Apr 2 09:22:29 2013 New Revision: 1463459 URL: http://svn.apache.org/r1463459 Log: i121420: Improved keyboard navigation in sidebar. Fixed bug in sidebar gallery.
Added: openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.hxx Modified: openoffice/branches/sidebar/main/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu openoffice/branches/sidebar/main/sfx2/Library_sfx.mk openoffice/branches/sidebar/main/sfx2/source/sidebar/Deck.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckLayouter.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckTitleBar.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/MenuButton.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/Panel.hxx openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.hxx openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.hxx openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.hxx openoffice/branches/sidebar/main/sfx2/source/sidebar/TabItem.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.hxx openoffice/branches/sidebar/main/sfx2/source/sidebar/ToolBoxBackground.cxx openoffice/branches/sidebar/main/sfx2/source/sidebar/Tools.hxx openoffice/branches/sidebar/main/svx/inc/GalleryControl.hxx openoffice/branches/sidebar/main/svx/source/gallery2/galbrws2.cxx Modified: openoffice/branches/sidebar/main/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu (original) +++ openoffice/branches/sidebar/main/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu Tue Apr 2 09:22:29 2013 @@ -56,7 +56,7 @@ </prop> <prop oor:name="ContextList"> <value oor:separator=";"> - any, any, visible ; + DrawImpress, any, visible ; </value> </prop> <prop oor:name="OrderIndex" oor:type="xs:int"> Modified: openoffice/branches/sidebar/main/sfx2/Library_sfx.mk URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/Library_sfx.mk?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/Library_sfx.mk (original) +++ openoffice/branches/sidebar/main/sfx2/Library_sfx.mk Tue Apr 2 09:22:29 2013 @@ -231,6 +231,7 @@ $(eval $(call gb_Library_add_exception_o sfx2/source/sidebar/DeckTitleBar \ sfx2/source/sidebar/DrawHelper \ sfx2/source/sidebar/EnumContext \ + sfx2/source/sidebar/FocusManager \ sfx2/source/sidebar/MenuButton \ sfx2/source/sidebar/Paint \ sfx2/source/sidebar/Panel \ Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/Deck.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/Deck.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/Deck.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/Deck.cxx Tue Apr 2 09:22:29 2013 @@ -54,7 +54,7 @@ Deck::Deck ( const DeckDescriptor& rDeckDescriptor, Window* pParentWindow, const ::boost::function<void(void)>& rCloserAction) - : Window(pParentWindow), + : Window(pParentWindow, 0), msId(rDeckDescriptor.msId), maIcon(), msIconURL(rDeckDescriptor.msIconURL), @@ -68,10 +68,12 @@ Deck::Deck ( { SetBackground(Wallpaper()); - mpScrollClipWindow->Show(); mpScrollClipWindow->SetBackground(Wallpaper()); - mpScrollContainer->Show(); + mpScrollClipWindow->Show(); + + mpScrollContainer->SetStyle(mpScrollContainer->GetStyle() | WB_DIALOGCONTROL); mpScrollContainer->SetBackground(Wallpaper()); + mpScrollContainer->Show(); mpVerticalScrollBar->SetScrollHdl(LINK(this, Deck, HandleVerticalScrollBarChange)); Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckLayouter.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckLayouter.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckLayouter.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckLayouter.cxx Tue Apr 2 09:22:29 2013 @@ -206,8 +206,8 @@ sal_Int32 DeckLayouter::PlacePanels ( // Assign heights and places. IterateLayoutItems(iItem,rLayoutItems) { - if (iItem->mpPanel == NULL) - continue; + if (iItem->mpPanel == NULL) + continue; Panel& rPanel (*iItem->mpPanel); @@ -224,10 +224,6 @@ sal_Int32 DeckLayouter::PlacePanels ( pTitleBar->SetPosSizePixel(0, nY, nWidth, nPanelTitleBarHeight); pTitleBar->Show(); nY += nPanelTitleBarHeight; - - // Separator below the panel title bar. - aSeparators.push_back(nY); - nY += nDeckSeparatorHeight; } else { @@ -267,6 +263,15 @@ sal_Int32 DeckLayouter::PlacePanels ( else { rPanel.Hide(); + + // Add a separator below the collapsed panel, if it is the + // last panel in the deck. + if (iItem == rLayoutItems.end()-1) + { + // Separator below the panel title bar. + aSeparators.push_back(nY); + nY += nDeckSeparatorHeight; + } } } Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckTitleBar.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckTitleBar.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckTitleBar.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/DeckTitleBar.cxx Tue Apr 2 09:22:29 2013 @@ -105,13 +105,6 @@ Rectangle DeckTitleBar::GetTitleArea (co void DeckTitleBar::PaintDecoration (const Rectangle& rTitleBarBox) { (void)rTitleBarBox; - - Image aGripImage (Theme::GetImage(Theme::Image_Grip)); - - const Point aTopLeft ( - gaLeftGripPadding, - (GetSizePixel().Height()-aGripImage.GetSizePixel().Height())/2); - DrawImage(aTopLeft, aGripImage); } Added: openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.cxx?rev=1463459&view=auto ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.cxx (added) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.cxx Tue Apr 2 09:22:29 2013 @@ -0,0 +1,565 @@ +/************************************************************** + * + * 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_sfx2.hxx" + +#include "FocusManager.hxx" +#include "Panel.hxx" +#include "Tools.hxx" +#include "TitleBar.hxx" +#include <vcl/button.hxx> +#include <vcl/toolbox.hxx> +#include <toolkit/helper/vclunohelper.hxx> + + +namespace sfx2 { namespace sidebar { + +namespace +{ + enum PanelComponent + { + PC_TitleBar, + PC_ToolBox, + PC_Content, + PC_None + }; + + PanelComponent GetFocusedComponent (const Panel& rPanel) + { + if (rPanel.HasFocus()) + return PC_Content; + else if (rPanel.GetTitleBar() != NULL) + if (rPanel.GetTitleBar()->HasFocus()) + return PC_TitleBar; + else if (rPanel.GetTitleBar()->GetToolBox().HasFocus()) + return PC_ToolBox; + else + return PC_None; + } +} + + +FocusManager::FocusManager (void) + : maPanels(), + maButtons(), + mpTopLevelWindow(NULL) +{ +} + + + + +FocusManager::~FocusManager (void) +{ + Clear(); +} + + + + +void FocusManager::GrabFocus (void) +{ + if ( ! maPanels.empty()) + FocusPanel(0); +} + + + + +void FocusManager::Clear (void) +{ + ClearPanels(); + ClearButtons(); +} + + + +void FocusManager::ClearPanels (void) +{ + SetTopLevelWindow(NULL); + + ::std::vector<Panel*> aPanels; + aPanels.swap(maPanels); + for (::std::vector<Panel*>::iterator iPanel(aPanels.begin()),iEnd(aPanels.end()); + iPanel!=iEnd; + ++iPanel) + { + UnregisterWindow(**iPanel); + if ((*iPanel)->GetTitleBar() != NULL) + { + UnregisterWindow(*(*iPanel)->GetTitleBar()); + UnregisterWindow((*iPanel)->GetTitleBar()->GetToolBox()); + } + } +} + + + + +void FocusManager::ClearButtons (void) +{ + ::std::vector<Window*> aButtons; + for (::std::vector<Window*>::iterator iButton(aButtons.begin()),iEnd(aButtons.end()); + iButton!=iEnd; + ++iButton) + { + UnregisterWindow(**iButton); + } +} + + + + +void FocusManager::SetPanels (const SharedPanelContainer& rPanels) +{ + ClearPanels(); + for(SharedPanelContainer::const_iterator iPanel(rPanels.begin()),iEnd(rPanels.end()); + iPanel!=iEnd; + ++iPanel) + { + RegisterWindow(**iPanel); + if ((*iPanel)->GetTitleBar() != NULL) + { + RegisterWindow(*(*iPanel)->GetTitleBar()); + RegisterWindow((*iPanel)->GetTitleBar()->GetToolBox()); + } + maPanels.push_back(iPanel->get()); + } + + RegisterTopLevelListener(); +} + + + + +void FocusManager::SetButtons (const ::std::vector<Button*>& rButtons) +{ + ClearButtons(); + for (::std::vector<Button*>::const_iterator iButton(rButtons.begin()),iEnd(rButtons.end()); + iButton!=iEnd; + ++iButton) + { + RegisterWindow(**iButton); + maButtons.push_back(*iButton); + } +} + + + + +void FocusManager::RegisterWindow (Window& rWindow) +{ + rWindow.AddEventListener(LINK(this, FocusManager, WindowEventListener)); +} + + + + +void FocusManager::UnregisterWindow (Window& rWindow) +{ + rWindow.RemoveEventListener(LINK(this, FocusManager, WindowEventListener)); +} + + + + +void FocusManager::RegisterTopLevelListener (void) +{ + if (maPanels.empty()) + return; + Window* pWindow = maPanels.front(); + while (pWindow != NULL && pWindow->GetParent()!=NULL) + { + pWindow = pWindow->GetParent(); + } + SetTopLevelWindow(pWindow); +} + + + + +void FocusManager::SetTopLevelWindow (Window* pWindow) +{ + if (mpTopLevelWindow != pWindow) + { + if (mpTopLevelWindow != NULL) + { + UnregisterWindow(*mpTopLevelWindow); + mpTopLevelWindow->RemoveChildEventListener(LINK(this, FocusManager, WindowEventListener)); + } + mpTopLevelWindow = pWindow; + if (mpTopLevelWindow != NULL) + { + RegisterWindow(*mpTopLevelWindow); + mpTopLevelWindow->AddChildEventListener(LINK(this, FocusManager, WindowEventListener)); + } + } +} + + + + +sal_Int32 FocusManager::GetPanelIndex (const Window& rWindow) const +{ + for (sal_Int32 nIndex=0,nCount(maPanels.size()); nIndex<nCount; ++nIndex) + { + if (maPanels[nIndex] == &rWindow) + return nIndex; + TitleBar* pTitleBar = maPanels[nIndex]->GetTitleBar(); + if (pTitleBar == &rWindow) + return nIndex; + if (pTitleBar!=NULL && &pTitleBar->GetToolBox()==&rWindow) + return nIndex; + } + return -1; +} + + + + +sal_Int32 FocusManager::GetButtonIndex (const Window& rWindow) const +{ + for (sal_Int32 nIndex=0,nCount(maButtons.size()); nIndex<nCount; ++nIndex) + if (maButtons[nIndex] == &rWindow) + return nIndex; + return -1; +} + + + + +bool FocusManager::IsAnyPanelFocused (void) const +{ + for (::std::vector<Panel*>::const_iterator iPanel(maPanels.begin()),iEnd(maPanels.end()); + iPanel!=iEnd; + ++iPanel) + { + if ((*iPanel)->HasFocus()) + return true; + else if ((*iPanel)->HasChildPathFocus()) + return true; + } + return false; +} + + + + +bool FocusManager::IsAnyButtonFocused (void) const +{ + for (::std::vector<Button*>::const_iterator iButton(maButtons.begin()),iEnd(maButtons.end()); + iButton!=iEnd; + ++iButton) + { + if ((*iButton)->HasFocus()) + return true; + } + return false; +} + + + + +void FocusManager::FocusPanel (const sal_Int32 nPanelIndex) +{ + Panel& rPanel (*maPanels[nPanelIndex]); + TitleBar* pTitleBar = rPanel.GetTitleBar(); + if (pTitleBar!=NULL && pTitleBar->IsVisible()) + { + rPanel.SetExpanded(true); + pTitleBar->GrabFocus(); + } + else + FocusPanelContent(nPanelIndex); +} + + + + +void FocusManager::FocusPanelContent (const sal_Int32 nPanelIndex) +{ + Window* pWindow = VCLUnoHelper::GetWindow(maPanels[nPanelIndex]->GetElementWindow()); + if (pWindow != NULL) + pWindow->GrabFocus(); +} + + + + +void FocusManager::FocusButton (const sal_Int32 nButtonIndex) +{ + maButtons[nButtonIndex]->GrabFocus(); + maButtons[nButtonIndex]->Invalidate(); +} + + + + +void FocusManager::ClickButton (const sal_Int32 nButtonIndex) +{ + maButtons[nButtonIndex]->Click(); + if (nButtonIndex > 0) + if ( ! maPanels.empty()) + FocusPanel(0); + maButtons[nButtonIndex]->GetParent()->Invalidate(); +} + + + + +void FocusManager::RemoveWindow (Window& rWindow) +{ + ::std::vector<Panel*>::iterator iPanel (::std::find(maPanels.begin(), maPanels.end(), &rWindow)); + if (iPanel != maPanels.end()) + { + UnregisterWindow(rWindow); + if ((*iPanel)->GetTitleBar() != NULL) + { + UnregisterWindow(*(*iPanel)->GetTitleBar()); + UnregisterWindow((*iPanel)->GetTitleBar()->GetToolBox()); + } + maPanels.erase(iPanel); + return; + } + + ::std::vector<Button*>::iterator iButton (::std::find(maButtons.begin(), maButtons.end(), &rWindow)); + if (iButton != maButtons.end()) + { + UnregisterWindow(rWindow); + maButtons.erase(iButton); + return; + } +} + + + + +bool FocusManager::MoveFocusInsidePanel ( + const sal_Int32 nPanelIndex, + const sal_Int32 nDirection) +{ + Panel& rPanel (*maPanels[nPanelIndex]); + switch (GetFocusedComponent(rPanel)) + { + case PC_TitleBar: + if (nDirection > 0) + rPanel.GetTitleBar()->GetToolBox().GrabFocus(); + else + FocusPanelContent(nPanelIndex); + return true; + + case PC_ToolBox: + if (nDirection > 0) + FocusPanelContent(nPanelIndex); + else + rPanel.GetTitleBar()->GrabFocus(); + return true; + + default: + return false; + } +} + + + + +long FocusManager::NotifyDockingWindowEvent (const KeyEvent& rKeyEvent) +{ + switch(rKeyEvent.GetKeyCode().GetCode()) + { + case KEY_F6: + if (rKeyEvent.GetKeyCode().IsShift()) + { + if (IsAnyButtonFocused()) + { + FocusPanel(0); + return 1; + } + } + else + { + if (IsAnyPanelFocused()) + { + FocusButton(0); + return 1; + } + } + break; + } + return 0; +} + + + + +void FocusManager::HandleKeyEvent ( + const KeyCode& rKeyCode, + const Window& rWindow) +{ + if (rKeyCode.GetModifier() != 0) + return; + + const sal_Int32 nPanelIndex (GetPanelIndex(rWindow)); + const bool bIsPanelTitleFocused (nPanelIndex>=0 && maPanels[nPanelIndex] != &rWindow); + const bool bIsPanelToolBoxFocused (nPanelIndex>=0 && maPanels[nPanelIndex] != &rWindow); + sal_Int32 nButtonIndex (nPanelIndex==-1 ? GetButtonIndex(rWindow) : -1); + + switch (rKeyCode.GetCode()) + { + case KEY_F6: + if (nPanelIndex >= 0) + FocusButton(0); + else + return; + break; + + case KEY_SPACE: + if (nPanelIndex >= 0) + { + if (GetFocusedComponent(*maPanels[nPanelIndex]) == PC_TitleBar) + { + // Toggle the expansion state. + maPanels[nPanelIndex]->SetExpanded( ! maPanels[nPanelIndex]->IsExpanded()); + } + } + else if (nButtonIndex >= 0) + { + // Activate the button. + ClickButton(nButtonIndex); + } + return; + + case KEY_RETURN: + if (nPanelIndex >= 0) + { + if (GetFocusedComponent(*maPanels[nPanelIndex]) == PC_TitleBar) + { + // Enter the panel. + FocusPanelContent(nPanelIndex); + } + } + else if (nButtonIndex >= 0) + { + // Activate the button. + ClickButton(nButtonIndex); + } + return; + + case KEY_TAB: + if (nPanelIndex >= 0) + { + if (rKeyCode.IsShift()) + MoveFocusInsidePanel(nPanelIndex, -1); + else + MoveFocusInsidePanel(nPanelIndex, +1); + } + break; + + case KEY_LEFT: + case KEY_UP: + // Go to previous element in focus ring. + if (nPanelIndex >= 0) + { + FocusPanel((nPanelIndex + maPanels.size() - 1) % maPanels.size()); + } + else if (nButtonIndex >= 0) + { + FocusButton((nButtonIndex + maButtons.size() - 1) % maButtons.size()); + } + break; + + case KEY_RIGHT: + case KEY_DOWN: + // Go to next element in focus ring. + if (nPanelIndex >= 0) + { + FocusPanel((nPanelIndex + 1) % maPanels.size()); + } + else if (nButtonIndex >= 0) + { + FocusButton((nButtonIndex + 1) % maButtons.size()); + } + break; + } +} + + + + +void FocusManager::HandleTopLevelEvent (VclWindowEvent& rEvent) +{ + switch (rEvent.GetId()) + { + case VCLEVENT_WINDOW_KEYINPUT: + { + KeyEvent* pKeyEvent = static_cast<KeyEvent*>(rEvent.GetData()); + switch (pKeyEvent->GetKeyCode().GetCode()) + { + case KEY_F6: + OSL_TRACE(""); + break; + } + } + } +} + + + + +IMPL_LINK(FocusManager, WindowEventListener, VclSimpleEvent*, pEvent) +{ + if (pEvent == NULL) + return 0; + + if ( ! pEvent->ISA(VclWindowEvent)) + return 0; + + VclWindowEvent* pWindowEvent = static_cast<VclWindowEvent*>(pEvent); + Window* pSource = pWindowEvent->GetWindow(); + if (pSource == NULL) + return 0; + + if (pSource == mpTopLevelWindow) + HandleTopLevelEvent(*pWindowEvent); + else + switch (pWindowEvent->GetId()) + { + case VCLEVENT_WINDOW_KEYINPUT: + { + KeyEvent* pKeyEvent = static_cast<KeyEvent*>(pWindowEvent->GetData()); + HandleKeyEvent(pKeyEvent->GetKeyCode(), *pSource); + return 1; + } + + case VCLEVENT_OBJECT_DYING: + RemoveWindow(*pSource); + return 1; + + case VCLEVENT_WINDOW_GETFOCUS: + case VCLEVENT_WINDOW_LOSEFOCUS: + pSource->Invalidate(); + } + return 0; +} + + + +} } // end of namespace sfx2::sidebar Added: openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.hxx?rev=1463459&view=auto ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.hxx (added) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/FocusManager.hxx Tue Apr 2 09:22:29 2013 @@ -0,0 +1,112 @@ +/************************************************************** + * + * 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. + * + *************************************************************/ + +#ifndef SFX_SIDEBAR_FOCUS_MANAGER_HXX +#define SFX_SIDEBAR_FOCUS_MANAGER_HXX + +#include "Panel.hxx" +#include <tools/link.hxx> + +class Button; +class KeyCode; +class VclSimpleEvent; + +namespace sfx2 { namespace sidebar { + +/** Concentrate all focus handling in this class. + There are two rings of windows that accept the input focus: panels + and tab bar buttons. + Arrow keys move the focus between them. Tab moves focus between rings. +*/ +class FocusManager +{ +public: + FocusManager (void); + ~FocusManager (void); + + /** Forget all panels and buttons. Remove all window listeners. + */ + void Clear (void); + + /** Transfer the focus into the sidebar tree of windows. This is + typically called from the SidebarChildWindow as result of + pressing the F6 key. + */ + void GrabFocus (void); + + /** Handle the key event that was sent to the docking window. + */ + long NotifyDockingWindowEvent (const KeyEvent& rKeyEvent); + + void SetPanels (const SharedPanelContainer& rPanels); + + void SetButtons (const ::std::vector<Button*>& rButtons); + +private: + ::std::vector<Panel*> maPanels; + ::std::vector<Button*> maButtons; + Window* mpTopLevelWindow; + + /** Listen for key events for panels and buttons. + */ + DECL_LINK(WindowEventListener, VclSimpleEvent*); + + void ClearPanels (void); + void ClearButtons (void); + + /** Let the focus manager listen for window events for the given + window. + */ + void RegisterWindow (Window& rWindow); + void UnregisterWindow (Window& rWindow); + void RegisterTopLevelListener (void); + + /** Remove the window from the panel or the button container. + */ + void RemoveWindow (Window& rWindow); + + sal_Int32 GetPanelIndex (const Window& rWindow) const; + sal_Int32 GetButtonIndex (const Window& rWindow) const; + bool IsAnyPanelFocused (void) const; + bool IsAnyButtonFocused (void) const; + + /** Set the focus to the title bar of the panel or, if the the + title bar is not visible, directly to the panel. + */ + void FocusPanel (const sal_Int32 nPanelIndex); + void FocusPanelContent (const sal_Int32 nPanelIndex); + void FocusButton (const sal_Int32 nButtonIndex); + void ClickButton (const sal_Int32 nButtonIndex); + bool MoveFocusInsidePanel ( + const sal_Int32 nPanelIndex, + const sal_Int32 nDirection); + + void HandleKeyEvent ( + const KeyCode& rKeyCode, + const Window& rWindow); + + void SetTopLevelWindow (Window* pWindow); + void HandleTopLevelEvent (VclWindowEvent& rEvent); +}; + +} } // end of namespace sfx2::sidebar + +#endif Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/MenuButton.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/MenuButton.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/MenuButton.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/MenuButton.cxx Tue Apr 2 09:22:29 2013 @@ -25,6 +25,7 @@ #include "DrawHelper.hxx" #include "Paint.hxx" +#include "Tools.hxx" #include "sfx2/sidebar/Theme.hxx" using namespace ::com::sun::star; @@ -39,6 +40,9 @@ MenuButton::MenuButton (Window* pParentW mbIsLeftButtonDown(false), mePaintType(PT_Theme) { +#ifdef DEBUG + SetText(A2S("MenuButton")); +#endif } @@ -59,13 +63,15 @@ void MenuButton::Paint (const Rectangle& default: { const bool bIsSelected (IsChecked()); - const bool bIsMouseOver (IsMouseOver()); + const bool bIsHighlighted (IsMouseOver() || HasFocus()); DrawHelper::DrawRoundedRectangle( *this, Rectangle(Point(0,0), GetSizePixel()), - 2, - bIsMouseOver||bIsSelected ? Theme::GetColor(Theme::Color_TabItemBorder) : Color(0xffffffff), - bIsMouseOver + 3, + bIsHighlighted||bIsSelected + ? Theme::GetColor(Theme::Color_TabItemBorder) + : Color(0xffffffff), + bIsHighlighted ? Theme::GetPaint(Theme::Paint_TabItemBackgroundHighlight) : Theme::GetPaint(Theme::Paint_TabItemBackgroundNormal)); Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/Panel.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/Panel.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/Panel.hxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/Panel.hxx Tue Apr 2 09:22:29 2013 @@ -58,6 +58,7 @@ public: bool IsTitleBarOptional (void) const; void SetUIElement (const cssu::Reference<css::ui::XUIElement>& rxElement); cssu::Reference<css::ui::XSidebarPanel> GetPanelComponent (void) const; + cssu::Reference<css::awt::XWindow> GetElementWindow (void); void SetExpanded (const bool bIsExpanded); bool IsExpanded (void) const; bool HasIdPredicate (const ::rtl::OUString& rsId) const; @@ -79,8 +80,6 @@ private: bool mbIsExpanded; const ::boost::function<void(void)> maDeckLayoutTrigger; Rectangle maBoundingBox; - - cssu::Reference<css::awt::XWindow> GetElementWindow (void); }; typedef ::boost::shared_ptr<Panel> SharedPanel; typedef ::std::vector<SharedPanel> SharedPanelContainer; Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.cxx Tue Apr 2 09:22:29 2013 @@ -136,6 +136,8 @@ SidebarController::~SidebarController (v void SAL_CALL SidebarController::disposing (void) { + maFocusManager.Clear(); + cssu::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer ( css::ui::ContextChangeEventMultiplexer::get( ::comphelper::getProcessComponentContext())); @@ -353,6 +355,8 @@ void SidebarController::SwitchToDeck ( const DeckDescriptor& rDeckDescriptor, const Context& rContext) { + maFocusManager.Clear(); + if ( ! msCurrentDeckId.equals(rDeckDescriptor.msId)) { // When the deck changes then destroy the deck and all panels @@ -480,6 +484,11 @@ void SidebarController::SwitchToDeck ( if (bHasPanelSetChanged) NotifyResize(); + + // Tell the focus manager about the new panels and tab bar + // buttons. + maFocusManager.SetPanels(aNewPanels); + mpTabBar->UpdateFocusManager(maFocusManager); } @@ -843,6 +852,14 @@ void SidebarController::OpenDeck (void) +FocusManager& SidebarController::GetFocusManager (void) +{ + return maFocusManager; +} + + + + bool SidebarController::CanModifyChildWindowWidth (void) const { SfxSplitWindow* pSplitWindow = dynamic_cast<SfxSplitWindow*>(mpParentWindow->GetParent()); Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.hxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarController.hxx Tue Apr 2 09:22:29 2013 @@ -22,11 +22,12 @@ #ifndef SFX_SIDEBAR_CONTROLLER_HXX #define SFX_SIDEBAR_CONTROLLER_HXX -#include "ResourceManager.hxx" #include "AsynchronousCall.hxx" -#include "TabBar.hxx" #include "Context.hxx" +#include "FocusManager.hxx" #include "Panel.hxx" +#include "ResourceManager.hxx" +#include "TabBar.hxx" #include <vcl/menu.hxx> @@ -102,6 +103,8 @@ public: */ void OpenDeck (void); + FocusManager& GetFocusManager (void); + private: ::boost::scoped_ptr<Deck> mpCurrentDeck; SidebarDockingWindow* mpParentWindow; @@ -116,6 +119,7 @@ private: so that it can be restored when the deck is reopended. */ sal_Int32 mnSavedSidebarWidth; + FocusManager maFocusManager; DECL_LINK(WindowEventHandler, VclWindowEvent*); void UpdateConfigurations (const Context& rContext); Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.cxx Tue Apr 2 09:22:29 2013 @@ -78,7 +78,32 @@ void SidebarDockingWindow::DoDispose (vo void SidebarDockingWindow::GetFocus() { - SfxDockingWindow::GetFocus(); + mpSidebarController->GetFocusManager().GrabFocus(); +} + + + + +long SidebarDockingWindow::PreNotify (NotifyEvent& rEvent) +{ + switch (rEvent.GetType()) + { + case EVENT_KEYINPUT: + { + const KeyEvent* pKeyEvent = rEvent.GetKeyEvent(); + if (pKeyEvent != NULL) + return mpSidebarController->GetFocusManager().NotifyDockingWindowEvent(*pKeyEvent); + else + break; + } + + case EVENT_GETFOCUS: + OSL_TRACE(""); + break; + + } + + return SfxDockingWindow::PreNotify(rEvent); } Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.hxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/SidebarDockingWindow.hxx Tue Apr 2 09:22:29 2013 @@ -52,6 +52,7 @@ public: protected: // Window overridables virtual void GetFocus (void); + virtual long PreNotify (NotifyEvent& rEvent); private: ::rtl::Reference<sfx2::sidebar::SidebarController> mpSidebarController; Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.cxx Tue Apr 2 09:22:29 2013 @@ -28,6 +28,7 @@ #include "Paint.hxx" #include "sfx2/sidebar/Theme.hxx" #include "Tools.hxx" +#include "FocusManager.hxx" #include <vcl/gradient.hxx> #include <vcl/image.hxx> @@ -52,7 +53,7 @@ TabBar::TabBar ( const Reference<frame::XFrame>& rxFrame, const ::boost::function<void(const ::rtl::OUString&)>& rDeckActivationFunctor, const PopupMenuProvider& rPopupMenuProvider) - : Window(pParentWindow), + : Window(pParentWindow, WB_DIALOGCONTROL), mxFrame(rxFrame), mpMenuButton(ControlFactory::CreateMenuButton(this)), maItems(), @@ -339,6 +340,25 @@ void TabBar::RestoreHideFlags (void) +void TabBar::UpdateFocusManager (FocusManager& rFocusManager) +{ + ::std::vector<Button*> aButtons; + aButtons.reserve(maItems.size()+1); + + aButtons.push_back(mpMenuButton.get()); + for(ItemContainer::const_iterator + iItem(maItems.begin()), iEnd(maItems.end()); + iItem!=iEnd; + ++iItem) + { + aButtons.push_back(iItem->mpButton.get()); + } + rFocusManager.SetButtons(aButtons); +} + + + + IMPL_LINK(TabBar, OnToolboxClicked, void*, EMPTYARG) { ::std::vector<DeckMenuData> aSelectionData; Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.hxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/TabBar.hxx Tue Apr 2 09:22:29 2013 @@ -42,6 +42,7 @@ namespace cssu = ::com::sun::star::uno; namespace sfx2 { namespace sidebar { +class FocusManager; class TabBarConfiguration; class TabItem; @@ -84,7 +85,9 @@ public: const ::rtl::OUString GetDeckIdForIndex (const sal_Int32 nIndex) const; void ToggleHideFlag (const sal_Int32 nIndex); void RestoreHideFlags (void); - + + void UpdateFocusManager (FocusManager& rFocusManager); + private: cssu::Reference<css::frame::XFrame> mxFrame; ::boost::scoped_ptr<Button> mpMenuButton; Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/TabItem.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/TabItem.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/TabItem.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/TabItem.cxx Tue Apr 2 09:22:29 2013 @@ -41,6 +41,7 @@ TabItem::TabItem (Window* pParentWindow) mbIsLeftButtonDown(false), mePaintType(PT_Theme) { + SetStyle(GetStyle() | WB_TABSTOP | WB_DIALOGCONTROL | WB_NOPOINTERFOCUS); SetBackground(Theme::GetPaint(Theme::Paint_TabBarBackground).GetWallpaper()); #ifdef DEBUG SetText(A2S("TabItem")); @@ -59,19 +60,22 @@ TabItem::~TabItem (void) void TabItem::Paint (const Rectangle& rUpdateArea) { + OSL_TRACE("TabItem::Paint"); switch(mePaintType) { case PT_Theme: default: { const bool bIsSelected (IsChecked()); - const bool bIsMouseOver (IsMouseOver()); + const bool bIsHighlighted (IsMouseOver() || HasFocus()); DrawHelper::DrawRoundedRectangle( *this, Rectangle(Point(0,0), GetSizePixel()), - 2, - bIsMouseOver||bIsSelected ? Theme::GetColor(Theme::Color_TabItemBorder) : Color(0xffffffff), - bIsMouseOver + 3, + bIsHighlighted||bIsSelected + ? Theme::GetColor(Theme::Color_TabItemBorder) + : Color(0xffffffff), + bIsHighlighted ? Theme::GetPaint(Theme::Paint_TabItemBackgroundHighlight) : Theme::GetPaint(Theme::Paint_TabItemBackgroundNormal)); @@ -109,18 +113,12 @@ void TabItem::MouseMove (const MouseEven void TabItem::MouseButtonDown (const MouseEvent& rMouseEvent) { -#if 0 - Hide(); - ImageRadioButton::MouseButtonDown(rMouseEvent); - Show(); -#else if (rMouseEvent.IsLeft()) { mbIsLeftButtonDown = true; CaptureMouse(); Invalidate(); } -#endif } @@ -128,11 +126,6 @@ void TabItem::MouseButtonDown (const Mou void TabItem::MouseButtonUp (const MouseEvent& rMouseEvent) { -#if 0 - Hide(); - ImageRadioButton::MouseButtonUp(rMouseEvent); - Show(); -#else if (IsMouseCaptured()) ReleaseMouse(); @@ -150,7 +143,6 @@ void TabItem::MouseButtonUp (const Mouse mbIsLeftButtonDown = false; Invalidate(); } -#endif } Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.cxx Tue Apr 2 09:22:29 2013 @@ -26,6 +26,7 @@ #include <tools/svborder.hxx> #include <vcl/gradient.hxx> +#include <vcl/lineinfo.hxx> ToolbarValue::~ToolbarValue (void) {} @@ -69,7 +70,7 @@ void TitleBar::Paint (const Rectangle& r (void)rUpdateArea; // Paint title bar background. - Size aWindowSize( GetOutputSizePixel() ); + Size aWindowSize (GetOutputSizePixel()); Rectangle aTitleBarBox( 0, 0, @@ -78,7 +79,10 @@ void TitleBar::Paint (const Rectangle& r ); PaintDecoration(aTitleBarBox); - PaintTitle(GetTitleArea(aTitleBarBox)); + const Rectangle aTitleBox (GetTitleArea(aTitleBarBox)); + PaintTitle(aTitleBox); + if (HasFocus()) + PaintFocus(aTitleBox); } @@ -112,6 +116,14 @@ void TitleBar::SetPosSizePixel ( +ToolBox& TitleBar::GetToolBox (void) +{ + return maToolBox; +} + + + + void TitleBar::HandleToolBoxItemClick (const sal_uInt16 nItemIndex) { (void)nItemIndex; @@ -125,9 +137,7 @@ void TitleBar::PaintTitle (const Rectang { Push(PUSH_FONT | PUSH_TEXTCOLOR); - // Use a bold font for the deck title. Font aFont(GetFont()); - aFont.SetWeight(WEIGHT_BOLD); SetFont(aFont); // Paint title bar text. @@ -136,7 +146,38 @@ void TitleBar::PaintTitle (const Rectang rTitleBox, msTitle, TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER); + + Pop(); +} + + + + +void TitleBar::PaintFocus (const Rectangle& rFocusBox) +{ + Push(PUSH_FONT | PUSH_TEXTCOLOR | PUSH_LINECOLOR | PUSH_FILLCOLOR); + + const Rectangle aTextBox ( + GetTextRect( + rFocusBox, + msTitle, + TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER)); + const Rectangle aLargerTextBox ( + aTextBox.Left() - 2, + aTextBox.Top() - 2, + aTextBox.Right() + 2, + aTextBox.Bottom() + 2); + + LineInfo aDottedStyle (LINE_DASH); + aDottedStyle.SetDashCount(0); + aDottedStyle.SetDotCount(1); + aDottedStyle.SetDotLen(1); + aDottedStyle.SetDistance(1); + SetFillColor(); + SetLineColor(COL_BLACK); + DrawPolyLine(Polygon(aLargerTextBox), aDottedStyle); + Pop(); } Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.hxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/TitleBar.hxx Tue Apr 2 09:22:29 2013 @@ -51,11 +51,14 @@ public: long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL); + ToolBox& GetToolBox (void); + protected: ToolBox maToolBox; virtual Rectangle GetTitleArea (const Rectangle& rTitleBarBox) = 0; virtual void PaintDecoration (const Rectangle& rTitleBarBox) = 0; + virtual void PaintFocus (const Rectangle& rFocusBox); virtual sidebar::Paint GetBackgroundPaint (void) = 0; virtual Color GetTextColor (void) = 0; virtual void HandleToolBoxItemClick (const sal_uInt16 nItemIndex); Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/ToolBoxBackground.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/ToolBoxBackground.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/ToolBoxBackground.cxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/ToolBoxBackground.cxx Tue Apr 2 09:22:29 2013 @@ -35,7 +35,7 @@ namespace sfx2 { namespace sidebar { ToolBoxBackground::ToolBoxBackground (Window* pParentWindow) - : Window(pParentWindow), + : Window(pParentWindow, WB_DIALOGCONTROL), maPadding(Tools::RectangleToSvBorder(Theme::GetRectangle(Theme::Rect_ToolBoxPadding))) { SetBackground(Theme::GetPaint(Theme::Paint_ToolBoxBackground).GetWallpaper()); Modified: openoffice/branches/sidebar/main/sfx2/source/sidebar/Tools.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/sfx2/source/sidebar/Tools.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/sfx2/source/sidebar/Tools.hxx (original) +++ openoffice/branches/sidebar/main/sfx2/source/sidebar/Tools.hxx Tue Apr 2 09:22:29 2013 @@ -31,7 +31,7 @@ #define A2S(s) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))) -#define S2A(s) OUStringToOString(s, RTL_TEXTENCODING_ASCII_US).getStr() +#define S2A(s) rtl::OUStringToOString(s, RTL_TEXTENCODING_ASCII_US).getStr() namespace css = ::com::sun::star; namespace cssu = ::com::sun::star::uno; Modified: openoffice/branches/sidebar/main/svx/inc/GalleryControl.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/svx/inc/GalleryControl.hxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/svx/inc/GalleryControl.hxx (original) +++ openoffice/branches/sidebar/main/svx/inc/GalleryControl.hxx Tue Apr 2 09:22:29 2013 @@ -48,6 +48,8 @@ public: Window* pParentWindow); virtual ~GalleryControl (void); + sal_Bool KeyInput( const KeyEvent& rKEvt, Window* pWindow); + private: Gallery* mpGallery; ::boost::scoped_ptr<GallerySplitter> mpSplitter; @@ -71,7 +73,6 @@ protected: Graphic GetGraphic (void) const; sal_Bool GetVCDrawModel (FmFormModel& rModel) const; sal_Bool IsLinkage (void) const; - sal_Bool KeyInput( const KeyEvent& rKEvt, Window* pWindow); }; } } // end of namespace svx::sidebar Modified: openoffice/branches/sidebar/main/svx/source/gallery2/galbrws2.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/sidebar/main/svx/source/gallery2/galbrws2.cxx?rev=1463459&r1=1463458&r2=1463459&view=diff ============================================================================== --- openoffice/branches/sidebar/main/svx/source/gallery2/galbrws2.cxx (original) +++ openoffice/branches/sidebar/main/svx/source/gallery2/galbrws2.cxx Tue Apr 2 09:22:29 2013 @@ -53,6 +53,7 @@ #include <svx/dialmgr.hxx> #include <svx/svxdlg.hxx> #include <svx/dialogs.hrc> +#include "GalleryControl.hxx" // ----------- // - Defines - @@ -331,7 +332,7 @@ GalleryBrowser2::GalleryBrowser2( Window mbCurActionIsLinkage( sal_False ) { DBG_CTOR(GalleryBrowser2,NULL); - + Image aDummyImage; const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) ); Font aInfoFont( maInfoBar.GetControlFont() ); @@ -574,7 +575,16 @@ sal_Bool GalleryBrowser2::KeyInput( cons { Point aSelPos; const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos ); - sal_Bool bRet = static_cast< GalleryBrowser* >( GetParent() )->KeyInput( rKEvt, pWindow ); + GalleryBrowser* pParentBrowser = dynamic_cast<GalleryBrowser*>(GetParent()); + sal_Bool bRet = sal_False; + if (pParentBrowser != NULL) + bRet = pParentBrowser->KeyInput( rKEvt, pWindow ); + else + { + svx::sidebar::GalleryControl* pParentControl = dynamic_cast<svx::sidebar::GalleryControl*>(GetParent()); + if (pParentControl != NULL) + bRet = pParentControl->KeyInput(rKEvt, pWindow); + } if( !bRet && !maViewBox.HasFocus() && nItemId && mpCurTheme ) {