| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef LAYOUT_CORE_IMPORT_HXX |
| #define LAYOUT_CORE_IMPORT_HXX |
| |
| #include <map> |
| #include <list> |
| #define _BACKWARD_BACKWARD_WARNING_H 1 |
| #include <hash_map> |
| |
| |
| #include <com/sun/star/xml/input/XRoot.hpp> |
| #include <cppuhelper/implbase1.hxx> |
| #include <com/sun/star/awt/XButton.hpp> |
| #include <com/sun/star/awt/XRadioButton.hpp> |
| |
| namespace layoutimpl |
| { |
| class LayoutRoot; |
| class LayoutWidget; |
| namespace css = ::com::sun::star; |
| |
| class RadioGroups |
| { |
| public: |
| RadioGroups(); |
| |
| void addItem( rtl::OUString id, css::uno::Reference< css::awt::XRadioButton > xRadio ) |
| throw (css::uno::RuntimeException); |
| |
| private: |
| class RadioGroup : public ::cppu::WeakImplHelper1< css::awt::XItemListener > |
| , public ::cppu::WeakImplHelper1< css::awt::XActionListener > |
| { |
| public: |
| RadioGroup(); |
| void addItem( css::uno::Reference< css::awt::XRadioButton > xRadio ); |
| |
| private: |
| typedef std::list< css::uno::Reference< css::awt::XRadioButton > > RadioButtonsList; |
| RadioButtonsList mxRadios; |
| css::uno::Reference< css::awt::XRadioButton > mxSelectedRadio; |
| |
| void handleSelected () |
| throw (css::uno::RuntimeException); |
| |
| // awt::XItemListener |
| void SAL_CALL itemStateChanged( const css::awt::ItemEvent& e ) |
| throw (css::uno::RuntimeException); |
| |
| // awt::XActionListener |
| void SAL_CALL actionPerformed( const css::awt::ActionEvent& e ) |
| throw (css::uno::RuntimeException); |
| |
| // 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; |
| }; |
| |
| #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 ? |
| RadioGroups mxRadioGroups; |
| |
| 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 /* LAYOUT_CORE_IMPORT_HXX */ |