blob: 3db9554b880de8241fb243e93b8b32d027b923b5 [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.
*
*************************************************************/
#include "import.hxx"
#include <com/sun/star/awt/XButton.hpp>
#include <com/sun/star/awt/XDialog2.hpp>
#include <vcl/image.hxx>
#include <tools/debug.hxx>
#include <layout/layout.hxx>
#include "root.hxx"
#include "helper.hxx"
#include "dialogbuttonhbox.hxx"
#define XMLNS_LAYOUT_URI "http://openoffice.org/2007/layout"
#define XMLNS_CONTAINER_URI "http://openoffice.org/2007/layout/container"
namespace layoutimpl
{
using namespace css;
using ::rtl::OUString;
ElementBase::~ElementBase()
SAL_THROW( () )
{
//delete mpImport;
//mpImport = 0;
}
//** parser
WidgetElement::WidgetElement ( sal_Int32 nUid, const OUString &rName,
uno::Reference <xml::input::XAttributes> const &attributes,
ElementBase *pParent,
ImportContext *pImport)
SAL_THROW (())
: ElementBase( nUid, rName, attributes, pParent, pImport )
{
OUString name = rName.toAsciiLowerCase();
PropList aProps;
propsFromAttributes( attributes, aProps, pImport->XMLNS_LAYOUT_UID );
OUString aId;
findAndRemove( "id", aProps, aId );
OUString aLang;
findAndRemove( "xml-lang", aProps, aLang );
{
//DEBUG
uno::Reference< awt::XLayoutConstrains > xParent;
if ( pParent )
xParent = ((WidgetElement *) pParent)->mpWidget->getPeer();
mpWidget = pImport->mrRoot.create( aId, name,
getAttributeProps( aProps ), uno::Reference< awt::XLayoutContainer >( xParent, uno::UNO_QUERY ) );
}
// TODO: handle with non-existing widgets
mpWidget->setProperties( aProps );
uno::Reference< awt::XDialog2 > xDialog( mpWidget->getPeer(), uno::UNO_QUERY );
if ( xDialog.is() )
{
OUString aTitle;
if ( findAndRemove( "title", aProps, aTitle ) )
{
OSL_TRACE("Setting title: %s", OUSTRING_CSTR( aTitle ) );
xDialog->setTitle( aTitle );
}
OUString aHelpId;
if ( findAndRemove( "help-id", aProps, aHelpId ) )
{
OSL_TRACE("Setting help-id: %s", OUSTRING_CSTR( aHelpId ) );
xDialog->setHelpId( aHelpId );
}
} // DEBUG:
else if ( pParent == NULL )
{
DBG_ERROR( "Fatal error: top node isn't a dialog" );
}
OUString aOrdering;
if ( findAndRemove( "ordering", aProps, aOrdering ) )
if ( DialogButtonHBox *b = dynamic_cast<DialogButtonHBox *> ( mpWidget->getPeer().get() ) )
b->setOrdering ( aOrdering );
bool bSetRadioGroup;
OUString aRadioGroup;
bSetRadioGroup = findAndRemove( "radiogroup", aProps, aRadioGroup );
mpWidget->setProperties( aProps );
// we need to add radio buttons to the group after their properties are
// set, so we can check if they should be the one selected by default or not.
// And the state changed event isn't fired when changing properties.
uno::Reference< awt::XRadioButton > xRadio( mpWidget->getPeer(), uno::UNO_QUERY );
if ( xRadio.is() )
{
if (!bSetRadioGroup)
aRadioGroup = OUString::createFromAscii ("default");
pImport->mxRadioGroups.addItem( aRadioGroup, xRadio );
}
}
WidgetElement::~WidgetElement()
{
//delete mpWidget;
//mpWidget = 0;
}
uno::Reference <xml::input::XElement>
WidgetElement::startChildElement ( sal_Int32 nUid, OUString const &name,
uno::Reference <xml::input::XAttributes> const &attributes )
throw( xml::sax::SAXException, uno::RuntimeException )
{
// Adding a child to the widget
WidgetElement *pChild = new WidgetElement ( nUid, name, attributes, this, mpImport );
if ( !mpWidget->addChild( pChild->mpWidget ) )
{
DBG_ERROR2( "ERROR: cannot add %s to container %s, container full", OUSTRING_CSTR( name ), OUSTRING_CSTR( getLocalName() ) );
throw xml::sax::SAXException();
}
PropList aProps;
propsFromAttributes( attributes, aProps, mpImport->XMLNS_CONTAINER_UID );
mpWidget->setChildProperties( pChild->mpWidget, aProps );
return pChild;
}
// Support Ivo Hinkelmann's move label/text/title attribute to CONTENT
// transex3 hack.
void SAL_CALL
WidgetElement::characters( OUString const& rChars )
throw (xml::sax::SAXException, uno::RuntimeException)
{
if ( mpWidget && rChars.trim().getLength() )
{
uno::Reference< awt::XDialog2 > xDialog( mpWidget->getPeer(), uno::UNO_QUERY );
uno::Reference< awt::XButton > xButton( mpWidget->getPeer(), uno::UNO_QUERY );
if ( xDialog.is() )
xDialog->setTitle( rChars );
else if ( xButton.is() )
mpWidget->setProperty( OUString::createFromAscii( "label" ), rChars );
else
mpWidget->setProperty( OUString::createFromAscii( "text" ), rChars );
}
}
// ---- ElementBase ----
ElementBase::ElementBase( sal_Int32 nUid, OUString const & rLocalName,
uno::Reference< xml::input::XAttributes > const & xAttributes,
ElementBase* pParent,
ImportContext* pImport )
SAL_THROW(())
: mpImport( pImport )
, mpParent( pParent )
, mnUid( nUid )
, maLocalName( rLocalName )
, mxAttributes( xAttributes )
{
}
// ---- ImportContext ----
void ImportContext::startDocument(
uno::Reference< xml::input::XNamespaceMapping > const & xNamespaceMapping )
throw (xml::sax::SAXException, uno::RuntimeException)
{
XMLNS_LAYOUT_UID = xNamespaceMapping->getUidByUri(
OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_LAYOUT_URI ) ) );
XMLNS_CONTAINER_UID = xNamespaceMapping->getUidByUri(
OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_CONTAINER_URI ) ) );
}
ToplevelElement::ToplevelElement (OUString const &rName,
uno::Reference <xml::input::XAttributes> const &xAttributes,
ImportContext *pImport)
SAL_THROW(())
: WidgetElement( 0, rName, xAttributes, NULL, pImport )
{
}
ToplevelElement::~ToplevelElement()
{
}
uno::Reference< xml::input::XElement > ImportContext::startRootElement(
sal_Int32 nUid, OUString const & rLocalName,
uno::Reference< xml::input::XAttributes > const & xAttributes )
throw (xml::sax::SAXException, uno::RuntimeException)
{
if ( XMLNS_LAYOUT_UID != nUid )
throw xml::sax::SAXException(
OUString( RTL_CONSTASCII_USTRINGPARAM( "invalid namespace!" ) ),
uno::Reference< uno::XInterface >(), uno::Any() );
return new ToplevelElement( rLocalName, xAttributes, this );
}
RadioGroups::RadioGroups()
{
}
void RadioGroups::addItem( rtl::OUString id, uno::Reference< awt::XRadioButton > xRadio )
throw (uno::RuntimeException)
{
if ( ! xRadio.is() )
throw uno::RuntimeException();
uno::Reference< RadioGroup > group;
RadioGroupsMap::iterator it = mxRadioGroups.find( id );
if ( it == mxRadioGroups.end() )
{
group = uno::Reference< RadioGroup > ( new RadioGroup() );
mxRadioGroups [id] = group;
}
else
group = it->second;
group->addItem( xRadio );
}
RadioGroups::RadioGroup::RadioGroup()
{
}
void RadioGroups::RadioGroup::addItem( uno::Reference< awt::XRadioButton > xRadio )
{
if ( ! mxSelectedRadio.is() )
{
xRadio->setState( true );
mxSelectedRadio = xRadio;
}
else if ( xRadio->getState() )
{
#if 1
xRadio->setState( false );
#else // huh, why select last added?
mxSelectedRadio->setState( false );
mxSelectedRadio = xRadio;
#endif
}
// TOO late: actionPerformed is called before itemStateChanged.
// If client code (wrongly?) uses actionPerformed, it will see
// the previous RadioButtons' state.
xRadio->addItemListener( this );
uno::Reference< awt::XButton > xButton = uno::Reference< awt::XButton > ( xRadio, uno::UNO_QUERY );
xButton->addActionListener( this );
mxRadios.push_back (xRadio);
}
void RadioGroups::RadioGroup::handleSelected ()
throw (uno::RuntimeException)
{
for ( RadioButtonsList::iterator it = mxRadios.begin();
it != mxRadios.end(); it++ )
if ( *it != mxSelectedRadio && (*it)->getState() )
{
mxSelectedRadio->setState( false );
mxSelectedRadio = *it;
break;
}
}
// awt::XItemListener
void RadioGroups::RadioGroup::itemStateChanged( const awt::ItemEvent& e )
throw (uno::RuntimeException)
{
// TOO late: actionPerformed is called before itemStateChanged.
// If client code (wrongly?) uses actionPerformed, it will see
// the previous RadioButtons' state.
// Need this for initialization, though.
if ( e.Selected )
handleSelected ();
}
// awt::XActionListener
void RadioGroups::RadioGroup::actionPerformed( const awt::ActionEvent& )
throw (uno::RuntimeException)
{
handleSelected ();
}
// lang::XEventListener
void SAL_CALL RadioGroups::RadioGroup::disposing( const lang::EventObject& )
throw (uno::RuntimeException)
{
}
} // namespace layoutimpl