summaryrefslogtreecommitdiff
path: root/toolkit/source/layout/import.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/source/layout/import.hxx')
-rw-r--r--toolkit/source/layout/import.hxx283
1 files changed, 283 insertions, 0 deletions
diff --git a/toolkit/source/layout/import.hxx b/toolkit/source/layout/import.hxx
new file mode 100644
index 000000000000..e4b43ab78df3
--- /dev/null
+++ b/toolkit/source/layout/import.hxx
@@ -0,0 +1,283 @@
+#ifndef IMPORT_HXX
+#define IMPORT_HXX
+
+#include <map>
+#include <list>
+#include <hash_map>
+
+#include <com/sun/star/xml/input/XRoot.hpp>
+#include <cppuhelper/implbase1.hxx>
+
+namespace layoutimpl
+{
+class LayoutRoot;
+class LayoutWidget;
+namespace css = ::com::sun::star;
+
+/* blocks under IMPORT_RADIOGROUP are marked for deletion.
+ The use of it is to synchronize radio buttons into groups.
+ But toolkit doesn't fire toggle events when toggled from the code.
+ Another approach is to implement our own XRadioButton from our
+ internal toolkit. We could have some singleton where they would
+ register... We would need to add another attribute...
+*/
+
+#ifdef IMPORT_RADIOGROUP
+#include <com/sun/star/awt/XRadioButton.hpp>
+class RadioGroups
+{
+public:
+ RadioGroups()
+ {
+ }
+
+ void addItem( rtl::OUString id, css::uno::Reference< css::awt::XRadioButton > xRadio )
+ throw (css::uno::RuntimeException)
+ {
+ if ( ! xRadio.is() )
+ throw css::uno::RuntimeException();
+
+ css::uno::Reference< RadioGroup > group;
+ RadioGroupsMap::iterator it = mxRadioGroups.find( id );
+ if ( it == mxRadioGroups.end() )
+ {
+ group = css::uno::Reference< RadioGroup > ( new RadioGroup() );
+ mxRadioGroups [id] = group;
+ }
+ else
+ group = it->second;
+ group->addItem( xRadio );
+ }
+
+private:
+ class RadioGroup : public ::cppu::WeakImplHelper1< css::awt::XItemListener >
+ {
+ public:
+ RadioGroup()
+ {
+ }
+
+ void addItem( css::uno::Reference< css::awt::XRadioButton > xRadio )
+ {
+ if ( ! mxSelectedRadio.is() )
+ {
+ xRadio->setState( true );
+ mxSelectedRadio = xRadio;
+ }
+ else if ( xRadio->getState() )
+ {
+ mxSelectedRadio->setState( false );
+ mxSelectedRadio = xRadio;
+ }
+
+ xRadio->addItemListener( this );
+ mxRadios.push_back (xRadio);
+ }
+
+ private:
+ typedef std::list< css::uno::Reference< css::awt::XRadioButton > > RadioButtonsList;
+ RadioButtonsList mxRadios;
+ css::uno::Reference< css::awt::XRadioButton > mxSelectedRadio;
+
+ // awt::XItemListener
+ void itemStateChanged( const com::sun::star::awt::ItemEvent& e)
+ throw (css::uno::RuntimeException)
+ {
+ if ( e.Selected )
+ {
+ mxSelectedRadio->setState( false );
+ // the only radio button selected would be the one that fired the event
+ for( RadioButtonsList::iterator it = mxRadios.begin(); it != mxRadios.end(); it++ )
+ if ( (*it)->getState() )
+ {
+ mxSelectedRadio = *it;
+ break;
+ }
+ }
+ }
+
+ // lang::XEventListener
+ void SAL_CALL disposing( const css::lang::EventObject& )
+ throw (css::uno::RuntimeException)
+ {
+ }
+ };
+
+ // each RadioGroup will stay alive after RadioGroups die with the ImportContext
+ // because they are referenced by every XRadioButton through the listener
+ typedef std::map< rtl::OUString, css::uno::Reference< RadioGroup > > RadioGroupsMap;
+ RadioGroupsMap mxRadioGroups;
+};
+#endif
+
+#if 0
+// generator
+class Widget
+{
+public:
+ Widget( css::uno::Reference< css::awt::XToolkit > xToolkit,
+ css::uno::Reference< css::awt::XWindow > xToplevel,
+ rtl::OUString unoName, long attrbs );
+ virtual ~Widget();
+
+ virtual void setProperties( const PropList &rProps );
+
+ virtual bool addChild( Widget *pChild );
+ virtual void setChildProperties( Widget *pChild, const PropList &rProps );
+
+ inline css::uno::Reference< css::awt::XLayoutConstrains > getPeer()
+ { return mxWidget; }
+
+ inline css::uno::Reference< css::awt::XLayoutConstrains > getContainer()
+ { return mxContainer; }
+
+protected:
+ css::uno::Reference< css::awt::XLayoutConstrains > mxWidget;
+ css::uno::Reference< css::awt::XLayoutContainer > mxContainer;
+};
+
+class Root
+{
+public:
+ Root( css::uno::Reference< css::awt::XToolkit > xToolkit )
+ : mxToolkit( xToolkit ) {}
+ ~Root();
+
+ virtual Widget *create( rtl::OUString id, const rtl::OUString unoName, long attrbs );
+
+ css::uno::Reference< css::awt::XLayoutConstrains > getById( rtl::OUString id );
+ inline css::uno::Reference< css::awt::XLayoutConstrains > getToplevel();
+
+protected:
+ css::uno::Reference< css::awt::XToolkit > mxToolkit;
+ Widget *mpToplevel;
+
+ typedef std::hash_map< rtl::OUString, css::uno::Reference< css::awt::XLayoutConstrains >,
+ rtl::OUStringHash > ItemHash;
+ ItemHash maItems;
+};
+#endif
+
+// parser
+class ImportContext : public ::cppu::WeakImplHelper1< css::xml::input::XRoot >
+{
+public:
+ sal_Int32 XMLNS_LAYOUT_UID, XMLNS_CONTAINER_UID;
+ LayoutRoot &mrRoot; // switch to XNameContainer ref ?
+#ifdef IMPORT_RADIOGROUP
+ RadioGroups mxRadioGroups;
+#endif
+
+ inline ImportContext( LayoutRoot &rRoot ) SAL_THROW( () )
+ : mrRoot( rRoot ) {}
+ virtual ~ImportContext() {}
+
+ // XRoot
+ virtual void SAL_CALL startDocument(
+ css::uno::Reference< css::xml::input::XNamespaceMapping >
+ const & xNamespaceMapping )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException);
+ virtual void SAL_CALL endDocument()
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+ virtual void SAL_CALL processingInstruction(
+ ::rtl::OUString const & /* rTarget */, ::rtl::OUString const & /* rData */ )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+ virtual void SAL_CALL setDocumentLocator(
+ css::uno::Reference< css::xml::sax::XLocator > const & /* xLocator */ )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+ virtual css::uno::Reference< css::xml::input::XElement >
+ SAL_CALL startRootElement(
+ sal_Int32 nUid, ::rtl::OUString const & rLocalName,
+ css::uno::Reference<css::xml::input::XAttributes > const & xAttributes )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException);
+};
+
+class ElementBase : public ::cppu::WeakImplHelper1< css::xml::input::XElement >
+{
+protected:
+ ImportContext *mpImport;
+/* TODO: check if all this memebers are needed. */
+ ElementBase *mpParent;
+ sal_Int32 mnUid;
+
+ ::rtl::OUString maLocalName;
+ css::uno::Reference< css::xml::input::XAttributes > mxAttributes;
+public:
+ ElementBase(
+ sal_Int32 nUid, ::rtl::OUString const & rLocalName,
+ css::uno::Reference< css::xml::input::XAttributes > const & xAttributes,
+ ElementBase * pParent, ImportContext * pImport )
+ SAL_THROW( () );
+ virtual ~ElementBase() SAL_THROW(());
+
+ // XElement
+ virtual css::uno::Reference<css::xml::input::XElement> SAL_CALL getParent()
+ throw (css::uno::RuntimeException)
+ { return static_cast< css::xml::input::XElement * >( mpParent ); }
+ virtual ::rtl::OUString SAL_CALL getLocalName() throw (css::uno::RuntimeException)
+ { return maLocalName; }
+ virtual sal_Int32 SAL_CALL getUid() throw (css::uno::RuntimeException)
+ { return mnUid; }
+ virtual css::uno::Reference< css::xml::input::XAttributes >
+ SAL_CALL getAttributes() throw (css::uno::RuntimeException)
+ { return mxAttributes; }
+
+ virtual void SAL_CALL ignorableWhitespace(
+ ::rtl::OUString const & /* rWhitespaces */ )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+ virtual void SAL_CALL characters( ::rtl::OUString const & /* rChars */ )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+ virtual void SAL_CALL processingInstruction(
+ ::rtl::OUString const & /* Target */, ::rtl::OUString const & /* Data */ )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+
+ virtual css::uno::Reference< css::xml::input::XElement >
+ SAL_CALL startChildElement(
+ sal_Int32 nUid, ::rtl::OUString const & rLocalName,
+ css::uno::Reference<css::xml::input::XAttributes > const & xAttributes )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException) = 0;
+ virtual void SAL_CALL endElement()
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException)
+ { /* ignore */ }
+};
+
+class WidgetElement : public ElementBase
+{
+protected:
+ LayoutWidget *mpWidget;
+
+public:
+ WidgetElement( sal_Int32 nUid, rtl::OUString const &name,
+ css::uno::Reference< css::xml::input::XAttributes > const &attributes,
+ ElementBase *parent, ImportContext *import ) SAL_THROW (());
+
+ ~WidgetElement();
+
+
+ virtual css::uno::Reference< css::xml::input::XElement> SAL_CALL
+ startChildElement (sal_Int32 id, rtl::OUString const &name,
+ css::uno::Reference< css::xml::input::XAttributes > const &attributes)
+ throw( css::xml::sax::SAXException, css::uno::RuntimeException );
+ virtual void SAL_CALL characters( ::rtl::OUString const & /* rChars */ )
+ throw (css::xml::sax::SAXException, css::uno::RuntimeException);
+};
+
+class ToplevelElement : public WidgetElement
+{
+public:
+ ToplevelElement( rtl::OUString const &name,
+ css::uno::Reference< css::xml::input::XAttributes > const &attributes,
+ ImportContext *import ) SAL_THROW (());
+ ~ToplevelElement();
+};
+
+
+} // namespace layoutimpl
+
+#endif /* IMPORT_HXX */