summaryrefslogtreecommitdiff
path: root/framework/source/classes/fwktabwindow.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/source/classes/fwktabwindow.cxx')
-rw-r--r--framework/source/classes/fwktabwindow.cxx412
1 files changed, 412 insertions, 0 deletions
diff --git a/framework/source/classes/fwktabwindow.cxx b/framework/source/classes/fwktabwindow.cxx
new file mode 100644
index 000000000000..aa550807460c
--- /dev/null
+++ b/framework/source/classes/fwktabwindow.cxx
@@ -0,0 +1,412 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// autogen include statement, do not remove
+#include "precompiled_framework.hxx"
+
+#include <classes/fwktabwindow.hxx>
+#include "framework.hrc"
+#include <classes/fwlresid.hxx>
+
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XContainerWindowEventHandler.hpp>
+#include <com/sun/star/awt/XContainerWindowProvider.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/awt/XControl.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <tools/stream.hxx>
+#include <vcl/bitmap.hxx>
+#include <vcl/image.hxx>
+#include <vcl/msgbox.hxx>
+
+const ::rtl::OUString SERVICENAME_WINPROVIDER
+ = ::rtl::OUString::createFromAscii("com.sun.star.awt.ContainerWindowProvider");
+const ::rtl::OUString EXTERNAL_EVENT = ::rtl::OUString::createFromAscii("external_event");
+const ::rtl::OUString BACK_METHOD = ::rtl::OUString::createFromAscii("back");
+const ::rtl::OUString INITIALIZE_METHOD = ::rtl::OUString::createFromAscii("initialize");
+const ::rtl::OUString OK_METHOD = ::rtl::OUString::createFromAscii("ok");
+
+using namespace ::com::sun::star;
+
+namespace framework
+{
+
+// class FwkTabControl ---------------------------------------------------
+FwkTabControl::FwkTabControl( Window* pParent, const ResId& rResId ) :
+
+ TabControl( pParent, rResId )
+{
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabControl::BroadcastEvent( ULONG nEvent )
+{
+ if ( VCLEVENT_TABPAGE_ACTIVATE == nEvent || VCLEVENT_TABPAGE_DEACTIVATE == nEvent )
+ ImplCallEventListeners( nEvent, (void*)(ULONG)GetCurPageId() );
+ else
+ {
+ DBG_ERRORFILE( "FwkTabControl::BroadcastEvent(): illegal event" );
+ }
+}
+
+// class FwkTabPage ------------------------------------------------
+
+FwkTabPage::FwkTabPage(
+ Window* pParent, const rtl::OUString& rPageURL,
+ const css::uno::Reference< css::awt::XContainerWindowEventHandler >& rEventHdl,
+ const css::uno::Reference< css::awt::XContainerWindowProvider >& rProvider ) :
+
+ TabPage( pParent, WB_DIALOGCONTROL | WB_TABSTOP | WB_CHILDDLGCTRL ),
+
+ m_sPageURL ( rPageURL ),
+ m_xEventHdl ( rEventHdl ),
+ m_xWinProvider ( rProvider )
+
+{
+}
+
+// -----------------------------------------------------------------------
+
+FwkTabPage::~FwkTabPage()
+{
+ Hide();
+ DeactivatePage();
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabPage::CreateDialog()
+{
+ try
+ {
+ uno::Reference< uno::XInterface > xHandler;
+ if ( m_xEventHdl.is() )
+ xHandler = m_xEventHdl;
+
+ uno::Reference< awt::XWindowPeer > xParent( VCLUnoHelper::GetInterface( this ), uno::UNO_QUERY );
+ m_xPage = uno::Reference < awt::XWindow >(
+ m_xWinProvider->createContainerWindow(
+ m_sPageURL, rtl::OUString(), xParent, xHandler ), uno::UNO_QUERY );
+
+ uno::Reference< awt::XControl > xPageControl( m_xPage, uno::UNO_QUERY );
+ if ( xPageControl.is() )
+ {
+ uno::Reference< awt::XWindowPeer > xWinPeer( xPageControl->getPeer() );
+ if ( xWinPeer.is() )
+ {
+ Window* pWindow = VCLUnoHelper::GetWindow( xWinPeer );
+ if ( pWindow )
+ pWindow->SetStyle( pWindow->GetStyle() | WB_DIALOGCONTROL | WB_CHILDDLGCTRL );
+ }
+ }
+
+ CallMethod( INITIALIZE_METHOD );
+ }
+ catch ( lang::IllegalArgumentException& )
+ {
+ DBG_ERRORFILE( "FwkTabPage::CreateDialog(): illegal argument" );
+ }
+ catch ( uno::Exception& )
+ {
+ DBG_ERRORFILE( "FwkTabPage::CreateDialog(): exception of XDialogProvider2::createContainerWindow()" );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+sal_Bool FwkTabPage::CallMethod( const rtl::OUString& rMethod )
+{
+ sal_Bool bRet = sal_False;
+ if ( m_xEventHdl.is() )
+ {
+ try
+ {
+ bRet = m_xEventHdl->callHandlerMethod( m_xPage, uno::makeAny( rMethod ), EXTERNAL_EVENT );
+ }
+ catch ( uno::Exception& )
+ {
+ DBG_ERRORFILE( "FwkTabPage::CallMethod(): exception of XDialogEventHandler::callHandlerMethod()" );
+ }
+ }
+ return bRet;
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabPage::ActivatePage()
+{
+ TabPage::ActivatePage();
+
+ if ( !m_xPage.is() )
+ CreateDialog();
+
+ if ( m_xPage.is() )
+ {
+ Resize ();
+ m_xPage->setVisible( sal_True );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabPage::DeactivatePage()
+{
+ TabPage::DeactivatePage();
+
+ if ( m_xPage.is() )
+ m_xPage->setVisible( sal_False );
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabPage::Resize()
+{
+ if ( m_xPage.is () )
+ {
+ Size aSize = GetSizePixel ();
+ Point aPos = GetPosPixel ();
+
+ m_xPage->setPosSize( 0, 0, aSize.Width()-1 , aSize.Height()-1, awt::PosSize::POSSIZE );
+ }
+}
+
+// class FwkTabWindow ---------------------------------------------
+
+FwkTabWindow::FwkTabWindow( Window* pParent ) :
+
+ Window( pParent, FwlResId( WIN_TABWINDOW ) ),
+
+ m_aTabCtrl ( this, FwlResId( TC_TABCONTROL ) )
+{
+ uno::Reference < lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
+ m_xWinProvider = uno::Reference < awt::XContainerWindowProvider >(
+ xFactory->createInstance( SERVICENAME_WINPROVIDER ), uno::UNO_QUERY );
+
+ SetPaintTransparent(true);
+
+ m_aTabCtrl.SetActivatePageHdl( LINK( this, FwkTabWindow, ActivatePageHdl ) );
+ m_aTabCtrl.SetDeactivatePageHdl( LINK( this, FwkTabWindow, DeactivatePageHdl ) );
+ m_aTabCtrl.Show();
+}
+
+// -----------------------------------------------------------------------
+
+FwkTabWindow::~FwkTabWindow()
+{
+ ClearEntryList();
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabWindow::ClearEntryList()
+{
+ TabEntryList::const_iterator pIt;
+ for ( pIt = m_TabList.begin();
+ pIt != m_TabList.end();
+ ++pIt )
+ {
+ delete *pIt;
+ }
+
+ m_TabList.clear();
+}
+
+// -----------------------------------------------------------------------
+
+bool FwkTabWindow::RemoveEntry( sal_Int32 nIndex )
+{
+ TabEntryList::iterator pIt;
+ for ( pIt = m_TabList.begin();
+ pIt != m_TabList.end();
+ ++pIt )
+ {
+ if ( (*pIt)->m_nIndex == nIndex )
+ break;
+ }
+
+ // remove entry from vector
+ if ( pIt != m_TabList.end())
+ {
+ m_TabList.erase(pIt);
+ return true;
+ }
+ else
+ return false;
+}
+
+// -----------------------------------------------------------------------
+TabEntry* FwkTabWindow::FindEntry( sal_Int32 nIndex ) const
+{
+ TabEntry* pEntry = NULL;
+
+ TabEntryList::const_iterator pIt;
+ for ( pIt = m_TabList.begin();
+ pIt != m_TabList.end();
+ ++pIt )
+ {
+ if ( (*pIt)->m_nIndex == nIndex )
+ {
+ pEntry = *pIt;
+ break;
+ }
+ }
+
+ return pEntry;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( FwkTabWindow, ActivatePageHdl, TabControl *, EMPTYARG )
+{
+ const USHORT nId = m_aTabCtrl.GetCurPageId();
+ FwkTabPage* pTabPage = static_cast< FwkTabPage* >( m_aTabCtrl.GetTabPage( nId ) );
+ if ( !pTabPage )
+ {
+ TabEntry* pEntry = FindEntry( nId );
+ if ( pEntry )
+ {
+ pTabPage = new FwkTabPage( &m_aTabCtrl, pEntry->m_sPageURL, pEntry->m_xEventHdl, m_xWinProvider );
+ pEntry->m_pPage = pTabPage;
+ m_aTabCtrl.SetTabPage( nId, pTabPage );
+ pTabPage->Show();
+ pTabPage->ActivatePage();
+ }
+ } else {
+ pTabPage->ActivatePage();
+ }
+ m_aTabCtrl.BroadcastEvent( VCLEVENT_TABPAGE_ACTIVATE );
+ return 1;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( FwkTabWindow, DeactivatePageHdl, TabControl *, EMPTYARG )
+{
+ m_aTabCtrl.BroadcastEvent( VCLEVENT_TABPAGE_DEACTIVATE );
+ return 1;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( FwkTabWindow, CloseHdl, PushButton *, EMPTYARG )
+{
+// Close();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabWindow::AddEventListener( const Link& rEventListener )
+{
+ m_aTabCtrl.AddEventListener( rEventListener );
+}
+
+void FwkTabWindow::RemoveEventListener( const Link& rEventListener )
+{
+ m_aTabCtrl.RemoveEventListener( rEventListener );
+}
+
+// -----------------------------------------------------------------------
+
+FwkTabPage* FwkTabWindow::AddTabPage( sal_Int32 nIndex, const uno::Sequence< beans::NamedValue >& rProperties )
+{
+ ::rtl::OUString sTitle, sToolTip, sPageURL;
+ uno::Reference< css::awt::XContainerWindowEventHandler > xEventHdl;
+ uno::Reference< graphic::XGraphic > xImage;
+ bool bDisabled = false;
+
+ sal_Int32 i = 0, nLen = rProperties.getLength();
+ for ( i = 0; i < nLen; ++i )
+ {
+ beans::NamedValue aValue = rProperties[i];
+ ::rtl::OUString sName = aValue.Name;
+
+ if ( sName.equalsAscii("Title") )
+ aValue.Value >>= sTitle;
+ else if ( sName.equalsAscii("ToolTip") )
+ aValue.Value >>= sToolTip;
+ else if ( sName.equalsAscii("PageURL") )
+ aValue.Value >>= sPageURL;
+ else if ( sName.equalsAscii("EventHdl") )
+ aValue.Value >>= xEventHdl;
+ else if ( sName.equalsAscii("Image") )
+ aValue.Value >>= xImage;
+ else if ( sName.equalsAscii("Disabled") )
+ aValue.Value >>= bDisabled;
+ }
+
+ TabEntry* pEntry = new TabEntry( nIndex, sPageURL, xEventHdl );
+ m_TabList.push_back( pEntry );
+ USHORT nIdx = static_cast< USHORT >( nIndex );
+ m_aTabCtrl.InsertPage( nIdx, sTitle );
+ if ( sToolTip.getLength() > 0 )
+ m_aTabCtrl.SetHelpText( nIdx, sToolTip );
+ if ( xImage.is() )
+ m_aTabCtrl.SetPageImage( nIdx, Image( xImage ) );
+ if ( bDisabled )
+ m_aTabCtrl.EnablePage( nIdx, false );
+
+ return pEntry->m_pPage;
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabWindow::ActivatePage( sal_Int32 nIndex )
+{
+ m_aTabCtrl.SetCurPageId( static_cast< USHORT >( nIndex ) );
+ ActivatePageHdl( &m_aTabCtrl );
+}
+
+// -----------------------------------------------------------------------
+
+void FwkTabWindow::RemovePage( sal_Int32 nIndex )
+{
+ TabEntry* pEntry = FindEntry(nIndex);
+ if ( pEntry )
+ {
+ m_aTabCtrl.RemovePage( static_cast< USHORT >( nIndex ) );
+ if (RemoveEntry(nIndex))
+ delete pEntry;
+ }
+}
+
+// -----------------------------------------------------------------------
+void FwkTabWindow::Resize()
+{
+ Size aPageSize = GetSizePixel();
+ m_aTabCtrl.SetTabPageSizePixel( aPageSize );
+}
+
+} // namespace framework
+