/* This file is part of the KDE project Copyright (C) 2006 Sebastian Sauer This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KEXIMACROPROPERTY_H #define KEXIMACROPROPERTY_H #include #include #include #include #include namespace KoMacro { class Variable; class MacroItem; } class KexiMacroPropertyWidget; /** * Implementation of a @a KoProperty::CustomProperty to have * more control about the handling of our macro-properties. */ class KexiMacroProperty : public TQObject , public KoProperty::CustomProperty { Q_OBJECT friend class KexiMacroPropertyWidget; public: /** Constructor. */ explicit KexiMacroProperty(KoProperty::Property* parent, TDESharedPtr macroitem, const TQString& name); /** Destructor. */ virtual ~KexiMacroProperty(); /** @return the parent @a KoProperty::Property instance. */ KoProperty::Property* parentProperty() const; /** This function is called by @ref KoProperty::Property::setValue() when a custom property is set. You don't have to modify the property value, it is done by Property class. You just have to update child or parent properties value (m_property->parent()->setValue()). Note that, when calling Property::setValue, you need to set useCustomProperty (3rd parameter) to false, or there will be infinite recursion. */ virtual void setValue(const TQVariant &value, bool rememberOldValue); /** This function is called by @ref KoProperty::Property::value() when a custom property is set and @ref handleValue() is true. You should return property's value, taken from parent's value.*/ virtual TQVariant value() const; /** Tells whether CustomProperty should be used to get the property's value. You should return true for child properties, and false for others. */ virtual bool handleValue() const; /** \return the \a KoMacro::MacroItem this custom property has or NULL if there was no item provided. */ TDESharedPtr macroItem() const; /** \return the name the property has in the \a KoMacro::MacroItem above. Is TQString() if there was no item provided. */ TQString name() const; /** \return the \a KoMacro::Variable which has the name @a name() in the item @a macroItem() . If such a variable doesn't exists NULL is returned. */ TDESharedPtr variable() const; /** Factory function to create a new @a KoProperty::Property instance that will use a @a KexiMacroProperty as container. */ static KoProperty::Property* createProperty(TDESharedPtr macroitem, const TQString& name); signals: /** Emitted if @a setValue was called and the value changed. */ void valueChanged(); private: /** \internal d-pointer class. */ class Private; /** \internal d-pointer instance. */ Private* const d; /** \internal initializer method. */ inline void init(); }; /** * Implementation of a @a KoProperty::CustomPropertyFactory to handle * creation of @a KexiMacroProperty and @a KexiMacroPropertyWidget * instances for our macro-properties. */ class KexiMacroPropertyFactory : public KoProperty::CustomPropertyFactory { public: /** Constructor. */ explicit KexiMacroPropertyFactory(TQObject* parent); /** Destructor. */ virtual ~KexiMacroPropertyFactory(); /** @return a new instance of custom property for @p parent. Implement this for property types you want to support. Use parent->type() to get type of the property. */ virtual KoProperty::CustomProperty* createCustomProperty(KoProperty::Property* parent); /** @return a new instance of custom property for @p property. Implement this for property editor types you want to support. Use parent->type() to get type of the property. */ virtual KoProperty::Widget* createCustomWidget(KoProperty::Property* property); /** Initializes this factory. The factory may register itself at the @a KoProperty::FactoryManager if not alreadydone before. This function should be called from within the @a KexiMacroDesignView before the functionality provided with @a KexiMacroProperty and @a KexiMacroPropertyWidget got used. */ static void initFactory(); }; /** * Implementation of a @a KoProperty::Widget used to display and * edit a @a KexiMacroProperty . */ class KexiMacroPropertyWidget : public KoProperty::Widget { Q_OBJECT public: /** Constructor. */ explicit KexiMacroPropertyWidget(KoProperty::Property* property, TQWidget* parent = 0); /** Destructor. */ virtual ~KexiMacroPropertyWidget(); /** @return the value this widget has. */ virtual TQVariant value() const; /** Set the value @p value this widget has. If @p emitChange is true, the @p KoProperty::Widget::valueChanged signal will be emitted. */ virtual void setValue(const TQVariant& value, bool emitChange=true); //virtual void drawViewer(TQPainter *p, const TQColorGroup &cg, const TQRect &r, const TQVariant &value); protected: /** Called if the value should be read only. */ virtual void setReadOnlyInternal(bool readOnly); private slots: /** Called if the text in the KComboBox changed. */ void slotComboBoxChanged(); /** Called if an item in the TQListBox of the KComboBox got activated. */ void slotComboBoxActivated(); /** Called if the @a KoProperty::Widget of the EditListBoxItem got changed. */ void slotWidgetValueChanged(); /** Called if the value of a @a KexiMacroProperty changed to update the widget and the displayed content. */ void slotPropertyValueChanged(); private: /** \internal d-pointer class. */ class Private; /** \internal d-pointer instance. */ Private* const d; }; #endif