summaryrefslogtreecommitdiffstats
path: root/kexi/plugins/forms/widgets/kexidbautofield.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/plugins/forms/widgets/kexidbautofield.cpp')
-rw-r--r--kexi/plugins/forms/widgets/kexidbautofield.cpp846
1 files changed, 846 insertions, 0 deletions
diff --git a/kexi/plugins/forms/widgets/kexidbautofield.cpp b/kexi/plugins/forms/widgets/kexidbautofield.cpp
new file mode 100644
index 00000000..36fbdb1a
--- /dev/null
+++ b/kexi/plugins/forms/widgets/kexidbautofield.cpp
@@ -0,0 +1,846 @@
+/* This file is part of the KDE project
+ Copyright (C) 2005 Cedric Pasteur <cedric.pasteur@free.fr>
+ Copyright (C) 2005 Christian Nitschkowski <segfault_ii@web.de>
+ Copyright (C) 2005-2007 Jaroslaw Staniek <js@iidea.pl>
+
+ This program 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 program 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 program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "kexidbautofield.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qmetaobject.h>
+#include <qapplication.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "kexidbcheckbox.h"
+#include "kexidbimagebox.h"
+#include "kexidblabel.h"
+#include "kexidblineedit.h"
+#include "kexidbtextedit.h"
+#include "kexidbcombobox.h"
+#include "kexipushbutton.h"
+#include "kexidbform.h"
+
+#include <kexidb/queryschema.h>
+#include <formeditor/utils.h>
+#include <kexiutils/utils.h>
+
+#define KexiDBAutoField_SPACING 10 //10 pixel for spacing between a label and an editor widget
+
+//! @internal
+class KexiDBAutoField::Private
+{
+ public:
+ Private()
+ {
+ }
+
+ WidgetType widgetType; //!< internal: equal to m_widgetType_property or equal to result
+ //!< of widgetTypeForFieldType() if widgetTypeForFieldType is Auto
+ WidgetType widgetType_property; //!< provides widget type or Auto
+ LabelPosition lblPosition;
+ QBoxLayout *layout;
+ QLabel *label;
+ QString caption;
+ KexiDB::Field::Type fieldTypeInternal;
+ QString fieldCaptionInternal;
+ QColor baseColor; //!< needed because for unbound mode editor==0
+ QColor textColor; //!< needed because for unbound mode editor==0
+ bool autoCaption : 1;
+ bool focusPolicyChanged : 1;
+ bool designMode : 1;
+};
+
+//-------------------------------------
+
+KexiDBAutoField::KexiDBAutoField(const QString &text, WidgetType type, LabelPosition pos,
+ QWidget *parent, const char *name, bool designMode)
+ : QWidget(parent, name)
+ , KexiFormDataItemInterface()
+ , KFormDesigner::DesignTimeDynamicChildWidgetHandler()
+ , d( new Private() )
+{
+ d->designMode = designMode;
+ init(text, type, pos);
+}
+
+KexiDBAutoField::KexiDBAutoField(QWidget *parent, const char *name, bool designMode, LabelPosition pos)
+ : QWidget(parent, name)
+ , KexiFormDataItemInterface()
+ , KFormDesigner::DesignTimeDynamicChildWidgetHandler()
+ , d( new Private() )
+{
+ d->designMode = designMode;
+ init(QString::null/*i18n("Auto Field")*/, Auto, pos);
+}
+
+KexiDBAutoField::~KexiDBAutoField()
+{
+ setUpdatesEnabled(false);
+ if (m_subwidget)
+ m_subwidget->setUpdatesEnabled(false);
+ delete d;
+}
+
+void
+KexiDBAutoField::init(const QString &text, WidgetType type, LabelPosition pos)
+{
+ d->fieldTypeInternal = KexiDB::Field::InvalidType;
+ d->layout = 0;
+ m_subwidget = 0;
+ d->label = new QLabel(text, this);
+ d->label->installEventFilter( this );
+ //QFontMetrics fm( font() );
+ //d->label->setFixedWidth( fm.width("This is a test string length") );
+ d->autoCaption = true;
+ d->focusPolicyChanged = false;
+ d->widgetType = Auto;
+ d->widgetType_property = (type==Auto ? Text : type); //to force "differ" to be true in setWidgetType()
+ setLabelPosition(pos);
+ setWidgetType(type);
+ d->baseColor = palette().active().base();
+ d->textColor = palette().active().text();
+}
+
+void
+KexiDBAutoField::setWidgetType(WidgetType type)
+{
+ const bool differ = (type != d->widgetType_property);
+ d->widgetType_property = type;
+ if(differ) {
+ if(type == Auto) {// try to guess type from data source type
+ if (visibleColumnInfo())
+ d->widgetType = KexiDBAutoField::widgetTypeForFieldType(visibleColumnInfo()->field->type());
+ else
+ d->widgetType = Auto;
+ }
+ else
+ d->widgetType = d->widgetType_property;
+ createEditor();
+ }
+}
+
+void
+KexiDBAutoField::createEditor()
+{
+ if(m_subwidget) {
+ delete (QWidget *)m_subwidget;
+ }
+
+ QWidget *newSubwidget;
+ switch( d->widgetType ) {
+ case Text:
+ case Double: //! @todo setup validator
+ case Integer: //! @todo setup validator
+ case Date:
+ case Time:
+ case DateTime:
+ newSubwidget = new KexiDBLineEdit( this, QCString("KexiDBAutoField_KexiDBLineEdit:")+name() );
+ break;
+ case MultiLineText:
+ newSubwidget = new KexiDBTextEdit( this, QCString("KexiDBAutoField_KexiDBTextEdit:")+name() );
+ break;
+ case Boolean:
+ newSubwidget = new KexiDBCheckBox(dataSource(), this, QCString("KexiDBAutoField_KexiDBCheckBox:")+name());
+ break;
+ case Image:
+ newSubwidget = new KexiDBImageBox(d->designMode, this, QCString("KexiDBAutoField_KexiDBImageBox:")+name());
+ break;
+ case ComboBox:
+ newSubwidget = new KexiDBComboBox(this, QCString("KexiDBAutoField_KexiDBComboBox:")+name(), d->designMode);
+ break;
+ default:
+ newSubwidget = 0;
+ changeText(d->caption);
+ //d->label->setText( d->dataSource.isEmpty() ? "<datasource>" : d->dataSource );
+ break;
+ }
+
+ setSubwidget( newSubwidget ); //this will also allow to declare subproperties, see KFormDesigner::WidgetWithSubpropertiesInterface
+ if(newSubwidget) {
+ newSubwidget->setName( QCString("KexiDBAutoField_") + newSubwidget->className() );
+ dynamic_cast<KexiDataItemInterface*>(newSubwidget)->setParentDataItemInterface(this);
+ dynamic_cast<KexiFormDataItemInterface*>(newSubwidget)
+ ->setColumnInfo(columnInfo()); //needed at least by KexiDBImageBox
+ dynamic_cast<KexiFormDataItemInterface*>(newSubwidget)
+ ->setVisibleColumnInfo(visibleColumnInfo()); //needed at least by KexiDBComboBox
+ newSubwidget->setProperty("dataSource", dataSource()); //needed at least by KexiDBImageBox
+ KFormDesigner::DesignTimeDynamicChildWidgetHandler::childWidgetAdded(this);
+ newSubwidget->show();
+ d->label->setBuddy(newSubwidget);
+ if (d->focusPolicyChanged) {//if focusPolicy is changed at top level, editor inherits it
+ newSubwidget->setFocusPolicy(focusPolicy());
+ }
+ else {//if focusPolicy is not changed at top level, inherit it from editor
+ QWidget::setFocusPolicy(newSubwidget->focusPolicy());
+ }
+ setFocusProxy(newSubwidget); //ok?
+ if (parentWidget())
+ newSubwidget->setPalette( qApp->palette() );
+ copyPropertiesToEditor();
+// KFormDesigner::installRecursiveEventFilter(newSubwidget, this);
+ }
+
+ setLabelPosition(labelPosition());
+}
+
+void KexiDBAutoField::copyPropertiesToEditor()
+{
+ if (m_subwidget) {
+// kdDebug() << "KexiDBAutoField::copyPropertiesToEditor(): base col: " << d->baseColor.name() <<
+// "; text col: " << d->textColor.name() << endl;
+ QPalette p( m_subwidget->palette() );
+ p.setColor( QPalette::Active, QColorGroup::Base, d->baseColor );
+ if(d->widgetType == Boolean)
+ p.setColor( QPalette::Active, QColorGroup::Foreground, d->textColor );
+ else
+ p.setColor( QPalette::Active, QColorGroup::Text, d->textColor );
+ m_subwidget->setPalette(p);
+ //m_subwidget->setPaletteBackgroundColor( d->baseColor );
+ }
+}
+
+void
+KexiDBAutoField::setLabelPosition(LabelPosition position)
+{
+ d->lblPosition = position;
+ if(d->layout) {
+ QBoxLayout *lyr = d->layout;
+ d->layout = 0;
+ delete lyr;
+ }
+
+ if(m_subwidget)
+ m_subwidget->show();
+ //! \todo support right-to-left layout where positions are inverted
+ if (position==Top || position==Left) {
+ int align = d->label->alignment();
+ if(position == Top) {
+ d->layout = (QBoxLayout*) new QVBoxLayout(this);
+ align |= AlignVertical_Mask;
+ align ^= AlignVertical_Mask;
+ align |= AlignTop;
+ }
+ else {
+ d->layout = (QBoxLayout*) new QHBoxLayout(this);
+ align |= AlignVertical_Mask;
+ align ^= AlignVertical_Mask;
+ align |= AlignVCenter;
+ }
+ d->label->setAlignment(align);
+ if(d->widgetType == Boolean
+ || (d->widgetType == Auto && fieldTypeInternal() == KexiDB::Field::InvalidType && !d->designMode))
+ {
+ d->label->hide();
+ }
+ else {
+ d->label->show();
+ }
+ d->layout->addWidget(d->label, 0, position == Top ? int(Qt::AlignLeft) : 0);
+ if(position == Left && d->widgetType != Boolean)
+ d->layout->addSpacing(KexiDBAutoField_SPACING);
+ d->layout->addWidget(m_subwidget, 1);
+ KexiSubwidgetInterface *subwidgetInterface = dynamic_cast<KexiSubwidgetInterface*>((QWidget*)m_subwidget);
+ if (subwidgetInterface) {
+ if (subwidgetInterface->appendStretchRequired(this))
+ d->layout->addStretch(0);
+ if (subwidgetInterface->subwidgetStretchRequired(this)) {
+ QSizePolicy sizePolicy( m_subwidget->sizePolicy() );
+ if(position == Left) {
+ sizePolicy.setHorData( QSizePolicy::Minimum );
+ d->label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+ }
+ else {
+ sizePolicy.setVerData( QSizePolicy::Minimum );
+ d->label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ }
+ m_subwidget->setSizePolicy(sizePolicy);
+ }
+ }
+// if(m_subwidget)
+ // m_subwidget->setSizePolicy(...);
+ }
+ else {
+ d->layout = (QBoxLayout*) new QHBoxLayout(this);
+ d->label->hide();
+ d->layout->addWidget(m_subwidget);
+ }
+ //a hack to force layout to be refreshed (any better idea for this?)
+ resize(size()+QSize(1,0));
+ resize(size()-QSize(1,0));
+ if (dynamic_cast<KexiDBAutoField*>((QWidget*)m_subwidget)) {
+ //needed for KexiDBComboBox
+ dynamic_cast<KexiDBAutoField*>((QWidget*)m_subwidget)->setLabelPosition(position);
+ }
+}
+
+void
+KexiDBAutoField::setInvalidState( const QString &text )
+{
+ // Widget with an invalid dataSource is just a QLabel
+ if (d->designMode)
+ return;
+ d->widgetType = Auto;
+ createEditor();
+ setFocusPolicy(QWidget::NoFocus);
+ if (m_subwidget)
+ m_subwidget->setFocusPolicy(QWidget::NoFocus);
+//! @todo or set this to editor's text?
+ d->label->setText( text );
+}
+
+bool
+KexiDBAutoField::isReadOnly() const
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->isReadOnly();
+ else
+ return false;
+}
+
+void
+KexiDBAutoField::setReadOnly( bool readOnly )
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ iface->setReadOnly(readOnly);
+}
+
+void
+KexiDBAutoField::setValueInternal(const QVariant& add, bool removeOld)
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ iface->setValue(m_origValue, add, removeOld);
+// iface->setValueInternal(add, removeOld);
+}
+
+QVariant
+KexiDBAutoField::value()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->value();
+ return QVariant();
+}
+
+bool
+KexiDBAutoField::valueIsNull()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->valueIsNull();
+ return true;
+}
+
+bool
+KexiDBAutoField::valueIsEmpty()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->valueIsEmpty();
+ return true;
+}
+
+bool
+KexiDBAutoField::valueIsValid()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->valueIsValid();
+ return true;
+}
+
+bool
+KexiDBAutoField::valueChanged()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ kexipluginsdbg << m_origValue << endl;
+ if(iface)
+ return iface->valueChanged();
+ return false;
+}
+
+void
+KexiDBAutoField::installListener(KexiDataItemChangesListener* listener)
+{
+ KexiFormDataItemInterface::installListener(listener);
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ iface->installListener(listener);
+}
+
+KexiDBAutoField::WidgetType KexiDBAutoField::widgetType() const
+{
+ return d->widgetType_property;
+}
+
+KexiDBAutoField::LabelPosition KexiDBAutoField::labelPosition() const
+{
+ return d->lblPosition;
+}
+
+QString KexiDBAutoField::caption() const
+{
+ return d->caption;
+}
+
+bool KexiDBAutoField::hasAutoCaption() const
+{
+ return d->autoCaption;
+}
+
+QWidget* KexiDBAutoField::editor() const
+{
+ return m_subwidget;
+}
+
+QLabel* KexiDBAutoField::label() const
+{
+ return d->label;
+}
+
+int KexiDBAutoField::fieldTypeInternal() const
+{
+ return d->fieldTypeInternal;
+}
+
+QString KexiDBAutoField::fieldCaptionInternal() const
+{
+ return d->fieldCaptionInternal;
+}
+
+bool
+KexiDBAutoField::cursorAtStart()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->cursorAtStart();
+ return false;
+}
+
+bool
+KexiDBAutoField::cursorAtEnd()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ return iface->cursorAtEnd();
+ return false;
+}
+
+void
+KexiDBAutoField::clear()
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ iface->clear();
+}
+
+void
+KexiDBAutoField::setFieldTypeInternal(int kexiDBFieldType)
+{
+ d->fieldTypeInternal = (KexiDB::Field::Type)kexiDBFieldType;
+ KexiDB::Field::Type fieldType;
+ //find real fied type to use
+ if (d->fieldTypeInternal==KexiDB::Field::InvalidType) {
+ if (visibleColumnInfo())
+ fieldType = KexiDB::Field::Text;
+ else
+ fieldType = KexiDB::Field::InvalidType;
+ }
+ else
+ fieldType = d->fieldTypeInternal;
+
+ const WidgetType newWidgetType = KexiDBAutoField::widgetTypeForFieldType( fieldType );
+
+ if(d->widgetType != newWidgetType) {
+ d->widgetType = newWidgetType;
+ createEditor();
+ }
+ setFieldCaptionInternal(d->fieldCaptionInternal);
+}
+
+void
+KexiDBAutoField::setFieldCaptionInternal(const QString& text)
+{
+ d->fieldCaptionInternal = text;
+ //change text only if autocaption is set and no columnInfo is available
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if((!iface || !iface->columnInfo()) && d->autoCaption) {
+ changeText(d->fieldCaptionInternal);
+ }
+}
+
+void
+KexiDBAutoField::setColumnInfo(KexiDB::QueryColumnInfo* cinfo)
+{
+ KexiFormDataItemInterface::setColumnInfo(cinfo);
+ setColumnInfoInternal(cinfo, cinfo);
+}
+
+void
+KexiDBAutoField::setColumnInfoInternal(KexiDB::QueryColumnInfo* cinfo, KexiDB::QueryColumnInfo* visibleColumnInfo)
+{
+ // change widget type depending on field type
+ if(d->widgetType_property == Auto) {
+ WidgetType newWidgetType = Auto;
+ KexiDB::Field::Type fieldType;
+ if (cinfo)
+ fieldType = visibleColumnInfo->field->type();
+ else if (dataSource().isEmpty())
+ fieldType = KexiDB::Field::InvalidType;
+ else
+ fieldType = KexiDB::Field::Text;
+
+ if (fieldType != KexiDB::Field::InvalidType) {
+ newWidgetType = KexiDBAutoField::widgetTypeForFieldType( fieldType );
+ }
+ if(d->widgetType != newWidgetType || newWidgetType==Auto) {
+ d->widgetType = newWidgetType;
+ createEditor();
+ }
+ }
+ // update label's text
+ changeText((cinfo && d->autoCaption) ? cinfo->captionOrAliasOrName() : d->caption);
+
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if(iface)
+ iface->setColumnInfo(visibleColumnInfo);
+}
+
+//static
+KexiDBAutoField::WidgetType
+KexiDBAutoField::widgetTypeForFieldType(KexiDB::Field::Type type)
+{
+ switch(type) {
+ case KexiDB::Field::Integer:
+ case KexiDB::Field::ShortInteger:
+ case KexiDB::Field::BigInteger:
+ return Integer;
+ case KexiDB::Field::Boolean:
+ return Boolean;
+ case KexiDB::Field::Float:
+ case KexiDB::Field::Double:
+ return Double;
+ case KexiDB::Field::Date:
+ return Date;
+ case KexiDB::Field::DateTime:
+ return DateTime;
+ case KexiDB::Field::Time:
+ return Time;
+ case KexiDB::Field::Text:
+ return Text;
+ case KexiDB::Field::LongText:
+ return MultiLineText;
+ case KexiDB::Field::Enum:
+ return ComboBox;
+ case KexiDB::Field::InvalidType:
+ return Auto;
+ case KexiDB::Field::BLOB:
+ return Image;
+ default:
+ break;
+ }
+ return Text;
+}
+
+void
+KexiDBAutoField::changeText(const QString &text, bool beautify)
+{
+ QString realText;
+ bool unbound = false;
+ if (d->autoCaption && (d->widgetType==Auto || dataSource().isEmpty())) {
+ if (d->designMode)
+ realText = QString::fromLatin1(name())+" "+i18n("Unbound Auto Field", "(unbound)");
+ else
+ realText = QString::null;
+ unbound = true;
+ }
+ else {
+ if (beautify) {
+ /*! @todo look at appendColonToAutoLabels setting [bool]
+ @todo look at makeFirstCharacterUpperCaseInCaptions setting [bool]
+ (see doc/dev/settings.txt) */
+ if (!text.isEmpty()) {
+ realText = text[0].upper() + text.mid(1);
+ if (d->widgetType!=Boolean) {
+//! @todo ":" suffix looks weird for checkbox; remove this condition when [x] is displayed _after_ label
+//! @todo support right-to-left layout where position of ":" is inverted
+ realText += ": ";
+ }
+ }
+ }
+ else
+ realText = text;
+ }
+
+ if (unbound)
+ d->label->setAlignment( Qt::AlignCenter | Qt::WordBreak );
+ else
+ d->label->setAlignment( Qt::AlignCenter );
+// QWidget* widgetToAlterForegroundColor;
+ if(d->widgetType == Boolean) {
+ static_cast<QCheckBox*>((QWidget*)m_subwidget)->setText(realText);
+// widgetToAlterForegroundColor = m_subwidget;
+ }
+ else {
+ d->label->setText(realText);
+// widgetToAlterForegroundColor = d->label;
+ }
+/*
+ if (unbound)
+ widgetToAlterForegroundColor->setPaletteForegroundColor(
+ KexiUtils::blendedColors(
+ widgetToAlterForegroundColor->paletteForegroundColor(),
+ widgetToAlterForegroundColor->paletteBackgroundColor(), 2, 1));
+ else
+ widgetToAlterForegroundColor->setPaletteForegroundColor( paletteForegroundColor() );*/
+}
+
+void
+KexiDBAutoField::setCaption(const QString &caption)
+{
+ d->caption = caption;
+ if(!d->autoCaption && !caption.isEmpty())
+ changeText(d->caption);
+}
+
+void
+KexiDBAutoField::setAutoCaption(bool autoCaption)
+{
+ d->autoCaption = autoCaption;
+ if(d->autoCaption) {
+ //d->caption = QString::null;
+ if(columnInfo()) {
+ changeText(columnInfo()->captionOrAliasOrName());
+ }
+ else {
+ changeText(d->fieldCaptionInternal);
+ }
+ }
+ else
+ changeText(d->caption);
+}
+
+void
+KexiDBAutoField::setDataSource( const QString &ds ) {
+ KexiFormDataItemInterface::setDataSource(ds);
+ if (ds.isEmpty()) {
+ setColumnInfo(0);
+ }
+}
+
+QSize
+KexiDBAutoField::sizeHint() const
+{
+ if (d->lblPosition == NoLabel)
+ return m_subwidget ? m_subwidget->sizeHint() : QWidget::sizeHint();
+
+ QSize s1(0,0);
+ if (m_subwidget)
+ s1 = m_subwidget->sizeHint();
+ QSize s2(d->label->sizeHint());
+ if (d->lblPosition == Top)
+ return QSize(QMAX(s1.width(), s2.width()), s1.height()+KexiDBAutoField_SPACING+s2.height());
+
+ //left
+ return QSize(s1.width()+KexiDBAutoField_SPACING+s2.width(), QMAX(s1.height(), s2.height()));
+}
+
+void
+KexiDBAutoField::setFocusPolicy( FocusPolicy policy )
+{
+ d->focusPolicyChanged = true;
+ QWidget::setFocusPolicy(policy);
+ d->label->setFocusPolicy(policy);
+ if (m_subwidget)
+ m_subwidget->setFocusPolicy(policy);
+}
+
+void
+KexiDBAutoField::updateInformationAboutUnboundField()
+{
+ if ( (d->autoCaption && (dataSource().isEmpty() || dataSourceMimeType().isEmpty()))
+ || (!d->autoCaption && d->caption.isEmpty()) )
+ {
+ d->label->setText( QString::fromLatin1(name())+" "+i18n("Unbound Auto Field", " (unbound)") );
+ }
+// else
+// d->label->setText( QString::fromLatin1(name())+" "+i18n(" (unbound)") );
+}
+
+/*void
+KexiDBAutoField::paintEvent( QPaintEvent* pe )
+{
+ QWidget::paintEvent( pe );
+
+ if ( (d->autoCaption && (dataSource().isEmpty() || dataSourceMimeType().isEmpty()))
+ || (!d->autoCaption && d->caption.isEmpty()) )
+ {
+ QPainter p(this);
+ p.setPen( d->label->paletteForegroundColor() );
+ p.setClipRect(pe->rect());
+ p.setFont(d->label->font());
+ p.drawText(rect(), Qt::AlignLeft | Qt::WordBreak,
+ QString::fromLatin1(name())+" "+i18n(" (unbound)"));
+ }
+}*/
+
+void
+KexiDBAutoField::paletteChange( const QPalette& oldPal )
+{
+ Q_UNUSED(oldPal);
+ d->label->setPalette( palette() );
+}
+
+void KexiDBAutoField::unsetPalette()
+{
+ QWidget::unsetPalette();
+
+}
+
+// ===== methods below are just proxies for the internal editor or label =====
+
+const QColor & KexiDBAutoField::paletteForegroundColor() const
+{
+ return d->textColor;
+}
+
+void KexiDBAutoField::setPaletteForegroundColor( const QColor & color )
+{
+ d->textColor = color;
+ copyPropertiesToEditor();
+}
+
+const QColor & KexiDBAutoField::paletteBackgroundColor() const
+{
+ return d->baseColor;
+}
+
+void KexiDBAutoField::setPaletteBackgroundColor( const QColor & color )
+{
+ d->baseColor = color;
+ copyPropertiesToEditor();
+}
+
+const QColor & KexiDBAutoField::foregroundLabelColor() const
+{
+ if(d->widgetType == Boolean)
+ return paletteForegroundColor();
+
+ return d->label->paletteForegroundColor();
+}
+
+void KexiDBAutoField::setForegroundLabelColor( const QColor & color )
+{
+ if(d->widgetType == Boolean)
+ setPaletteForegroundColor(color);
+ else {
+ d->label->setPaletteForegroundColor(color);
+ QWidget::setPaletteForegroundColor(color);
+ }
+}
+
+const QColor & KexiDBAutoField::backgroundLabelColor() const
+{
+ if(d->widgetType == Boolean)
+ return paletteBackgroundColor();
+
+ return d->label->paletteBackgroundColor();
+}
+
+void KexiDBAutoField::setBackgroundLabelColor( const QColor & color )
+{
+ if(d->widgetType == Boolean)
+ setPaletteBackgroundColor(color);
+ else {
+ d->label->setPaletteBackgroundColor(color);
+ QWidget::setPaletteBackgroundColor(color);
+ }
+
+// if (m_subwidget)
+// m_subwidget->setPalette( qApp->palette() );
+}
+
+QVariant KexiDBAutoField::property( const char * name ) const
+{
+ bool ok;
+ QVariant val = KFormDesigner::WidgetWithSubpropertiesInterface::subproperty(name, ok);
+ if (ok)
+ return val;
+ return QWidget::property(name);
+}
+
+bool KexiDBAutoField::setProperty( const char * name, const QVariant & value )
+{
+ bool ok = KFormDesigner::WidgetWithSubpropertiesInterface::setSubproperty(name, value);
+ if (ok)
+ return true;
+ return QWidget::setProperty(name, value);
+}
+
+bool KexiDBAutoField::eventFilter( QObject *o, QEvent *e )
+{
+ if (o==d->label && d->label->buddy() && e->type()==QEvent::MouseButtonRelease) {
+ //focus label's buddy when user clicked the label
+ d->label->buddy()->setFocus();
+ }
+ return QWidget::eventFilter(o, e);
+}
+
+void KexiDBAutoField::setDisplayDefaultValue(QWidget* widget, bool displayDefaultValue)
+{
+ KexiFormDataItemInterface::setDisplayDefaultValue(widget, displayDefaultValue);
+ if (dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget))
+ dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget)->setDisplayDefaultValue(m_subwidget, displayDefaultValue);
+}
+
+void KexiDBAutoField::moveCursorToEnd()
+{
+ KexiDataItemInterface *iface = dynamic_cast<KexiDataItemInterface*>((QWidget*)m_subwidget);
+ if (iface)
+ iface->moveCursorToEnd();
+}
+
+void KexiDBAutoField::moveCursorToStart()
+{
+ KexiDataItemInterface *iface = dynamic_cast<KexiDataItemInterface*>((QWidget*)m_subwidget);
+ if (iface)
+ iface->moveCursorToStart();
+}
+
+void KexiDBAutoField::selectAll()
+{
+ KexiDataItemInterface *iface = dynamic_cast<KexiDataItemInterface*>((QWidget*)m_subwidget);
+ if (iface)
+ iface->selectAll();
+}
+
+bool KexiDBAutoField::keyPressed(QKeyEvent *ke)
+{
+ KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>((QWidget*)m_subwidget);
+ if (iface && iface->keyPressed(ke))
+ return true;
+ return false;
+}
+
+#include "kexidbautofield.moc"