Files
libreoffice/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx
2010-01-28 13:00:30 +01:00

361 lines
8.9 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: SlsFocusManager.cxx,v $
* $Revision: 1.14 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#include "precompiled_sd.hxx"
#include "controller/SlsFocusManager.hxx"
#include "SlideSorter.hxx"
#include "PaneDockingWindow.hxx"
#include "controller/SlideSorterController.hxx"
#include "controller/SlsSelectionManager.hxx"
#include "model/SlideSorterModel.hxx"
#include "model/SlsPageDescriptor.hxx"
#include "view/SlideSorterView.hxx"
#include "view/SlsLayouter.hxx"
#include <vcl/toolbox.hxx>
#include "Window.hxx"
#include "sdpage.hxx"
namespace sd { namespace slidesorter { namespace controller {
FocusManager::FocusManager (SlideSorter& rSlideSorter)
: mrSlideSorter(rSlideSorter),
mnPageIndex(0),
mbPageIsFocused(false)
{
if (mrSlideSorter.GetModel().GetPageCount() > 0)
mnPageIndex = 0;
}
FocusManager::~FocusManager (void)
{
}
void FocusManager::MoveFocus (FocusMoveDirection eDirection)
{
if (mnPageIndex >= 0 && mbPageIsFocused)
{
HideFocusIndicator (GetFocusedPageDescriptor());
int nColumnCount (mrSlideSorter.GetView().GetLayouter().GetColumnCount());
switch (eDirection)
{
case FMD_NONE:
if (mnPageIndex >= mrSlideSorter.GetModel().GetPageCount())
mnPageIndex = mrSlideSorter.GetModel().GetPageCount() - 1;
break;
case FMD_LEFT:
mnPageIndex -= 1;
if (mnPageIndex < 0)
{
mnPageIndex = mrSlideSorter.GetModel().GetPageCount() - 1;
SetFocusToToolBox();
}
break;
case FMD_RIGHT:
mnPageIndex += 1;
if (mnPageIndex >= mrSlideSorter.GetModel().GetPageCount())
{
mnPageIndex = 0;
SetFocusToToolBox();
}
break;
case FMD_UP:
{
int nColumn = mnPageIndex % nColumnCount;
mnPageIndex -= nColumnCount;
if (mnPageIndex < 0)
{
// Wrap arround to the bottom row or the one above and
// go to the correct column.
int nCandidate = mrSlideSorter.GetModel().GetPageCount()-1;
int nCandidateColumn = nCandidate % nColumnCount;
if (nCandidateColumn > nColumn)
mnPageIndex = nCandidate - (nCandidateColumn-nColumn);
else if (nCandidateColumn < nColumn)
mnPageIndex = nCandidate
- nColumnCount
+ (nColumn - nCandidateColumn);
else
mnPageIndex = nCandidate;
}
}
break;
case FMD_DOWN:
{
int nColumn = mnPageIndex % nColumnCount;
mnPageIndex += nColumnCount;
if (mnPageIndex >= mrSlideSorter.GetModel().GetPageCount())
{
// Wrap arround to the correct column.
mnPageIndex = nColumn;
}
}
break;
}
if (mbPageIsFocused)
ShowFocusIndicator(GetFocusedPageDescriptor(), true);
}
}
void FocusManager::ShowFocus (const bool bScrollToFocus)
{
mbPageIsFocused = true;
ShowFocusIndicator(GetFocusedPageDescriptor(), bScrollToFocus);
}
void FocusManager::HideFocus (void)
{
mbPageIsFocused = false;
HideFocusIndicator(GetFocusedPageDescriptor());
}
bool FocusManager::ToggleFocus (void)
{
if (mnPageIndex >= 0)
{
if (mbPageIsFocused)
HideFocus ();
else
ShowFocus ();
}
return mbPageIsFocused;
}
bool FocusManager::HasFocus (void) const
{
return mrSlideSorter.GetContentWindow()->HasFocus();
}
model::SharedPageDescriptor FocusManager::GetFocusedPageDescriptor (void) const
{
return mrSlideSorter.GetModel().GetPageDescriptor(mnPageIndex);
}
sal_Int32 FocusManager::GetFocusedPageIndex (void) const
{
return mnPageIndex;
}
void FocusManager::FocusPage (sal_Int32 nPageIndex)
{
if (nPageIndex != mnPageIndex)
{
// Hide the focus while switching it to the specified page.
FocusHider aHider (*this);
mnPageIndex = nPageIndex;
}
if (HasFocus() && !IsFocusShowing())
ShowFocus();
}
void FocusManager::SetFocusedPage (const model::SharedPageDescriptor& rpDescriptor)
{
if (rpDescriptor.get() != NULL)
{
FocusHider aFocusHider (*this);
mnPageIndex = (rpDescriptor->GetPage()->GetPageNum()-1)/2;
}
}
void FocusManager::SetFocusedPage (sal_Int32 nPageIndex)
{
FocusHider aFocusHider (*this);
mnPageIndex = nPageIndex;
}
bool FocusManager::IsFocusShowing (void) const
{
return HasFocus() && mbPageIsFocused;
}
void FocusManager::HideFocusIndicator (const model::SharedPageDescriptor& rpDescriptor)
{
if (rpDescriptor.get() != NULL)
{
mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, false);
}
}
void FocusManager::ShowFocusIndicator (
const model::SharedPageDescriptor& rpDescriptor,
const bool bScrollToFocus)
{
if (rpDescriptor.get() != NULL)
{
mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, true);
if (bScrollToFocus)
{
// Scroll the focused page object into the visible area and repaint
// it, so that the focus indicator becomes visible.
mrSlideSorter.GetController().GetSelectionManager()->MakeRectangleVisible (
GetFocusedPageDescriptor()->GetBoundingBox());
}
mrSlideSorter.GetView().RequestRepaint (rpDescriptor);
NotifyFocusChangeListeners();
}
}
void FocusManager::AddFocusChangeListener (const Link& rListener)
{
if (::std::find (maFocusChangeListeners.begin(), maFocusChangeListeners.end(), rListener)
== maFocusChangeListeners.end())
{
maFocusChangeListeners.push_back (rListener);
}
}
void FocusManager::RemoveFocusChangeListener (const Link& rListener)
{
maFocusChangeListeners.erase (
::std::find (maFocusChangeListeners.begin(), maFocusChangeListeners.end(), rListener));
}
void FocusManager::SetFocusToToolBox (void)
{
HideFocus();
if (mrSlideSorter.GetViewShell() != NULL)
{
::Window* pParentWindow = mrSlideSorter.GetViewShell()->GetParentWindow();
DockingWindow* pDockingWindow = NULL;
while (pParentWindow!=NULL && pDockingWindow==NULL)
{
pDockingWindow = dynamic_cast<DockingWindow*>(pParentWindow);
pParentWindow = pParentWindow->GetParent();
}
if (pDockingWindow)
{
PaneDockingWindow* pPaneDockingWindow = dynamic_cast<PaneDockingWindow*>(pDockingWindow);
if (pPaneDockingWindow != NULL)
pPaneDockingWindow->GetTitleToolBox()->GrabFocus();
}
}
}
void FocusManager::NotifyFocusChangeListeners (void) const
{
// Create a copy of the listener list to be safe when that is modified.
::std::vector<Link> aListeners (maFocusChangeListeners);
// Tell the slection change listeners that the selection has changed.
::std::vector<Link>::iterator iListener (aListeners.begin());
::std::vector<Link>::iterator iEnd (aListeners.end());
for (; iListener!=iEnd; ++iListener)
{
iListener->Call(NULL);
}
}
FocusManager::FocusHider::FocusHider (FocusManager& rManager)
: mbFocusVisible(rManager.IsFocusShowing())
, mrManager(rManager)
{
mrManager.HideFocus();
}
FocusManager::FocusHider::~FocusHider (void)
{
if (mbFocusVisible)
mrManager.ShowFocus();
}
} } } // end of namespace ::sd::slidesorter::controller