summaryrefslogtreecommitdiff
path: root/sdext/source/presenter/PresenterPaneBase.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sdext/source/presenter/PresenterPaneBase.cxx')
-rw-r--r--sdext/source/presenter/PresenterPaneBase.cxx561
1 files changed, 561 insertions, 0 deletions
diff --git a/sdext/source/presenter/PresenterPaneBase.cxx b/sdext/source/presenter/PresenterPaneBase.cxx
new file mode 100644
index 000000000000..39283673c23d
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneBase.cxx
@@ -0,0 +1,561 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sdext.hxx"
+
+#include "PresenterPaneBase.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterController.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterTextView.hxx"
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XWindow2.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <com/sun/star/drawing/CanvasFeature.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/TexturingMode.hpp>
+#include <osl/mutex.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::rtl::OUString;
+
+namespace sdext { namespace presenter {
+
+//===== PresenterPaneBase =====================================================
+
+PresenterPaneBase::PresenterPaneBase (
+ const Reference<XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterPaneBaseInterfaceBase(m_aMutex),
+ mpPresenterController(rpPresenterController),
+ mxParentWindow(),
+ mxBorderWindow(),
+ mxBorderCanvas(),
+ mxContentWindow(),
+ mxContentCanvas(),
+ mxPaneId(),
+ mxBorderPainter(),
+ mxPresenterHelper(),
+ msTitle(),
+ mxComponentContext(rxContext),
+ mpViewBackground(),
+ mbHasCallout(false),
+ maCalloutAnchor()
+{
+ if (mpPresenterController.get() != NULL)
+ mxPresenterHelper = mpPresenterController->GetPresenterHelper();
+}
+
+
+
+
+PresenterPaneBase::~PresenterPaneBase (void)
+{
+}
+
+
+
+
+void PresenterPaneBase::disposing (void)
+{
+ if (mxBorderWindow.is())
+ {
+ mxBorderWindow->removeWindowListener(this);
+ mxBorderWindow->removePaintListener(this);
+ }
+
+ {
+ Reference<XComponent> xComponent (mxContentCanvas, UNO_QUERY);
+ mxContentCanvas = NULL;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ {
+ Reference<XComponent> xComponent (mxContentWindow, UNO_QUERY);
+ mxContentWindow = NULL;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ {
+ Reference<XComponent> xComponent (mxBorderCanvas, UNO_QUERY);
+ mxBorderCanvas = NULL;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ {
+ Reference<XComponent> xComponent (mxBorderWindow, UNO_QUERY);
+ mxBorderWindow = NULL;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ mxComponentContext = NULL;
+}
+
+
+
+
+void PresenterPaneBase::SetTitle (const OUString& rsTitle)
+{
+ msTitle = rsTitle;
+
+ OSL_ASSERT(mpPresenterController.get()!=NULL);
+ OSL_ASSERT(mpPresenterController->GetPaintManager().get()!=NULL);
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxBorderWindow);
+}
+
+
+
+
+::rtl::OUString PresenterPaneBase::GetTitle (void) const
+{
+ return msTitle;
+}
+
+
+
+
+Reference<drawing::framework::XPaneBorderPainter>
+ PresenterPaneBase::GetPaneBorderPainter (void) const
+{
+ return mxBorderPainter;
+}
+
+
+
+
+void PresenterPaneBase::SetCalloutAnchor (const css::awt::Point& rCalloutAnchor)
+{
+ mbHasCallout = true;
+ // Anchor is given in the coorindate system of the parent window.
+ // Transform it into the local coordinate system.
+ maCalloutAnchor = rCalloutAnchor;
+ const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ maCalloutAnchor.X -= aBorderBox.X;
+ maCalloutAnchor.Y -= aBorderBox.Y;
+
+ // Move the bottom of the border window so that it goes through the
+ // callout anchor (special case for bottom callout).
+ sal_Int32 nHeight (rCalloutAnchor.Y - aBorderBox.Y);
+ if (mxBorderPainter.is() && mxPaneId.is())
+ nHeight += mxBorderPainter->getCalloutOffset(mxPaneId->getResourceURL()).Y;
+
+ if (nHeight != aBorderBox.Height)
+ {
+ mxBorderWindow->setPosSize(
+ aBorderBox.X,
+ aBorderBox.Y,
+ aBorderBox.Width,
+ nHeight,
+ awt::PosSize::HEIGHT);
+ }
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxBorderWindow);
+}
+
+
+
+
+awt::Point PresenterPaneBase::GetCalloutAnchor (void) const
+{
+ return maCalloutAnchor;
+}
+
+
+
+
+::boost::shared_ptr<PresenterTextView> PresenterPaneBase::GetTextViewForTitle (void)
+{
+ ::boost::shared_ptr<PresenterTextView> pTextView(
+ new PresenterTextView(
+ mxComponentContext,
+ mxBorderCanvas));
+ pTextView->SetText(msTitle);
+ return pTextView;
+}
+
+
+
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL PresenterPaneBase::initialize (const Sequence<Any>& rArguments)
+ throw (Exception, RuntimeException)
+{
+ ThrowIfDisposed();
+
+ if ( ! mxComponentContext.is())
+ {
+ throw RuntimeException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterSpritePane: missing component context")),
+ static_cast<XWeak*>(this));
+ }
+
+ if (rArguments.getLength() == 5 || rArguments.getLength() == 6)
+ {
+ try
+ {
+ // Get the resource id from the first argument.
+ if ( ! (rArguments[0] >>= mxPaneId))
+ {
+ throw lang::IllegalArgumentException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterPane: invalid pane id")),
+ static_cast<XWeak*>(this),
+ 0);
+ }
+
+ if ( ! (rArguments[1] >>= mxParentWindow))
+ {
+ throw lang::IllegalArgumentException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterPane: invalid parent window")),
+ static_cast<XWeak*>(this),
+ 1);
+ }
+
+ Reference<rendering::XSpriteCanvas> xParentCanvas;
+ if ( ! (rArguments[2] >>= xParentCanvas))
+ {
+ throw lang::IllegalArgumentException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterPane: invalid parent canvas")),
+ static_cast<XWeak*>(this),
+ 2);
+ }
+
+ if ( ! (rArguments[3] >>= msTitle))
+ {
+ throw lang::IllegalArgumentException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterPane: invalid title")),
+ static_cast<XWeak*>(this),
+ 3);
+ }
+
+ if ( ! (rArguments[4] >>= mxBorderPainter))
+ {
+ throw lang::IllegalArgumentException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterPane: invalid border painter")),
+ static_cast<XWeak*>(this),
+ 4);
+ }
+
+ bool bIsWindowVisibleOnCreation (true);
+ if (rArguments.getLength()>5 && ! (rArguments[5] >>= bIsWindowVisibleOnCreation))
+ {
+ throw lang::IllegalArgumentException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterPane: invalid window visibility flag")),
+ static_cast<XWeak*>(this),
+ 5);
+ }
+
+ CreateWindows(mxParentWindow, bIsWindowVisibleOnCreation);
+
+ if (mxBorderWindow.is())
+ {
+ mxBorderWindow->addWindowListener(this);
+ mxBorderWindow->addPaintListener(this);
+ }
+
+ CreateCanvases(mxParentWindow, xParentCanvas);
+
+ // Raise new windows.
+ ToTop();
+ }
+ catch (Exception&)
+ {
+ mxContentWindow = NULL;
+ mxComponentContext = NULL;
+ throw;
+ }
+ }
+ else
+ {
+ throw RuntimeException(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("PresenterSpritePane: invalid number of arguments")),
+ static_cast<XWeak*>(this));
+ }
+}
+
+
+
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterPaneBase::getResourceId (void)
+ throw (RuntimeException)
+{
+ ThrowIfDisposed();
+ return mxPaneId;
+}
+
+
+
+
+sal_Bool SAL_CALL PresenterPaneBase::isAnchorOnly (void)
+ throw (RuntimeException)
+{
+ return true;
+}
+
+
+
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterPaneBase::windowResized (const awt::WindowEvent& rEvent)
+ throw (RuntimeException)
+{
+ (void)rEvent;
+ ThrowIfDisposed();
+}
+
+
+
+
+
+void SAL_CALL PresenterPaneBase::windowMoved (const awt::WindowEvent& rEvent)
+ throw (RuntimeException)
+{
+ (void)rEvent;
+ ThrowIfDisposed();
+}
+
+
+
+
+void SAL_CALL PresenterPaneBase::windowShown (const lang::EventObject& rEvent)
+ throw (RuntimeException)
+{
+ (void)rEvent;
+ ThrowIfDisposed();
+}
+
+
+
+
+void SAL_CALL PresenterPaneBase::windowHidden (const lang::EventObject& rEvent)
+ throw (RuntimeException)
+{
+ (void)rEvent;
+ ThrowIfDisposed();
+}
+
+
+
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterPaneBase::disposing (const lang::EventObject& rEvent)
+ throw (RuntimeException)
+{
+ if (rEvent.Source == mxBorderWindow)
+ {
+ mxBorderWindow = NULL;
+ }
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+
+
+void PresenterPaneBase::CreateWindows (
+ const Reference<awt::XWindow>& rxParentWindow,
+ const bool bIsWindowVisibleOnCreation)
+{
+ if (mxPresenterHelper.is() && rxParentWindow.is())
+ {
+
+ mxBorderWindow = mxPresenterHelper->createWindow(
+ rxParentWindow,
+ sal_False,
+ bIsWindowVisibleOnCreation,
+ sal_False,
+ sal_False);
+ mxContentWindow = mxPresenterHelper->createWindow(
+ mxBorderWindow,
+ sal_False,
+ bIsWindowVisibleOnCreation,
+ sal_False,
+ sal_False);
+ }
+}
+
+
+
+
+Reference<awt::XWindow> PresenterPaneBase::GetBorderWindow (void) const
+{
+ return mxBorderWindow;
+}
+
+
+
+
+void PresenterPaneBase::ToTop (void)
+{
+ if (mxPresenterHelper.is())
+ mxPresenterHelper->toTop(mxContentWindow);
+}
+
+
+
+
+void PresenterPaneBase::SetBackground (const SharedBitmapDescriptor& rpBackground)
+{
+ mpViewBackground = rpBackground;
+}
+
+
+
+
+void PresenterPaneBase::PaintBorderBackground (
+ const awt::Rectangle& rBorderBox,
+ const awt::Rectangle& rUpdateBox)
+{
+ (void)rBorderBox;
+ (void)rUpdateBox;
+ /*
+ // The outer box of the border is given. We need the center and inner
+ // box as well.
+ awt::Rectangle aCenterBox (
+ mxBorderPainter->removeBorder(
+ mxPaneId->getResourceURL(),
+ rBorderBox,
+ drawing::framework::BorderType_OUTER_BORDER));
+ awt::Rectangle aInnerBox (
+ mxBorderPainter->removeBorder(
+ mxPaneId->getResourceURL(),
+ rBorderBox,
+ drawing::framework::BorderType_TOTAL_BORDER));
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpViewBackground,
+ mxBorderCanvas,
+ rUpdateBox,
+ aCenterBox,
+ aInnerBox);
+ */
+}
+
+
+
+
+void PresenterPaneBase::PaintBorder (const awt::Rectangle& rUpdateBox)
+{
+ OSL_ASSERT(mxPaneId.is());
+
+ if (mxBorderPainter.is() && mxBorderWindow.is() && mxBorderCanvas.is())
+ {
+ awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ awt::Rectangle aLocalBorderBox (0,0, aBorderBox.Width, aBorderBox.Height);
+
+ PaintBorderBackground(aLocalBorderBox, rUpdateBox);
+
+ if (mbHasCallout)
+ mxBorderPainter->paintBorderWithCallout(
+ mxPaneId->getResourceURL(),
+ mxBorderCanvas,
+ aLocalBorderBox,
+ rUpdateBox,
+ msTitle,
+ maCalloutAnchor);
+ else
+ mxBorderPainter->paintBorder(
+ mxPaneId->getResourceURL(),
+ mxBorderCanvas,
+ aLocalBorderBox,
+ rUpdateBox,
+ msTitle);
+ }
+}
+
+
+
+
+void PresenterPaneBase::LayoutContextWindow (void)
+{
+ OSL_ASSERT(mxPaneId.is());
+ OSL_ASSERT(mxBorderWindow.is());
+ OSL_ASSERT(mxContentWindow.is());
+ if (mxBorderPainter.is() && mxPaneId.is() && mxBorderWindow.is() && mxContentWindow.is())
+ {
+ const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ const awt::Rectangle aInnerBox (mxBorderPainter->removeBorder(
+ mxPaneId->getResourceURL(),
+ aBorderBox,
+ drawing::framework::BorderType_TOTAL_BORDER));
+ mxContentWindow->setPosSize(
+ aInnerBox.X - aBorderBox.X,
+ aInnerBox.Y - aBorderBox.Y,
+ aInnerBox.Width,
+ aInnerBox.Height,
+ awt::PosSize::POSSIZE);
+ }
+}
+
+
+
+
+bool PresenterPaneBase::IsVisible (void) const
+{
+ Reference<awt::XWindow2> xWindow2 (mxBorderPainter, UNO_QUERY);
+ if (xWindow2.is())
+ return xWindow2->isVisible();
+
+ return false;
+}
+
+
+
+
+void PresenterPaneBase::ThrowIfDisposed (void)
+ throw (::com::sun::star::lang::DisposedException)
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
+ "PresenterPane object has already been disposed")),
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+
+
+
+} } // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */