INTEGRATION: CWS impress2 (1.1.2); FILE ADDED
2004/07/01 17:01:55 af 1.1.2.11: #i22705# Fixed signature of frameAction(). 2004/07/01 11:21:56 af 1.1.2.10: #i22705# Added mxFrameWeak member. 2004/06/24 08:39:28 af 1.1.2.9: #i22705# Guarding disposing() code with flags that indicate to which objects the listener is still connected. 2004/06/22 11:15:37 af 1.1.2.8: #i22705# Added base class XFrameActionListener. Factored out ConnectToController() and DisconnectFromController(). 2004/06/06 12:53:49 af 1.1.2.7: #i22705# Removed commented out lines that are not needed anymore. 2004/06/06 09:11:02 af 1.1.2.6: #i22705# Removed references to the TextLogger debug utility. 2004/06/05 14:27:43 af 1.1.2.5: #i22705# Checking in disposing() for missing document. 2004/05/05 12:22:27 af 1.1.2.4: #i22705# (last commit was an accident) Empty line added. 2004/05/05 11:04:01 af 1.1.2.3: #i22705#lidesorter\controller\SlideSorterController.cxx 2004/03/02 10:02:13 af 1.1.2.2: #i22705# Removed inclusion of SubShellManagerInterface,hxx which does not exist anymore. 2004/02/13 12:20:27 af 1.1.2.1: #i22705# Initial revision.
This commit is contained in:
475
sd/source/ui/slidesorter/controller/SlsListener.cxx
Normal file
475
sd/source/ui/slidesorter/controller/SlsListener.cxx
Normal file
@@ -0,0 +1,475 @@
|
||||
/*************************************************************************
|
||||
*
|
||||
* $RCSfile: SlsListener.cxx,v $
|
||||
*
|
||||
* $Revision: 1.2 $
|
||||
*
|
||||
* last change: $Author: rt $ $Date: 2004-07-13 14:14:22 $
|
||||
*
|
||||
* The Contents of this file are made available subject to the terms of
|
||||
* either of the following licenses
|
||||
*
|
||||
* - GNU Lesser General Public License Version 2.1
|
||||
* - Sun Industry Standards Source License Version 1.1
|
||||
*
|
||||
* Sun Microsystems Inc., October, 2000
|
||||
*
|
||||
* GNU Lesser General Public License Version 2.1
|
||||
* =============================================
|
||||
* Copyright 2000 by Sun Microsystems, Inc.
|
||||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* This library 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 for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
* Sun Industry Standards Source License Version 1.1
|
||||
* =================================================
|
||||
* The contents of this file are subject to the Sun Industry Standards
|
||||
* Source License Version 1.1 (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.openoffice.org/license.html.
|
||||
*
|
||||
* Software provided under this License is provided on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
||||
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
||||
* See the License for the specific provisions governing your rights and
|
||||
* obligations concerning the Software.
|
||||
*
|
||||
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
||||
*
|
||||
* Copyright: 2000 by Sun Microsystems, Inc.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): _______________________________________
|
||||
*
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#include "SlsListener.hxx"
|
||||
|
||||
#include "SlideSorterViewShell.hxx"
|
||||
#include "controller/SlideSorterController.hxx"
|
||||
#include "controller/SlsPageSelector.hxx"
|
||||
#include "model/SlideSorterModel.hxx"
|
||||
#include "view/SlideSorterView.hxx"
|
||||
#include "drawdoc.hxx"
|
||||
|
||||
#include "glob.hrc"
|
||||
|
||||
#ifndef SD_VIEW_SHELL_BASE_HXX
|
||||
#include "ViewShellBase.hxx"
|
||||
#endif
|
||||
#ifndef SD_VIEW_SHELL_MANAGER_HXX
|
||||
#include "ViewShellManager.hxx"
|
||||
#endif
|
||||
#include "FrameView.hxx"
|
||||
|
||||
#ifndef _COM_SUN_STAR_DOCUMENT_XEVENTBROADCASTER_HPP_
|
||||
#include <com/sun/star/document/XEventBroadcaster.hpp>
|
||||
#endif
|
||||
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
|
||||
#include <com/sun/star/beans/XPropertySet.hpp>
|
||||
#endif
|
||||
#ifndef _COM_SUN_STAR_FRAME_FRAMEACTIONEVENT_HPP_
|
||||
#include <com/sun/star/frame/FrameActionEvent.hpp>
|
||||
#endif
|
||||
#ifndef _COM_SUN_STAR_FRAME_FRAMEACTION_HPP_
|
||||
#include <com/sun/star/frame/FrameAction.hpp>
|
||||
#endif
|
||||
#include <sfx2/viewfrm.hxx>
|
||||
|
||||
|
||||
using namespace ::com::sun::star::accessibility;
|
||||
using namespace ::com::sun::star::beans;
|
||||
using namespace ::com::sun::star::uno;
|
||||
using namespace ::com::sun::star;
|
||||
|
||||
namespace sd { namespace slidesorter { namespace controller {
|
||||
|
||||
|
||||
Listener::Listener (SlideSorterController& rController)
|
||||
: ListenerInterfaceBase(maMutex),
|
||||
mrController (rController),
|
||||
mbListeningToDocument (false),
|
||||
mbListeningToUNODocument (false),
|
||||
mbListeningToController (false),
|
||||
mbListeningToFrame (false)
|
||||
{
|
||||
StartListening (*mrController.GetModel().GetDocument());
|
||||
mbListeningToDocument = true;
|
||||
|
||||
// Connect to the UNO document.
|
||||
Reference<document::XEventBroadcaster> xBroadcaster (
|
||||
mrController.GetModel().GetDocument()->getUnoModel(), uno::UNO_QUERY);
|
||||
if (xBroadcaster.is())
|
||||
{
|
||||
xBroadcaster->addEventListener (this);
|
||||
mbListeningToUNODocument = true;
|
||||
}
|
||||
|
||||
// Listen for disposing events from the document.
|
||||
Reference<XComponent> xComponent (xBroadcaster, UNO_QUERY);
|
||||
if (xComponent.is())
|
||||
xComponent->addEventListener (
|
||||
Reference<lang::XEventListener>(
|
||||
static_cast<XWeak*>(this), UNO_QUERY));
|
||||
|
||||
// Connect to the frame to listen for controllers being exchanged.
|
||||
if ( ! mrController.GetViewShell().IsMainViewShell())
|
||||
{
|
||||
// Listen to changes of certain properties.
|
||||
Reference<frame::XFrame> xFrame (
|
||||
mrController.GetViewShell().GetViewShellBase().GetFrame()
|
||||
->GetTopFrame()->GetFrameInterface(),
|
||||
uno::UNO_QUERY);
|
||||
mxFrameWeak = xFrame;
|
||||
if (xFrame.is())
|
||||
{
|
||||
xFrame->addFrameActionListener (
|
||||
Reference<frame::XFrameActionListener>(
|
||||
static_cast<XWeak*>(this), UNO_QUERY));
|
||||
mbListeningToFrame = true;
|
||||
}
|
||||
|
||||
// Connect to the current controller.
|
||||
ConnectToController ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Listener::~Listener (void)
|
||||
{
|
||||
ReleaseListeners();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Listener::ReleaseListeners (void)
|
||||
{
|
||||
if (mbListeningToDocument)
|
||||
{
|
||||
EndListening (*mrController.GetModel().GetDocument());
|
||||
mbListeningToDocument = false;
|
||||
}
|
||||
|
||||
if (mbListeningToUNODocument)
|
||||
{
|
||||
Reference<document::XEventBroadcaster> xBroadcaster (
|
||||
mrController.GetModel().GetDocument()->getUnoModel(), UNO_QUERY);
|
||||
if (xBroadcaster.is())
|
||||
xBroadcaster->removeEventListener (this);
|
||||
|
||||
// Remove the dispose listener.
|
||||
Reference<XComponent> xComponent (xBroadcaster, UNO_QUERY);
|
||||
if (xComponent.is())
|
||||
xComponent->removeEventListener (
|
||||
Reference<lang::XEventListener>(
|
||||
static_cast<XWeak*>(this), UNO_QUERY));
|
||||
|
||||
mbListeningToUNODocument = false;
|
||||
}
|
||||
|
||||
if (mbListeningToFrame)
|
||||
{
|
||||
// Listen to changes of certain properties.
|
||||
Reference<frame::XFrame> xFrame (mxFrameWeak);
|
||||
if (xFrame.is())
|
||||
{
|
||||
xFrame->removeFrameActionListener (
|
||||
Reference<frame::XFrameActionListener>(
|
||||
static_cast<XWeak*>(this), UNO_QUERY));
|
||||
mbListeningToFrame = false;
|
||||
}
|
||||
}
|
||||
|
||||
DisconnectFromController ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Listener::ConnectToController (void)
|
||||
{
|
||||
// Register at the controller of the main view shell (if we are that not
|
||||
// ourself).
|
||||
if ( ! mrController.GetViewShell().IsMainViewShell())
|
||||
{
|
||||
// Listen to changes of certain properties.
|
||||
Reference<beans::XPropertySet> xSet (
|
||||
mrController.GetViewShell().GetViewShellBase().GetController(),
|
||||
UNO_QUERY);
|
||||
mxControllerPropertySetWeak = xSet;
|
||||
try
|
||||
{
|
||||
if (xSet.is())
|
||||
{
|
||||
xSet->addPropertyChangeListener (
|
||||
String::CreateFromAscii("CurrentPage"),
|
||||
this);
|
||||
xSet->addPropertyChangeListener (
|
||||
String::CreateFromAscii("IsMasterPageMode"),
|
||||
this);
|
||||
mbListeningToController = true;
|
||||
}
|
||||
}
|
||||
catch (beans::UnknownPropertyException aEvent)
|
||||
{
|
||||
OSL_TRACE ("caught exception in SlideSorterController::SetupListeners: %s",
|
||||
::rtl::OUStringToOString(aEvent.Message,
|
||||
RTL_TEXTENCODING_UTF8).getStr());
|
||||
}
|
||||
|
||||
// Listen for disposing events.
|
||||
Reference<XComponent> xComponent (xSet, UNO_QUERY);
|
||||
if (xComponent.is())
|
||||
xComponent->addEventListener (
|
||||
Reference<lang::XEventListener>(
|
||||
static_cast<XWeak*>(this), UNO_QUERY));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Listener::DisconnectFromController (void)
|
||||
{
|
||||
if (mbListeningToController)
|
||||
{
|
||||
Reference<beans::XPropertySet> xSet (mxControllerPropertySetWeak);
|
||||
try
|
||||
{
|
||||
// Remove the property listener.
|
||||
if (xSet.is())
|
||||
{
|
||||
xSet->removePropertyChangeListener (
|
||||
String::CreateFromAscii("CurrentPage"),
|
||||
this);
|
||||
xSet->removePropertyChangeListener (
|
||||
String::CreateFromAscii("IsMasterPageMode"),
|
||||
this);
|
||||
}
|
||||
|
||||
// Remove the dispose listener.
|
||||
Reference<XComponent> xComponent (xSet, UNO_QUERY);
|
||||
if (xComponent.is())
|
||||
xComponent->removeEventListener (
|
||||
Reference<lang::XEventListener>(
|
||||
static_cast<XWeak*>(this), UNO_QUERY));
|
||||
}
|
||||
catch (beans::UnknownPropertyException aEvent)
|
||||
{
|
||||
OSL_TRACE ("caught exception in destructor of SlideSorterController: %s",
|
||||
::rtl::OUStringToOString(aEvent.Message,
|
||||
RTL_TEXTENCODING_UTF8).getStr());
|
||||
}
|
||||
|
||||
mbListeningToController = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Listener::Notify (
|
||||
SfxBroadcaster& rBroadcaster,
|
||||
const SfxHint& rHint)
|
||||
{
|
||||
if (rHint.ISA(SdrHint))
|
||||
{
|
||||
SdrHint& rSdrHint (*PTR_CAST(SdrHint,&rHint));
|
||||
switch (rSdrHint.GetKind())
|
||||
{
|
||||
case HINT_PAGEORDERCHG:
|
||||
OSL_TRACE ("received HINT_PAGEORDERCHG\n");
|
||||
mrController.HandleModelChange();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//===== lang::XEventListener ================================================
|
||||
|
||||
void SAL_CALL Listener::disposing (
|
||||
const lang::EventObject& rEventObject)
|
||||
throw (RuntimeException)
|
||||
{
|
||||
if ((mbListeningToDocument || mbListeningToUNODocument)
|
||||
&& mrController.GetModel().GetDocument()!=NULL
|
||||
&& rEventObject.Source
|
||||
== mrController.GetModel().GetDocument()->getUnoModel())
|
||||
{
|
||||
mbListeningToDocument = false;
|
||||
mbListeningToUNODocument = false;
|
||||
}
|
||||
else if (mbListeningToController)
|
||||
{
|
||||
|
||||
Reference<beans::XPropertySet> xSet (mxControllerPropertySetWeak);
|
||||
if (rEventObject.Source == xSet)
|
||||
{
|
||||
mbListeningToController = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//===== document::XEventListener ============================================
|
||||
|
||||
void SAL_CALL Listener::notifyEvent (
|
||||
const document::EventObject& rEventObject)
|
||||
throw (RuntimeException)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//===== beans::XPropertySetListener =========================================
|
||||
|
||||
void SAL_CALL Listener::propertyChange (
|
||||
const PropertyChangeEvent& rEvent)
|
||||
throw (RuntimeException)
|
||||
{
|
||||
ThrowIfDisposed();
|
||||
|
||||
static const ::rtl::OUString sCurrentPagePropertyName (
|
||||
RTL_CONSTASCII_USTRINGPARAM("CurrentPage"));
|
||||
static const ::rtl::OUString sEditModePropertyName (
|
||||
RTL_CONSTASCII_USTRINGPARAM("IsMasterPageMode"));
|
||||
|
||||
OSL_TRACE ("property changed: %s",
|
||||
::rtl::OUStringToOString(rEvent.PropertyName,
|
||||
RTL_TEXTENCODING_UTF8).getStr());
|
||||
|
||||
if (rEvent.PropertyName.equals (sCurrentPagePropertyName))
|
||||
{
|
||||
Any aCurrentPage = rEvent.NewValue;
|
||||
Reference<beans::XPropertySet> xPageSet (aCurrentPage, UNO_QUERY);
|
||||
if (xPageSet.is())
|
||||
{
|
||||
try
|
||||
{
|
||||
Any aPageNumber = xPageSet->getPropertyValue (
|
||||
String(RTL_CONSTASCII_USTRINGPARAM("Number")));
|
||||
sal_Int32 nCurrentPage;
|
||||
aPageNumber >>= nCurrentPage;
|
||||
mrController.GetPageSelector().UpdateAllPages ();
|
||||
// As the selection is already set this call is used just to
|
||||
// remember the new current page as the most recently
|
||||
// selected page that will be handled with greater priority
|
||||
// when making the selection visible.
|
||||
mrController.GetPageSelector().SelectPage (nCurrentPage-1);
|
||||
mrController.MakeSelectionVisible();
|
||||
}
|
||||
catch (beans::UnknownPropertyException aEvent)
|
||||
{
|
||||
OSL_TRACE ("caught exception while accessing the page number of a slide: %s",
|
||||
::rtl::OUStringToOString(aEvent.Message,
|
||||
RTL_TEXTENCODING_UTF8).getStr());
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Do not react to a change of the master page mode in the center pane.
|
||||
The slide sorter has its own master page mode.
|
||||
else if (rEvent.PropertyName.equals (sEditModePropertyName))
|
||||
{
|
||||
sal_Bool bIsMasterPageMode;
|
||||
rEvent.NewValue >>= bIsMasterPageMode;
|
||||
EditMode eMode = bIsMasterPageMode ? EM_MASTERPAGE : EM_PAGE;
|
||||
if (mrController.GetModel().SetEditMode (eMode))
|
||||
if (eMode == EM_PAGE)
|
||||
mrController.GetViewShell().SwitchTabBar (
|
||||
SlideSorterViewShell::TBE_SLIDES);
|
||||
else
|
||||
mrController.GetViewShell().SwitchTabBar (
|
||||
SlideSorterViewShell::TBE_MASTER_PAGES);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//===== frame::XFrameActionListener ==========================================
|
||||
|
||||
void SAL_CALL Listener::frameAction (const frame::FrameActionEvent& rEvent)
|
||||
throw (::com::sun::star::uno::RuntimeException)
|
||||
{
|
||||
switch (rEvent.Action)
|
||||
{
|
||||
case frame::FrameAction_COMPONENT_DETACHING:
|
||||
DisconnectFromController();
|
||||
break;
|
||||
|
||||
case frame::FrameAction_COMPONENT_REATTACHED:
|
||||
ConnectToController();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//===== accessibility::XAccessibleEventListener ==============================
|
||||
|
||||
void SAL_CALL Listener::notifyEvent (
|
||||
const AccessibleEventObject& rEvent)
|
||||
throw (RuntimeException)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void SAL_CALL Listener::disposing (void)
|
||||
{
|
||||
SlideSorterViewShell& rShell (mrController.GetViewShell());
|
||||
rShell.GetFrameView()->Disconnect();
|
||||
ReleaseListeners();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Listener::ThrowIfDisposed (void)
|
||||
throw (::com::sun::star::lang::DisposedException)
|
||||
{
|
||||
if (rBHelper.bDisposed || rBHelper.bInDispose)
|
||||
{
|
||||
throw lang::DisposedException (
|
||||
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
|
||||
"SlideSorterController object has already been disposed")),
|
||||
static_cast<uno::XWeak*>(this));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} } } // end of namespace ::sd::slidesorter::controller
|
Reference in New Issue
Block a user