blob: dd34de99228a86c93cb9067fb8c5fafa80887306 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
// autogen include statement, do not remove
#include "precompiled_framework.hxx"
#include <classes/fwktabwindow.hxx>
#include "framework.hrc"
#include <classes/fwkresid.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 <tools/diagnose_ex.h>
#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( sal_uLong nEvent )
{
if ( VCLEVENT_TABPAGE_ACTIVATE == nEvent || VCLEVENT_TABPAGE_DEACTIVATE == nEvent )
ImplCallEventListeners( nEvent, (void*)(sal_uIntPtr)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_UNHANDLED_EXCEPTION();
}
}
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, FwkResId( WIN_TABWINDOW ) ),
m_aTabCtrl ( this, FwkResId( 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 sal_uInt16 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 );
sal_uInt16 nIdx = static_cast< sal_uInt16 >( 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< sal_uInt16 >( nIndex ) );
ActivatePageHdl( &m_aTabCtrl );
}
// -----------------------------------------------------------------------
void FwkTabWindow::RemovePage( sal_Int32 nIndex )
{
TabEntry* pEntry = FindEntry(nIndex);
if ( pEntry )
{
m_aTabCtrl.RemovePage( static_cast< sal_uInt16 >( nIndex ) );
if (RemoveEntry(nIndex))
delete pEntry;
}
}
// -----------------------------------------------------------------------
void FwkTabWindow::Resize()
{
Size aPageSize = GetSizePixel();
m_aTabCtrl.SetTabPageSizePixel( aPageSize );
}
} // namespace framework