summaryrefslogtreecommitdiff
path: root/toolkit/source/layout/core/import.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/source/layout/core/import.cxx')
-rw-r--r--toolkit/source/layout/core/import.cxx336
1 files changed, 336 insertions, 0 deletions
diff --git a/toolkit/source/layout/core/import.cxx b/toolkit/source/layout/core/import.cxx
new file mode 100644
index 000000000000..daaa8c239f50
--- /dev/null
+++ b/toolkit/source/layout/core/import.cxx
@@ -0,0 +1,336 @@
+/*************************************************************************
+ *
+ * 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 "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.toInt32 () );
+ }
+ } // DEBUG:
+ else if ( pParent == NULL )
+ {
+ DBG_ERROR( "Fatal error: top node isn't a dialog" );
+ }
+
+#if 0
+ // Hack moved to proplist.cxx
+ OUString aGraphic;
+ if ( findAndRemove( "graphic", aProps, aGraphic ) )
+ //if ( layout::FixedImage *i = dynamic_cast<layout::FixedImage *> ( mpWidget->getPeer().get() ) )
+ // FIXME: huh? XImageProducer::complete( XImageConsumer )
+ //i->setImage( Image( loadGraphic( OUSTRING_CSTR( aGraphic ) ) ) );
+ mpWidget->setProperty( OUString::createFromAscii( "graphic" ),
+ loadGraphic( OUSTRING_CSTR( aGraphic ) ) );
+#endif
+
+ 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