office-gobmx/toolkit/source/layout/vcl/wrapper.cxx

1363 lines
37 KiB
C++

/* -*- 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.
*
************************************************************************/
#include <tools/rc.h>
//#define RESOURCE_PUBLISH_PROTECTED 1
#if RESOURCE_PUBLISH_PROTECTED
// ugh, override non-helpful proctection
#define protected public
#endif /* RESOURCE_PUBLISH_PROTECTED */
#include <tools/rc.hxx>
#undef protected
#include "wrapper.hxx"
#include <awt/vclxplugin.hxx>
#include <awt/vclxtabcontrol.hxx>
#include <com/sun/star/awt/PosSize.hpp>
#include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
#include <com/sun/star/awt/WindowAttribute.hpp>
#include <com/sun/star/awt/XDialog2.hpp>
#include <com/sun/star/awt/XProgressBar.hpp>
#include <com/sun/star/awt/XSimpleTabController.hpp>
#include <com/sun/star/awt/XTabListener.hpp>
#include <com/sun/star/graphic/XGraphic.hpp>
#include <comphelper/processfactory.hxx>
#include <layout/core/factory.hxx>
#include <layout/core/localized-string.hxx>
#include <layout/core/root.hxx>
#include <toolkit/awt/vclxwindow.hxx>
#include <vcl/ctrl.hxx>
#include <vcl/dialog.hxx>
#include <vcl/image.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/tabpage.hxx>
#include <vcl/window.hxx>
using namespace ::com::sun::star;
using rtl::OUString;
namespace layout
{
// Context bits ...
class ContextImpl
{
uno::Reference< awt::XLayoutRoot > mxRoot;
uno::Reference< container::XNameAccess > mxNameAccess;
PeerHandle mxTopLevel;
public:
ContextImpl( char const *pPath )
{
uno::Sequence< uno::Any > aParams( 1 );
aParams[0] <<= OUString( pPath, strlen( pPath ), RTL_TEXTENCODING_UTF8 );
uno::Reference< lang::XSingleServiceFactory > xFactory(
comphelper::createProcessComponent(
OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.Layout")) ),
uno::UNO_QUERY );
if ( !xFactory.is() )
{
throw uno::RuntimeException(
OUString( RTL_CONSTASCII_USTRINGPARAM( "Layout engine not installed" ) ),
uno::Reference< uno::XInterface >() );
}
mxRoot = uno::Reference< awt::XLayoutRoot >(
xFactory->createInstanceWithArguments( aParams ),
uno::UNO_QUERY );
mxNameAccess = uno::Reference< container::XNameAccess >( mxRoot, uno::UNO_QUERY );
}
~ContextImpl()
{
}
PeerHandle getByName( const OUString &rName )
{
uno::Any val = mxNameAccess->getByName( rName );
PeerHandle xRet;
val >>= xRet;
return xRet;
}
PeerHandle getTopLevel()
{
return mxTopLevel;
}
void setTopLevel( PeerHandle xToplevel )
{
mxTopLevel = xToplevel;
}
PeerHandle getRoot()
{
return mxRoot;
}
};
Context::Context( const char *pPath )
: pImpl( new ContextImpl( pPath ) )
{
}
Context::~Context()
{
delete pImpl;
pImpl = NULL;
}
void Context::setToplevel( PeerHandle xToplevel )
{
pImpl->setTopLevel( xToplevel );
}
PeerHandle Context::getToplevel()
{
return pImpl->getTopLevel();
}
PeerHandle Context::getRoot()
{
return pImpl->getRoot();
}
PeerHandle Context::GetPeerHandle( const char *id, sal_uInt32 nId ) const
{
PeerHandle xHandle;
xHandle = pImpl->getByName( OUString( id, strlen( id ), RTL_TEXTENCODING_UTF8 ) );
if ( !xHandle.is() )
{
OSL_TRACE( "Failed to fetch widget '%s'", id );
}
if ( nId != 0 )
{
rtl::OString aStr = rtl::OString::valueOf( (sal_Int32) nId );
xHandle = GetPeerHandle( aStr.getStr(), 0 );
}
return xHandle;
}
WindowImpl::WindowImpl (Context *context, const PeerHandle &peer, Window *window)
: mpWindow (window)
, mpCtx (context)
, mxWindow (peer, uno::UNO_QUERY)
, mxVclPeer (peer, uno::UNO_QUERY)
, mvclWindow (0)
, bFirstTimeVisible (true)
{
}
WindowImpl::~WindowImpl ()
{
if (mpWindow)
mpWindow->mpImpl = 0;
if (mvclWindow)
{
VCLXWindow *v = mvclWindow->GetWindowPeer ();
v->SetWindow (0);
mvclWindow->SetComponentInterface (uno::Reference <awt::XWindowPeer> ());
mvclWindow->SetWindowPeer (uno::Reference <awt::XWindowPeer> (), 0);
delete mvclWindow;
mvclWindow = 0;
}
}
void WindowImpl::wrapperGone ()
{
mvclWindow = 0;
mpWindow->mpImpl = 0;
mpWindow = 0;
mpCtx = 0;
if ( mxWindow.is() )
{
uno::Reference< lang::XComponent > xComp( mxWindow, uno::UNO_QUERY );
mxWindow.clear ();
if ( xComp.is() )
xComp->dispose();
}
}
void SAL_CALL WindowImpl::disposing (lang::EventObject const&)
throw (uno::RuntimeException)
{
if (mxWindow.is ())
mxWindow.clear ();
}
uno::Any WindowImpl::getProperty (char const* name)
{
if ( !this || !mxVclPeer.is() )
return css::uno::Any();
return mxVclPeer->getProperty
( rtl::OUString( name, strlen( name ), RTL_TEXTENCODING_ASCII_US ) );
}
void WindowImpl::setProperty (char const *name, uno::Any any)
{
if ( !this || !mxVclPeer.is() )
return;
mxVclPeer->setProperty
( rtl::OUString( name, strlen( name ), RTL_TEXTENCODING_ASCII_US ), any );
}
void WindowImpl::redraw (bool resize)
{
uno::Reference <awt::XWindow> ref (mxWindow, uno::UNO_QUERY);
::Window* window = VCLXWindow::GetImplementation (ref)->GetWindow ();
::Window* parent = window->GetParent();
::Rectangle r = Rectangle (parent->GetPosPixel (),
parent->GetSizePixel ());
parent->Invalidate (r, INVALIDATE_CHILDREN | INVALIDATE_NOCHILDREN );
if (resize)
parent->SetPosSizePixel (0, 0, 1, 1, awt::PosSize::SIZE);
else
parent->SetPosSizePixel (0, 0, r.nRight - r.nLeft, r.nBottom - r.nTop,
awt::PosSize::SIZE);
}
Window::Window( WindowImpl *pImpl )
: mpImpl( pImpl )
{
mpImpl->mvclWindow = GetVCLXWindow () ? GetWindow () : 0;
}
Window::~Window()
{
/* likely to be an UNO object - with floating references */
if (mpImpl)
mpImpl->wrapperGone ();
mpImpl = 0;
}
///IMPL_GET_IMPL( Control );
static ControlImpl* null_control_impl = 0;
ControlImpl &Control::getImpl () const
{
if (ControlImpl* c = static_cast<ControlImpl *>(mpImpl))
return *c;
return *null_control_impl;
}
Control::~Control ()
{
SetGetFocusHdl (Link ());
SetLoseFocusHdl (Link ());
}
void Window::setRes (ResId const& res)
{
#if RESOURCE_PUBLISH_PROTECTED
// Resources are shut-off from use. Is that really necessary?
Resource &r = *GetWindow ();
r.GetRes (res);
#else /* !RESOURCE_PUBLISH_PROTECTED */
//We *must* derive. Is this also really necessary?
//Resource r (res);
// ugh, I wonder which solution is cleaner...
class Resource_open_up : public Resource
{
public:
Resource_open_up (ResId const& r)
: Resource (r)
{
}
static sal_Int32 GetLongRes (void *p)
{
return Resource::GetLongRes (p);
}
void* GetClassRes ()
{
return Resource::GetClassRes ();
}
sal_Int32 ReadLongRes ()
{
return Resource::ReadLongRes ();
}
UniString ReadStringRes ()
{
return Resource::ReadStringRes ();
}
rtl::OString ReadByteStringRes()
{
return Resource::ReadByteStringRes();
}
};
Resource_open_up r (res);
#endif /* !RESOURCE_PUBLISH_PROTECTED */
sal_uInt32 mask = r.ReadLongRes ();
if (mask & WINDOW_HELPID)
SetHelpId (r.ReadByteStringRes());
if ( mask & WINDOW_TEXT )
SetText( r.ReadStringRes ());
}
void Window::SetParent( ::Window *parent )
{
uno::Reference <awt::XWindow> ref( GetPeer(), uno::UNO_QUERY );
if (VCLXWindow *vcl = VCLXWindow::GetImplementation( ref ))
if (::Window *window = vcl->GetWindow())
window->SetParent( parent );
}
void Window::SetParent( Window *parent )
{
/* Let's hear it for C++: poor man's dynamic binding. */
parent->ParentSet (this);
}
void Window::ParentSet (Window *window)
{
window->SetParent (GetWindow ());
}
Context *Window::getContext()
{
return this && mpImpl ? mpImpl->mpCtx : NULL;
}
PeerHandle Window::GetPeer() const
{
if ( !mpImpl )
return PeerHandle();
return mpImpl->mxWindow;
}
uno::Reference<awt::XWindow> Window::GetRef() const
{
return uno::Reference <awt::XWindow> ( GetPeer(), uno::UNO_QUERY );
}
VCLXWindow* Window::GetVCLXWindow() const
{
return VCLXWindow::GetImplementation( GetRef() );
}
::Window* Window::GetWindow() const
{
return GetVCLXWindow()->GetWindow();
}
::Window* Window::GetParent() const
{
return GetWindow()->GetParent();
}
void Window::SetHelpId( const rtl::OString& id )
{
GetWindow()->SetHelpId( id );
}
void Window::Invalidate (sal_uInt8 flags)
{
GetWindow ()->Invalidate (flags);
}
struct ToolkitVclPropsMap
{
WinBits vclStyle;
long initAttr;
const char *propName;
// the value to give the prop to enable/disable it -- not the most brilliant
// type declaration and storage, but does the work... properties are
// either a boolean or a short since they are either a directly wrappers for
// a WinBit, or aggregates related (like Align for WB_LEFT, _RIGHT and _CENTER).
bool isBoolean;
short enableProp, disableProp;
};
#define TYPE_BOOL true
#define TYPE_SHORT false
#define NOTYPE 0
static const ToolkitVclPropsMap toolkitVclPropsMap[] =
{
{ WB_BORDER, awt::WindowAttribute::BORDER, "Border", TYPE_SHORT, 1, 0 },
{ WB_NOBORDER, awt::VclWindowPeerAttribute::NOBORDER, "Border", TYPE_SHORT, 0, 1 },
{ WB_SIZEABLE, awt::WindowAttribute::SIZEABLE, NULL, NOTYPE, 0, 0 },
{ WB_MOVEABLE, awt::WindowAttribute::MOVEABLE, NULL, NOTYPE, 0, 0 },
{ WB_CLOSEABLE, awt::WindowAttribute::CLOSEABLE, NULL, NOTYPE, 0, 0 },
{ WB_HSCROLL, awt::VclWindowPeerAttribute::HSCROLL, NULL, NOTYPE, 0, 0 },
{ WB_VSCROLL, awt::VclWindowPeerAttribute::VSCROLL, NULL, NOTYPE, 0, 0 },
{ WB_LEFT, awt::VclWindowPeerAttribute::LEFT, "Align", TYPE_SHORT, 0, 0 },
{ WB_CENTER, awt::VclWindowPeerAttribute::CENTER, "Align", TYPE_SHORT, 1, 0 },
{ WB_RIGHT, awt::VclWindowPeerAttribute::RIGHT, "Align", TYPE_SHORT, 2, 0 },
{ WB_SPIN, awt::VclWindowPeerAttribute::SPIN, NULL, NOTYPE, 0, 0 },
{ WB_SORT, awt::VclWindowPeerAttribute::SORT, NULL, NOTYPE, 0, 0 },
{ WB_DROPDOWN, awt::VclWindowPeerAttribute::DROPDOWN, "Dropdown", TYPE_BOOL, 1, 0 },
{ WB_DEFBUTTON, awt::VclWindowPeerAttribute::DEFBUTTON, "DefaultButton", TYPE_BOOL, 1, 0 },
{ WB_READONLY, awt::VclWindowPeerAttribute::READONLY, NULL, NOTYPE, 0, 0 },
{ WB_CLIPCHILDREN, awt::VclWindowPeerAttribute::CLIPCHILDREN, NULL, NOTYPE, 0, 0 },
{ WB_GROUP, awt::VclWindowPeerAttribute::GROUP, NULL, NOTYPE, 0, 0 },
{ WB_OK, awt::VclWindowPeerAttribute::OK, NULL, NOTYPE, 0, 0 },
{ WB_OK_CANCEL, awt::VclWindowPeerAttribute::OK_CANCEL, NULL, NOTYPE, 0, 0 },
{ WB_YES_NO, awt::VclWindowPeerAttribute::YES_NO, NULL, NOTYPE, 0, 0 },
{ WB_YES_NO_CANCEL, awt::VclWindowPeerAttribute::YES_NO_CANCEL, NULL, NOTYPE, 1, 0 },
{ WB_RETRY_CANCEL, awt::VclWindowPeerAttribute::RETRY_CANCEL, NULL, NOTYPE, 1, 0 },
{ WB_DEF_OK, awt::VclWindowPeerAttribute::DEF_OK, NULL, NOTYPE, 0, 0 },
{ WB_DEF_CANCEL, awt::VclWindowPeerAttribute::DEF_CANCEL, NULL, NOTYPE, 1, 0 },
{ WB_DEF_RETRY, awt::VclWindowPeerAttribute::DEF_RETRY, NULL, NOTYPE, 0, 0 },
{ WB_DEF_YES, awt::VclWindowPeerAttribute::DEF_YES, NULL, NOTYPE, 0, 0 },
{ WB_DEF_NO, awt::VclWindowPeerAttribute::DEF_NO, NULL, NOTYPE, 0, 0 },
{ WB_AUTOHSCROLL, awt::VclWindowPeerAttribute::AUTOHSCROLL, "AutoHScroll", TYPE_BOOL, 1, 0 },
{ WB_AUTOVSCROLL, awt::VclWindowPeerAttribute::AUTOVSCROLL, "AutoVScroll", TYPE_BOOL, 1, 0 },
{ WB_WORDBREAK, 0, "MultiLine", TYPE_BOOL, 1, 0 },
{ WB_NOPOINTERFOCUS, 0, "FocusOnClick", TYPE_BOOL, 1, 0 },
{ WB_TOGGLE, 0, "Toggle", TYPE_BOOL, 1, 0 },
{ WB_REPEAT, 0, "Repeat", TYPE_BOOL, 1, 0 },
{ WB_NOHIDESELECTION, 0, "HideInactiveSelection", TYPE_BOOL, 1, 0 },
};
#undef TYPE_BOOL
#undef TYPE_SHORT
#undef NOTYPE
static const int toolkitVclPropsMapLen =
sizeof( toolkitVclPropsMap ) / sizeof( ToolkitVclPropsMap );
/* Unpleasant way to get an xToolkit pointer ... */
uno::Reference< awt::XToolkit > getToolkit()
{
static uno::Reference< awt::XToolkit > xToolkit;
if (!xToolkit.is())
{
// Urgh ...
xToolkit = uno::Reference< awt::XToolkit >(
::comphelper::getProcessServiceFactory()->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.Toolkit" ) ) ),
uno::UNO_QUERY );
if ( !xToolkit.is() )
throw uno::RuntimeException(
OUString( RTL_CONSTASCII_USTRINGPARAM( "failed to create toolkit!") ),
uno::Reference< uno::XInterface >() );
}
return xToolkit;
}
PeerHandle Window::CreatePeer( Window *parent, WinBits nStyle, const char *pName)
{
long nWinAttrbs = 0;
for (int i = 0; i < toolkitVclPropsMapLen; i++)
if ( nStyle & toolkitVclPropsMap[ i ].vclStyle )
nWinAttrbs |= toolkitVclPropsMap[ i ].initAttr;
return layoutimpl::WidgetFactory::createWidget (getToolkit(), parent->GetPeer(), OUString::createFromAscii( pName ), nWinAttrbs);
}
void Window::Show( bool bVisible )
{
if ( !getImpl().mxWindow.is() )
return;
getImpl().mxWindow->setVisible( bVisible );
if (!bVisible)
getImpl ().bFirstTimeVisible = true;
else if (GetParent() && getImpl().bFirstTimeVisible)
{
getImpl().redraw ();
getImpl().bFirstTimeVisible = false;
}
}
void Window::SetText( OUString const& str )
{
GetWindow()->SetText( str );
}
ControlImpl::ControlImpl (Context *context, const PeerHandle &peer, Window *window)
: WindowImpl( context, peer, window )
{
}
ControlImpl::~ControlImpl ()
{
if ((!!mGetFocusHdl || !!mLoseFocusHdl) && mxWindow.is ())
/* Disposing will be done @ VCLXWindow::dispose () maFocusListeners.disposeAndClear()
don't do it twice */
mxWindow.clear ();
}
void ControlImpl::SetGetFocusHdl (Link const& link)
{
if (!mLoseFocusHdl || !link)
UpdateListening (link);
mGetFocusHdl = link;
}
Link& ControlImpl::GetGetFocusHdl ()
{
return mGetFocusHdl;
}
void ControlImpl::SetLoseFocusHdl (Link const& link)
{
if (!mGetFocusHdl || !link)
UpdateListening (link);
mLoseFocusHdl = link;
}
Link& ControlImpl::GetLoseFocusHdl ()
{
return mGetFocusHdl;
}
void ControlImpl::UpdateListening (Link const& link)
{
if (!link && (!!mGetFocusHdl || !!mLoseFocusHdl)
&& (!mGetFocusHdl || !mLoseFocusHdl))
mxWindow->removeFocusListener (this);
else if (!!link && !mGetFocusHdl && !mLoseFocusHdl)
mxWindow->addFocusListener (this);
}
void SAL_CALL ControlImpl::disposing (lang::EventObject const&)
throw (uno::RuntimeException)
{
/// mxWindow.clear ();
}
void SAL_CALL ControlImpl::focusGained (awt::FocusEvent const&)
throw (uno::RuntimeException)
{
mGetFocusHdl.Call (mpWindow);
}
void SAL_CALL ControlImpl::focusLost (awt::FocusEvent const&)
throw (uno::RuntimeException)
{
mLoseFocusHdl.Call (mpWindow);
}
Link& Control::GetGetFocusHdl ()
{
return getImpl ().GetGetFocusHdl ();
}
void Control::SetGetFocusHdl (Link const& link)
{
if (&getImpl () && getImpl().mxWindow.is ())
getImpl ().SetGetFocusHdl (link);
}
Link& Control::GetLoseFocusHdl ()
{
return getImpl ().GetLoseFocusHdl ();
}
void Control::SetLoseFocusHdl (Link const& link)
{
if (&getImpl () && getImpl().mxWindow.is ())
getImpl ().SetLoseFocusHdl (link);
}
class DialogImpl : public WindowImpl
{
public:
uno::Reference< awt::XDialog2 > mxDialog;
DialogImpl( Context *context, PeerHandle const &peer, Window *window );
};
DialogImpl::DialogImpl( Context *context, const PeerHandle &peer, Window *window )
: WindowImpl( context, peer, window )
, mxDialog( peer, uno::UNO_QUERY )
{
}
Dialog::Dialog( Window *parent, const char *xml_file, const char *id, sal_uInt32 nId )
: Context( xml_file )
, Window( new DialogImpl( this, Context::GetPeerHandle( id, nId ), this ) )
, bConstruct (true)
{
if ( parent )
SetParent( parent );
}
Dialog::Dialog( ::Window *parent, const char *xml_file, const char *id, sal_uInt32 nId )
: Context( xml_file )
, Window( new DialogImpl( this, Context::GetPeerHandle( id, nId ), this ) )
{
if ( parent )
SetParent( parent );
}
Dialog::~Dialog ()
{
}
IMPL_GET_WINDOW (Dialog);
IMPL_GET_IMPL (Dialog);
#define MX_DIALOG if (getImpl ().mxDialog.is ()) getImpl ().mxDialog
#define RETURN_MX_DIALOG if (getImpl ().mxDialog.is ()) return getImpl ().mxDialog
short Dialog::Execute()
{
RETURN_MX_DIALOG->execute ();
return -1;
}
void Dialog::EndDialog( long result )
{
MX_DIALOG->endDialog (result);
}
void Dialog::SetText( OUString const& str )
{
SetTitle (str);
}
void Dialog::SetTitle( OUString const& str )
{
MX_DIALOG->setTitle (str);
}
bool Dialog::Close ()
{
EndDialog (false);
return true;
}
long Dialog::Notify (NotifyEvent& event)
{
return GetDialog ()->Notify (event);
}
void Dialog::Initialize (SfxChildWinInfo*)
{
}
#define MESSAGE_BOX_MEMBER_INIT\
Dialog (parent, xml_file, id)\
, imageError (this, "FI_ERROR")\
, imageInfo (this, "FI_INFO")\
, imageQuery (this, "FI_QUERY")\
, imageWarning (this, "FI_WARNING")\
, messageText (this, "FT_MESSAGE")\
, cancelButton (this, "BTN_CANCEL")\
, helpButton (this, "BTN_HELP")\
, ignoreButton (this, "BTN_IGNORE")\
, noButton (this, "BTN_NO")\
, retryButton (this, "BTN_RETRY")\
, yesButton (this, "BTN_YES")
MessageBox::MessageBox (::Window *parent, char const* message,
char const* yes, char const* no, const rtl::OString& help_id,
char const* xml_file, char const* id)
: MESSAGE_BOX_MEMBER_INIT
{
ignoreButton.Hide ();
retryButton.Hide ();
init (message, yes, no, help_id);
}
MessageBox::MessageBox (::Window *parent, OUString const& message,
OUString yes, OUString no, const rtl::OString& help_id,
char const* xml_file, char const* id)
: MESSAGE_BOX_MEMBER_INIT
{
ignoreButton.Hide ();
retryButton.Hide ();
init (message, yes, no, help_id);
}
#if !defined (__GNUC__)
#define __PRETTY_FUNCTION__ __FUNCTION__
#endif /* !__GNUC__ */
MessageBox::MessageBox (::Window *parent, WinBits bits, char const* message,
char const* yes, char const* no, const rtl::OString& help_id,
char const* xml_file, char const* id)
: MESSAGE_BOX_MEMBER_INIT
{
// HIG suggests using verbs instead of yes/no/retry etc.
// This constructor provides client-code compatibility: Client code should be fixed.
#ifndef __SUNPRO_CC
OSL_TRACE ("%s: warning, deprecated vcl/Messbox compatibility", __PRETTY_FUNCTION__);
#endif
bits_init (bits, OUString::createFromAscii (message), OUString::createFromAscii (yes), OUString::createFromAscii (no), help_id);
}
MessageBox::MessageBox (::Window *parent, WinBits bits, OUString const& message,
OUString yes, OUString no, const rtl::OString& help_id,
char const* xml_file, char const* id)
: MESSAGE_BOX_MEMBER_INIT
{
// HIG suggests using verbs instead of yes/no/retry etc.
// This constructor provides client-code compatibility: Client code should be fixed.
#ifndef __SUNPRO_CC
OSL_TRACE ("%s: warning, deprecated vcl/Messbox compatibility", __PRETTY_FUNCTION__);
#endif
bits_init (bits, message, yes, no, help_id);
}
void MessageBox::bits_init (WinBits bits, OUString const& message,
OUString yes, OUString no, const rtl::OString& help_id)
{
if ( bits & ( WB_OK_CANCEL | WB_OK ))
yes = Button::GetStandardText ( BUTTON_OK );
if ( bits & (WB_YES_NO | WB_YES_NO_CANCEL ))
{
yes = Button::GetStandardText ( BUTTON_YES );
no = Button::GetStandardText ( BUTTON_NO );
}
if (! (bits & (WB_RETRY_CANCEL | WB_YES_NO_CANCEL | WB_ABORT_RETRY_IGNORE )))
cancelButton.Hide ();
if (! (bits & (WB_RETRY_CANCEL | WB_ABORT_RETRY_IGNORE)))
retryButton.Hide ();
if ( bits & WB_ABORT_RETRY_IGNORE )
cancelButton.SetText ( Button::GetStandardText (BUTTON_ABORT));
else
ignoreButton.Hide ();
if ( !(bits & ( WB_OK | WB_OK_CANCEL | WB_YES_NO | WB_YES_NO_CANCEL)))
yesButton.Hide ();
if ( !(bits & ( WB_YES_NO | WB_YES_NO_CANCEL)))
noButton.Hide ();
init (message, yes, no, help_id);
}
void MessageBox::init (char const* message, char const* yes, char const* no, const rtl::OString& help_id)
{
init ( OUString::createFromAscii (message), OUString::createFromAscii (yes), OUString::createFromAscii (no), help_id);
}
void MessageBox::init (OUString const& message, OUString const& yes, OUString const& no, const rtl::OString& help_id)
{
imageError.Hide ();
imageInfo.Hide ();
imageQuery.Hide ();
imageWarning.Hide ();
if (message.getLength ())
messageText.SetText (message);
if (yes.getLength ())
{
yesButton.SetText (yes);
if (yes != OUString (Button::GetStandardText (BUTTON_OK))
&& yes != OUString (Button::GetStandardText (BUTTON_YES)))
SetTitle (yes);
if (no.getLength ())
noButton.SetText (no);
else
noButton.Hide ();
}
if (help_id.getLength() != 0)
SetHelpId (help_id);
else
helpButton.Hide ();
}
#undef MESSAGE_BOX_IMPL
#define MESSAGE_BOX_IMPL(Name)\
Name##Box::Name##Box (::Window *parent, char const* message,\
char const* yes, char const* no, const rtl::OString& help_id,\
char const* xml_file, char const* id)\
: MessageBox (parent, message, yes, no, help_id, xml_file, id)\
{\
image##Name.Show ();\
}\
Name##Box::Name##Box (::Window *parent, OUString const& message,\
OUString yes, OUString no, const rtl::OString& help_id,\
char const* xml_file, char const* id)\
: MessageBox (parent, message, yes, no, help_id, xml_file, id)\
{\
image##Name.Show ();\
}\
Name##Box::Name##Box (::Window *parent, WinBits bits, char const* message,\
char const* yes, char const* no, const rtl::OString& help_id,\
char const* xml_file, char const* id)\
: MessageBox (parent, bits, message, yes, no, help_id, xml_file, id)\
{\
image##Name.Show ();\
}\
Name##Box::Name##Box (::Window *parent, WinBits bits, OUString const& message,\
OUString yes, OUString no, const rtl::OString& help_id,\
char const* xml_file, char const* id)\
: MessageBox (parent, bits, message, yes, no, help_id, xml_file, id)\
{\
image##Name.Show ();\
}
MESSAGE_BOX_IMPL (Error);
MESSAGE_BOX_IMPL (Info);
MESSAGE_BOX_IMPL (Query);
MESSAGE_BOX_IMPL (Warning);
class TabControlImpl
: public ControlImpl
, public ::cppu::WeakImplHelper1 <awt::XTabListener>
{
Link mActivatePageHdl;
Link mDeactivatePageHdl;
public:
uno::Reference <awt::XSimpleTabController> mxTabControl;
TabControlImpl (Context *context, const PeerHandle &peer, Window *window)
: ControlImpl (context, peer, window)
, mxTabControl (peer, uno::UNO_QUERY)
{
}
virtual void SAL_CALL disposing (lang::EventObject const& e)
throw (uno::RuntimeException)
{
ControlImpl::disposing (e);
mxTabControl.clear ();
}
Link& GetActivatePageHdl ()
{
return mActivatePageHdl;
}
void SetActivatePageHdl (Link const& link)
{
if (!mDeactivatePageHdl || !link)
UpdateListening (link);
mActivatePageHdl = link;
}
Link& GetDeactivatePageHdl ()
{
return mDeactivatePageHdl;
}
void SetDeactivatePageHdl (Link const& link)
{
if (!mActivatePageHdl || !link)
UpdateListening (link);
mDeactivatePageHdl = link;
}
void UpdateListening (Link const& link)
{
if (!link && (!!mActivatePageHdl || !!mDeactivatePageHdl))
mxTabControl->removeTabListener (this);
else if (!!link && !mActivatePageHdl && !mDeactivatePageHdl)
mxTabControl->addTabListener (this);
}
void SAL_CALL activated (sal_Int32)
throw (uno::RuntimeException)
{
mActivatePageHdl.Call (mpWindow);
}
void SAL_CALL deactivated (sal_Int32)
throw (uno::RuntimeException)
{
mDeactivatePageHdl.Call (mpWindow);
}
void SAL_CALL inserted (sal_Int32)
throw (uno::RuntimeException)
{
}
void SAL_CALL removed (sal_Int32)
throw (uno::RuntimeException)
{
}
void SAL_CALL changed (sal_Int32, uno::Sequence <beans::NamedValue> const&)
throw (uno::RuntimeException)
{
}
};
IMPL_GET_WINDOW (TabControl);
IMPL_GET_LAYOUT_VCLXWINDOW (TabControl);
#define MX_TABCONTROL if (getImpl ().mxTabControl.is ()) getImpl ().mxTabControl
#define RETURN_MX_TABCONTROL if (getImpl ().mxTabControl.is ()) return getImpl ().mxTabControl
TabControl::~TabControl ()
{
SetActivatePageHdl (Link ());
SetDeactivatePageHdl (Link ());
}
void TabControl::InsertPage (sal_uInt16 id, OUString const& title, sal_uInt16 pos)
{
(void) pos;
MX_TABCONTROL->insertTab ();
SetCurPageId (id);
#if 1 // colour me loc productive -- NOT
#define ADD_PROP( seq, i, name, val )\
{ \
beans::NamedValue value; \
value.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( name ) ); \
value.Value = uno::makeAny( val ); \
seq[i] = value; \
}
uno::Sequence< beans::NamedValue > seq (1);
ADD_PROP ( seq, 0, "Title", OUString (title) );
MX_TABCONTROL->setTabProps (id, seq);
#else
GetTabPage (id)->SetText (title);
#endif
}
void TabControl::RemovePage (sal_uInt16 id)
{
GetTabControl ()->RemovePage (id);
}
sal_uInt16 TabControl::GetPageCount () const
{
return GetTabControl ()->GetPageCount ();
}
sal_uInt16 TabControl::GetPageId (sal_uInt16 pos) const
{
return GetTabControl ()->GetPageId (pos);
}
sal_uInt16 TabControl::GetPagePos (sal_uInt16 id) const
{
getImpl ().redraw ();
return GetTabControl ()->GetPagePos (id);
}
void TabControl::SetCurPageId (sal_uInt16 id)
{
getImpl ().redraw ();
GetTabControl ()->SetCurPageId (id);
}
sal_uInt16 TabControl::GetCurPageId () const
{
return GetTabControl ()->GetCurPageId ();
}
void TabControl::SetTabPage (sal_uInt16 id, ::TabPage* page)
{
GetTabControl ()->SetTabPage (id, page);
getImpl ().redraw ();
}
::TabPage* TabControl::GetTabPage (sal_uInt16 id) const
{
return GetTabControl ()->GetTabPage (id);
}
void TabControl::SetActivatePageHdl (Link const& link)
{
if (&getImpl () && getImpl().mxTabControl.is ())
getImpl ().SetActivatePageHdl (link);
}
Link& TabControl::GetActivatePageHdl () const
{
return getImpl ().GetActivatePageHdl ();
}
void TabControl::SetDeactivatePageHdl (Link const& link)
{
if (&getImpl () && getImpl().mxTabControl.is ())
getImpl ().SetDeactivatePageHdl (link);
}
Link& TabControl::GetDeactivatePageHdl () const
{
return getImpl ().GetDeactivatePageHdl ();
}
void TabControl::SetTabPageSizePixel (Size const& size)
{
GetTabControl ()->SetTabPageSizePixel (size);
}
Size TabControl::GetTabPageSizePixel () const
{
return GetTabControl ()->GetTabPageSizePixel ();
}
IMPL_CONSTRUCTORS (TabControl, Control, "tabcontrol");
IMPL_GET_IMPL (TabControl);
class TabPageImpl : public WindowImpl
{
public:
uno::Reference< awt::XWindow > mxTabPage;
TabPageImpl( Context *context, const PeerHandle &peer, Window *window )
: WindowImpl( context, peer, window )
, mxTabPage( peer, uno::UNO_QUERY )
{
}
};
::Window* TabPage::global_parent = 0;
TabControl* TabPage::global_tabcontrol = 0;
IMPL_GET_IMPL( TabPage );
TabPage::TabPage( Window *parent, const char *xml_file, const char *id, sal_uInt32 nId)
: Context( xml_file )
, Window( new TabPageImpl( this, Context::GetPeerHandle( id, nId ), this ) )
{
if ( parent )
SetParent( parent );
}
TabPage::TabPage( ::Window *parent, const char *xml_file, const char *id, sal_uInt32 nId)
: Context( xml_file )
, Window( new TabPageImpl( this, Context::GetPeerHandle( id, nId ), this ) )
{
if ( parent )
SetParent( parent );
}
TabPage::~TabPage()
{
delete GetTabPage();
}
IMPL_GET_WINDOW( TabPage );
void TabPage::ActivatePage()
{
}
void TabPage::DeactivatePage()
{
}
class FixedLineImpl : public ControlImpl
{
public:
FixedLineImpl( Context *context, const PeerHandle &peer, Window *window )
: ControlImpl( context, peer, window )
{
}
};
IMPL_CONSTRUCTORS( FixedLine, Control, "hfixedline" );
IMPL_GET_IMPL( FixedLine );
bool FixedLine::IsEnabled() const
{
//FIXME
return true;
}
class FixedTextImpl : public ControlImpl
{
public:
uno::Reference< awt::XFixedText > mxFixedText;
FixedTextImpl( Context *context, const PeerHandle &peer, Window *window )
: ControlImpl( context, peer, window )
, mxFixedText( peer, uno::UNO_QUERY )
{
}
~FixedTextImpl ();
virtual void SAL_CALL disposing( lang::EventObject const& e )
throw (uno::RuntimeException);
};
FixedTextImpl::~FixedTextImpl ()
{
}
void SAL_CALL FixedTextImpl::disposing( lang::EventObject const& e )
throw (uno::RuntimeException)
{
ControlImpl::disposing (e);
mxFixedText.clear ();
}
FixedText::~FixedText ()
{
}
IMPL_CONSTRUCTORS( FixedText, Control, "fixedtext" );
IMPL_GET_IMPL( FixedText );
void FixedText::SetText( OUString const& rStr )
{
if ( !getImpl().mxFixedText.is() )
return;
getImpl().mxFixedText->setText( rStr );
}
class FixedInfoImpl : public FixedTextImpl
{
public:
FixedInfoImpl( Context *context, const PeerHandle &peer, Window *window )
: FixedTextImpl( context, peer, window )
{
}
};
IMPL_CONSTRUCTORS( FixedInfo, FixedText, "fixedinfo" );
IMPL_GET_IMPL( FixedInfo );
class ProgressBarImpl : public ControlImpl
{
public:
uno::Reference< awt::XProgressBar > mxProgressBar;
ProgressBarImpl( Context *context, const PeerHandle &peer, Window *window )
: ControlImpl( context, peer, window )
, mxProgressBar( peer, uno::UNO_QUERY )
{
}
virtual void SAL_CALL disposing( lang::EventObject const& e )
throw (uno::RuntimeException)
{
ControlImpl::disposing (e);
mxProgressBar.clear ();
}
};
class FixedImageImpl: public ControlImpl
{
public:
uno::Reference< graphic::XGraphic > mxGraphic;
FixedImageImpl( Context *context, const PeerHandle &peer, Window *window)
: ControlImpl( context, peer, window )
, mxGraphic( peer, uno::UNO_QUERY )
{
if ( !mxGraphic.is() )
{
OSL_FAIL( "ERROR: failed to load image: `%s'" );
}
}
};
IMPL_CONSTRUCTORS( FixedImage, Control, "fixedimage" );
IMPL_GET_IMPL( FixedImage )
void FixedImage::setImage( ::Image const& i )
{
(void) i;
if ( !getImpl().mxGraphic.is() )
return;
//FIXME: hack moved to proplist
//getImpl().mxGraphic =
}
IMPL_CONSTRUCTORS( ProgressBar, Control, "ProgressBar" );
IMPL_GET_IMPL( ProgressBar );
void ProgressBar::SetForegroundColor( util::Color color )
{
if ( !getImpl().mxProgressBar.is() )
return;
getImpl().mxProgressBar->setForegroundColor( color );
}
void ProgressBar::SetBackgroundColor( util::Color color )
{
if ( !getImpl().mxProgressBar.is() )
return;
getImpl().mxProgressBar->setBackgroundColor( color );
}
void ProgressBar::SetValue( sal_Int32 i )
{
if ( !getImpl().mxProgressBar.is() )
return;
getImpl().mxProgressBar->setValue( i );
}
void ProgressBar::SetRange( sal_Int32 min, sal_Int32 max )
{
if ( !getImpl().mxProgressBar.is() )
return;
getImpl().mxProgressBar->setRange( min, max );
}
sal_Int32 ProgressBar::GetValue()
{
if ( !getImpl().mxProgressBar.is() )
return 0;
return getImpl().mxProgressBar->getValue();
}
class PluginImpl: public ControlImpl
{
public:
::Control *mpPlugin;
PluginImpl( Context *context, const PeerHandle &peer, Window *window, :: Control *plugin )
: ControlImpl( context, peer, window )
, mpPlugin( plugin )
{
uno::Reference <awt::XWindow> ref( mxWindow, uno::UNO_QUERY );
layoutimpl::VCLXPlugin *vcl
= static_cast<layoutimpl::VCLXPlugin*>( VCLXWindow::GetImplementation( ref ) );
::Window *parent = vcl->mpWindow->GetParent();
vcl->SetWindow( plugin );
vcl->SetPlugin( mpPlugin );
plugin->SetParent( parent );
plugin->SetStyle( vcl->mStyle );
plugin->SetCreatedWithToolkit( true );
plugin->SetComponentInterface( vcl );
plugin->Show();
}
};
Plugin::Plugin( Context *context, char const *id, ::Control *plugin )
: Control( new PluginImpl( context, context->GetPeerHandle( id, 0 ), this, plugin ) )
, mpPlugin( plugin )
{
}
IMPL_GET_IMPL( Plugin );
class LocalizedStringImpl : public WindowImpl
{
public:
layoutimpl::LocalizedString *mpString;
OUString maString;
LocalizedStringImpl( Context *context, const PeerHandle &peer, Window *window )
: WindowImpl( context, peer, window )
, mpString( static_cast<layoutimpl::LocalizedString*>( VCLXWindow::GetImplementation( uno::Reference <awt::XWindow> ( mxWindow, uno::UNO_QUERY ) ) ) )
, maString ()
{
}
OUString getText()
{
if (mpString)
maString = mpString->getText ();
return maString;
}
void setText( OUString const& s )
{
if (mpString)
mpString->setText( s );
}
};
IMPL_GET_IMPL( LocalizedString );
LocalizedString::LocalizedString( Context *context, char const* id )
: Window( new LocalizedStringImpl( context, context->GetPeerHandle( id, 0 ), this ) )
{
}
String LocalizedString::getString ()
{
return getImpl ().getText ();
}
OUString LocalizedString::getOUString ()
{
return getImpl ().getText ();
}
LocalizedString::operator OUString ()
{
return getOUString ();
}
LocalizedString::operator OUString const& ()
{
getOUString ();
return getImpl ().maString;
}
LocalizedString::operator String()
{
getOUString ();
return getImpl ().maString;
}
String LocalizedString::GetToken (sal_uInt16 i, sal_Char c)
{
return getString ().GetToken (i, c);
}
OUString LocalizedString::operator= (OUString const& s)
{
getImpl().setText( s );
return getImpl().getText();
}
OUString LocalizedString::operator+= (OUString const& b)
{
OUString a = getImpl ().getText ();
a += b;
getImpl ().setText (a);
return getImpl ().getText ();
}
OUString LocalizedString::operator+= (sal_Unicode const b)
{
String a = getImpl ().getText ();
a += b;
getImpl ().setText (a);
return getImpl ().getText ();
}
class InPlugImpl : public WindowImpl
{
public:
InPlugImpl (Context *context, const PeerHandle &peer, Window *window)
: WindowImpl (context, peer, window)
{
}
};
IMPL_GET_IMPL (InPlug);
static char const *FIXME_set_parent (::Window *parent, char const *xml_file)
{
layout::TabPage::global_parent = parent;
return xml_file;
}
InPlug::InPlug (Window *parent, char const* xml_file, char const* id, sal_uInt32 nId)
: Context (FIXME_set_parent (parent ? parent->GetWindow () : 0, xml_file))
, layout::Window (new InPlugImpl (this, Context::GetPeerHandle (id, nId), this))
{
if (parent)
SetParent (parent);
if (::Window *w = dynamic_cast< ::Window* > (this))
w->SetComponentInterface (GetVCLXWindow ());
}
InPlug::InPlug (::Window *parent, char const* xml_file, char const* id, sal_uInt32 nId)
: Context (FIXME_set_parent (parent, xml_file))
, layout::Window (new InPlugImpl (this, Context::GetPeerHandle (id, nId), this))
{
if (parent)
layout::Window::SetParent (parent);
if (::Window *w = dynamic_cast< ::Window* > (this))
w->SetComponentInterface (GetVCLXWindow ());
}
void InPlug::ParentSet (Window *window)
{
window->SetParent (dynamic_cast< ::Window* > (this));
/// FIXME: for standalone run of layout::SfxTabDialog
SetParent (window->GetParent ());
}
} // namespace layout
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */