diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/plugins/forms/kexidbfactory.cpp | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/plugins/forms/kexidbfactory.cpp')
-rw-r--r-- | kexi/plugins/forms/kexidbfactory.cpp | 713 |
1 files changed, 713 insertions, 0 deletions
diff --git a/kexi/plugins/forms/kexidbfactory.cpp b/kexi/plugins/forms/kexidbfactory.cpp new file mode 100644 index 00000000..4ab05d76 --- /dev/null +++ b/kexi/plugins/forms/kexidbfactory.cpp @@ -0,0 +1,713 @@ +/* This file is part of the KDE project + Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr> + Copyright (C) 2004-2006 Jaroslaw Staniek <js@iidea.pl> + + 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. +*/ + +#include <qpopupmenu.h> +#include <qscrollview.h> +#include <qcursor.h> +#include <qpainter.h> +#include <qstyle.h> + +#include <kgenericfactory.h> +#include <klocale.h> +#include <kdebug.h> +#include <kiconloader.h> +#include <kactioncollection.h> +#include <kstdaction.h> + +#include <formeditor/container.h> +#include <formeditor/form.h> +#include <formeditor/formIO.h> +#include <formeditor/formmanager.h> +#include <formeditor/objecttree.h> +#include <formeditor/utils.h> +#include <kexidb/utils.h> +#include <kexidb/connection.h> +#include <kexipart.h> +#include <formeditor/widgetlibrary.h> +#include <kexigradientwidget.h> +#include <keximainwindow.h> +#include <kexiutils/utils.h> +#include <widget/kexicustompropertyfactory.h> +#include <widget/utils/kexicontextmenuutils.h> + +#include "kexiformview.h" +#include "widgets/kexidbautofield.h" +#include "widgets/kexidbcheckbox.h" +#include "widgets/kexidbimagebox.h" +//#include "widgets/kexidbdoublespinbox.h" +//#include "widgets/kexidbintspinbox.h" +#include "widgets/kexiframe.h" +#include "widgets/kexidblabel.h" +#include "widgets/kexidblineedit.h" +#include "widgets/kexidbtextedit.h" +#include "widgets/kexidbcombobox.h" +#include "widgets/kexipushbutton.h" +#include "widgets/kexidbform.h" +#include "widgets/kexidbsubform.h" +#include "kexidataawarewidgetinfo.h" + +#include "kexidbfactory.h" +#include <core/kexi.h> + + +////////////////////////////////////////// + +KexiDBFactory::KexiDBFactory(QObject *parent, const char *name, const QStringList &) + : KFormDesigner::WidgetFactory(parent, name) +{ + KFormDesigner::WidgetInfo *wi; + wi = new KexiDataAwareWidgetInfo(this); + wi->setPixmap("form"); + wi->setClassName("KexiDBForm"); + wi->setName(i18n("Form")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "form")); + wi->setDescription(i18n("A data-aware form widget")); + addClass(wi); + +#ifndef KEXI_NO_SUBFORM + wi = new KexiDataAwareWidgetInfo(this); + wi->setPixmap("subform"); + wi->setClassName("KexiDBSubForm"); + wi->addAlternateClassName("KexiSubForm", true/*override*/); //older + wi->setName(i18n("Sub Form")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "subForm")); + wi->setDescription(i18n("A form widget included in another Form")); + wi->setAutoSyncForProperty( "formName", false ); + addClass(wi); +#endif + + // inherited + wi = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KLineEdit"); + wi->setPixmap("lineedit"); + wi->setClassName("KexiDBLineEdit"); + wi->addAlternateClassName("QLineEdit", true/*override*/); + wi->addAlternateClassName("KLineEdit", true/*override*/); + wi->setIncludeFileName("klineedit.h"); + wi->setName(i18n("Text Box")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "textBox")); + wi->setDescription(i18n("A widget for entering and displaying text")); + addClass(wi); + + // inherited + wi = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KTextEdit"); + wi->setPixmap("textedit"); + wi->setClassName("KexiDBTextEdit"); + wi->addAlternateClassName("QTextEdit", true/*override*/); + wi->addAlternateClassName("KTextEdit", true/*override*/); + wi->setIncludeFileName("ktextedit.h"); + wi->setName(i18n("Text Editor")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "textEditor")); + wi->setDescription(i18n("A multiline text editor")); + addClass(wi); + + wi = new KFormDesigner::WidgetInfo( + this, "containers", "QFrame" /*we're inheriting to get i18n'd strings already translated there*/); + wi->setPixmap("frame"); + wi->setClassName("KexiFrame"); + wi->addAlternateClassName("QFrame", true/*override*/); + wi->setName(i18n("Frame")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "frame")); + wi->setDescription(i18n("A simple frame widget")); + addClass(wi); + + wi = new KexiDataAwareWidgetInfo( + this, "stdwidgets", "QLabel" /*we're inheriting to get i18n'd strings already translated there*/); + wi->setPixmap("label"); + wi->setClassName("KexiDBLabel"); + wi->addAlternateClassName("QLabel", true/*override*/); + wi->addAlternateClassName("KexiLabel", true/*override*/); //older + wi->setName(i18n("Text Label", "Label")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "label")); + wi->setDescription(i18n("A widget for displaying text")); + addClass(wi); + +#ifndef KEXI_NO_IMAGEBOX_WIDGET + wi = new KexiDataAwareWidgetInfo( + this, "stdwidgets", "KexiPictureLabel" /*we're inheriting to get i18n'd strings already translated there*/); + wi->setPixmap("pixmaplabel"); + wi->setClassName("KexiDBImageBox"); + wi->addAlternateClassName("KexiPictureLabel", true/*override*/); + wi->addAlternateClassName("KexiImageBox", true/*override*/); //older + wi->setName(i18n("Image Box")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "image")); + wi->setDescription(i18n("A widget for displaying images")); +// wi->setCustomTypeForProperty("pixmapData", KexiCustomPropertyFactory::PixmapData); + wi->setCustomTypeForProperty("pixmapId", KexiCustomPropertyFactory::PixmapId); + addClass(wi); + + setInternalProperty("KexiDBImageBox", "dontStartEditingOnInserting", "1"); +// setInternalProperty("KexiDBImageBox", "forceShowAdvancedProperty:pixmap", "1"); +#endif + +#ifdef KEXI_DB_COMBOBOX_WIDGET + wi = new KexiDataAwareWidgetInfo( + this, "stdwidgets", "KComboBox" /*we're inheriting to get i18n'd strings already translated there*/); + wi->setPixmap("combo"); + wi->setClassName("KexiDBComboBox"); + wi->addAlternateClassName("KComboBox", true/*override*/); + wi->setName(i18n("Combo Box")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "comboBox")); + wi->setDescription(i18n("A combo box widget")); + addClass(wi); +#endif + + wi = new KexiDataAwareWidgetInfo(this, "stdwidgets", "QCheckBox"); + wi->setPixmap("check"); + wi->setClassName("KexiDBCheckBox"); + wi->addAlternateClassName("QCheckBox", true/*override*/); + wi->setName(i18n("Check Box")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "checkBox")); + wi->setDescription(i18n("A check box with text label")); + addClass(wi); + +#ifndef KEXI_NO_AUTOFIELD_WIDGET + wi = new KexiDataAwareWidgetInfo(this); + wi->setPixmap("autofield"); + wi->setClassName("KexiDBAutoField"); + wi->addAlternateClassName("KexiDBFieldEdit", true/*override*/); //older + wi->setName(i18n("Auto Field")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters", "autoField")); + wi->setDescription(i18n("A widget containing an automatically selected editor " + "and a label to edit the value of a database field of any type.")); + addClass(wi); +#endif + +/* +#if KDE_VERSION >= KDE_MAKE_VERSION(3,1,9) + KexiDataAwareWidgetInfo *wDate = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KDateWidget"); +#else + KexiDataAwareWidgetInfo *wDate = new KexiDataAwareWidgetInfo(this, "stdwidgets", "QDateEdit"); +#endif + wDate->setPixmap("dateedit"); + wDate->setClassName("KexiDBDateEdit"); + wDate->addAlternateClassName("QDateEdit", true);//override + wDate->addAlternateClassName("KDateWidget", true);//override + wDate->setName(i18n("Date Widget")); + wDate->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "dateWidget")); + wDate->setDescription(i18n("A widget to input and display a date")); + addClass(wDate); + +#if KDE_VERSION >= KDE_MAKE_VERSION(3,1,9) + KexiDataAwareWidgetInfo *wTime = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KTimeWidget"); +#else + KexiDataAwareWidgetInfo *wTime = new KexiDataAwareWidgetInfo(this, "stdwidgets", "QTimeEdit"); +#endif + wTime->setPixmap("timeedit"); + wTime->setClassName("KexiDBTimeEdit"); + wTime->addAlternateClassName("QTimeEdit", true);//override + wTime->addAlternateClassName("KTimeWidget", true);//override + wTime->setName(i18n("Time Widget")); + wTime->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "timeWidget")); + wTime->setDescription(i18n("A widget to input and display a time")); + addClass(wTime); + +#if KDE_VERSION >= KDE_MAKE_VERSION(3,1,9) + KexiDataAwareWidgetInfo *wDateTime = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KDateTimeWidget"); +#else + KexiDataAwareWidgetInfo *wDateTime = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KDateTimeWidget"); +#endif + wDateTime->setPixmap("datetimeedit"); + wDateTime->setClassName("KexiDBDateTimeEdit"); + wDateTime->addAlternateClassName("QDateTimeEdit", true);//override + wDateTime->addAlternateClassName("KDateTimeWidget", true);//override + wDateTime->setName(i18n("Date/Time Widget")); + wDateTime->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "dateTimeWidget")); + wDateTime->setDescription(i18n("A widget to input and display a date and time")); + addClass(wDateTime); +*/ + +/* KexiDataAwareWidgetInfo *wIntSpinBox = new KexiDataAwareWidgetInfo(this, "stdwidgets", "KIntSpinBox"); + wIntSpinBox->setPixmap("spin"); + wIntSpinBox->setClassName("KexiDBIntSpinBox"); + wIntSpinBox->addAlternateClassName("QSpinBox", true); + wIntSpinBox->addAlternateClassName("KIntSpinBox", true); + wIntSpinBox->setName(i18n("Integer Number Spin Box")); + wIntSpinBox->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "intSpinBox")); + wIntSpinBox->setDescription(i18n("A spin box widget to input and display integer numbers")); + addClass(wIntSpinBox); + + KexiDataAwareWidgetInfo *wDoubleSpinBox = new KexiDataAwareWidgetInfo(this, "stdwidgets"); + wDoubleSpinBox->setPixmap("spin"); + wDoubleSpinBox->setClassName("KexiDBDoubleSpinBox"); + wDoubleSpinBox->addAlternateClassName("KDoubleSpinBox", true); + wDoubleSpinBox->setName(i18n("Floating-point Number Spin Box")); + wDoubleSpinBox->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "dblSpinBox")); + wDoubleSpinBox->setDescription(i18n("A spin box widget to input and display floating-point numbers")); + addClass(wDoubleSpinBox);*/ + + // inherited + wi = new KFormDesigner::WidgetInfo( + this, "stdwidgets", "KPushButton"); + wi->addAlternateClassName("KexiPushButton"); + wi->setName(i18n("Command Button")); + wi->setNamePrefix( + i18n("Widget name. This string will be used to name widgets of this class. " + "It must _not_ contain white spaces and non latin1 characters.", "button")); + wi->setDescription(i18n("A command button to execute actions")); + addClass(wi); + + m_propDesc["dataSource"] = i18n("Data Source"); + m_propDesc["formName"] = i18n("Form Name"); + m_propDesc["onClickAction"] = i18n("On Click"); + m_propDesc["onClickActionOption"] = i18n("On Click Option"); + m_propDesc["autoTabStops"] = i18n("Auto Tab Order"); + m_propDesc["shadowEnabled"] = i18n("Shadow Enabled"); + m_propDesc["on"] = i18n("On: button", "On"); + + m_propDesc["widgetType"] = i18n("Editor Type"); + //for autofield's type: inherit i18n from KexiDB + m_propValDesc["Auto"] = i18n("AutoField editor's type", "Auto"); + m_propValDesc["Text"] = KexiDB::Field::typeName(KexiDB::Field::Text); + m_propValDesc["Integer"] = KexiDB::Field::typeName(KexiDB::Field::Integer); + m_propValDesc["Double"] = KexiDB::Field::typeName(KexiDB::Field::Double); + m_propValDesc["Boolean"] = KexiDB::Field::typeName(KexiDB::Field::Boolean); + m_propValDesc["Date"] = KexiDB::Field::typeName(KexiDB::Field::Date); + m_propValDesc["Time"] = KexiDB::Field::typeName(KexiDB::Field::Time); + m_propValDesc["DateTime"] = KexiDB::Field::typeName(KexiDB::Field::DateTime); + m_propValDesc["MultiLineText"] = i18n("AutoField editor's type", "Multiline Text"); + m_propValDesc["ComboBox"] = i18n("AutoField editor's type", "Drop-Down List"); + m_propValDesc["Image"] = i18n("AutoField editor's type", "Image"); + +// m_propDesc["labelCaption"] = i18n("Label Text"); + m_propDesc["autoCaption"] = i18n("Auto Label"); + m_propDesc["foregroundLabelColor"] = i18n("Label Text Color"); + m_propDesc["backgroundLabelColor"] = i18n("(a property name, keep the text narrow!)", + "Label Background\nColor"); + + m_propDesc["labelPosition"] = i18n("Label Position"); + m_propValDesc["Left"] = i18n("Label Position", "Left"); + m_propValDesc["Top"] = i18n("Label Position", "Top"); + m_propValDesc["NoLabel"] = i18n("Label Position", "No Label"); + + m_propDesc["sizeInternal"] = i18n("Size"); +// m_propDesc["pixmap"] = i18n("Image"); + m_propDesc["pixmapId"] = i18n("Image"); + m_propDesc["scaledContents"] = i18n("Scaled Contents"); + m_propDesc["keepAspectRatio"] = i18n("Keep Aspect Ratio (short)", "Keep Ratio"); + + //hide classes that are replaced by db-aware versions + hideClass("KexiPictureLabel"); + hideClass("KComboBox"); + + //used in labels, frames... + m_propDesc["frameColor"] = i18n("Frame Color"); + m_propDesc["dropDownButtonVisible"] = + i18n("Drop-Down Button for Image Box Visible (a property name, keep the text narrow!)", + "Drop-Down\nButton Visible"); + + //for checkbox + m_propValDesc["TristateDefault"] = i18n("Tristate checkbox, default", "Default"); + m_propValDesc["TristateOn"] = i18n("Tristate checkbox, yes", "Yes"); + m_propValDesc["TristateOff"] = i18n("Tristate checkbox, no", "No"); + + //for combobox + m_propDesc["editable"] = i18n("Editable combobox", "Editable"); +} + +KexiDBFactory::~KexiDBFactory() +{ +} + +QWidget* +KexiDBFactory::createWidget(const QCString &c, QWidget *p, const char *n, + KFormDesigner::Container *container, int options) +{ + kexipluginsdbg << "KexiDBFactory::createWidget() " << this << endl; + + QWidget *w=0; + QString text( container->form()->library()->textForWidgetName(n, c) ); + const bool designMode = options & KFormDesigner::WidgetFactory::DesignViewMode; + + if(c == "KexiDBSubForm") + w = new KexiDBSubForm(container->form(), p, n); + else if(c == "KexiDBLineEdit") + { + w = new KexiDBLineEdit(p, n); + if (designMode) + w->setCursor(QCursor(Qt::ArrowCursor)); + } + else if(c == "KexiDBTextEdit") + { + w = new KexiDBTextEdit(p, n); + if (designMode) + w->setCursor(QCursor(Qt::ArrowCursor)); + } + else if(c == "QFrame" || c == "KexiFrame") + { + w = new KexiFrame(p, n); + new KFormDesigner::Container(container, w, container); + } + else if(c == "KexiDBLabel") + w = new KexiDBLabel(text, p, n); +#ifndef KEXI_NO_IMAGEBOX_WIDGET + else if(c == "KexiDBImageBox") { + w = new KexiDBImageBox(designMode, p, n); + connect(w, SIGNAL(idChanged(long)), this, SLOT(slotImageBoxIdChanged(long))); + } +#endif +#ifndef KEXI_NO_AUTOFIELD_WIDGET + else if(c == "KexiDBAutoField") + w = new KexiDBAutoField(p, n, designMode); +#endif + else if(c == "KexiDBCheckBox") + w = new KexiDBCheckBox(text, p, n); + else if(c == "KexiDBComboBox") + w = new KexiDBComboBox(p, n, designMode); +/* else if(c == "KexiDBTimeEdit") + w = new KexiDBTimeEdit(QTime::currentTime(), p, n); + else if(c == "KexiDBDateEdit") + w = new KexiDBDateEdit(QDate::currentDate(), p, n); + else if(c == "KexiDBDateTimeEdit") + w = new KexiDBDateTimeEdit(QDateTime::currentDateTime(), p, n);*/ +// else if(c == "KexiDBIntSpinBox") +// w = new KexiDBIntSpinBox(p, n); +// else if(c == "KexiDBDoubleSpinBox") +// w = new KexiDBDoubleSpinBox(p, n); + else if(c == "KPushButton" || c == "KexiPushButton") + w = new KexiPushButton(text, p, n); + + return w; +} + +bool +KexiDBFactory::createMenuActions(const QCString &classname, QWidget *w, QPopupMenu *menu, + KFormDesigner::Container *) +{ + if(classname == "QPushButton" || classname == "KPushButton" || classname == "KexiPushButton") + { +/*! @todo also call createMenuActions() for inherited factory! */ + m_assignAction->plug( menu ); + return true; + } + else if(classname == "KexiDBImageBox") + { + KexiDBImageBox *imageBox = static_cast<KexiDBImageBox*>(w); + imageBox->contextMenu()->updateActionsAvailability(); + KActionCollection *ac = imageBox->contextMenu()->actionCollection(); + KPopupMenu *subMenu = new KPopupMenu(); +//! @todo make these actions undoable/redoable + menu->insertItem(i18n("&Image"), subMenu); + ac->action("insert")->plug(subMenu); + ac->action("file_save_as")->plug(subMenu); + subMenu->insertSeparator(); + ac->action("edit_cut")->plug(subMenu); + ac->action("edit_copy")->plug(subMenu); + ac->action("edit_paste")->plug(subMenu); + ac->action("delete")->plug(subMenu); + if (ac->action("properties")) { + subMenu->insertSeparator(); + ac->action("properties")->plug(subMenu); + } + } + return false; +} + +void +KexiDBFactory::createCustomActions(KActionCollection* col) +{ + //this will create shared instance action for design mode (special collection is provided) + m_assignAction = new KAction( i18n("&Assign Action..."), SmallIconSet("form_action"), + 0, 0, 0, col, "widget_assign_action"); +} + +bool +KexiDBFactory::startEditing(const QCString &classname, QWidget *w, KFormDesigner::Container *container) +{ + m_container = container; + if(classname == "KexiDBLineEdit") + { +//! @todo this code should not be copied here but +//! just inherited StdWidgetFactory::clearWidgetContent() should be called + KLineEdit *lineedit = static_cast<KLineEdit*>(w); + createEditor(classname, lineedit->text(), lineedit, container, + lineedit->geometry(), lineedit->alignment(), true); + return true; + } + if(classname == "KexiDBTextEdit") + { +//! @todo this code should not be copied here but +//! just inherited StdWidgetFactory::clearWidgetContent() should be called + KTextEdit *textedit = static_cast<KTextEdit*>(w); + createEditor(classname, textedit->text(), textedit, container, + textedit->geometry(), textedit->alignment(), true, true); + //copy a few properties + KTextEdit *ed = dynamic_cast<KTextEdit *>( editor(w) ); + ed->setWrapPolicy(textedit->wrapPolicy()); + ed->setWordWrap(textedit->wordWrap()); + ed->setTabStopWidth(textedit->tabStopWidth()); + ed->setWrapColumnOrWidth(textedit->wrapColumnOrWidth()); + ed->setLinkUnderline(textedit->linkUnderline()); + ed->setTextFormat(textedit->textFormat()); + ed->setHScrollBarMode(textedit->hScrollBarMode()); + ed->setVScrollBarMode(textedit->vScrollBarMode()); + return true; + } + else if ( classname == "KexiDBLabel" ) { + KexiDBLabel *label = static_cast<KexiDBLabel*>(w); + m_widget = w; + if(label->textFormat() == RichText) + { + QString text = label->text(); + if ( editRichText( label, text ) ) + { + changeProperty( "textFormat", "RichText", container->form() ); + changeProperty( "text", text, container->form() ); + } + + if ( classname == "KexiDBLabel" ) + w->resize(w->sizeHint()); + } + else + { + createEditor(classname, label->text(), label, container, + label->geometry(), label->alignment(), + false, label->alignment() & Qt::WordBreak /*multiline*/); + } + return true; + } + else if (classname == "KexiDBSubForm") { + // open the form in design mode + KexiMainWindow *mainWin = KexiUtils::findParent<KexiMainWindow>(w, "KexiMainWindow"); + KexiDBSubForm *subform = static_cast<KexiDBSubForm*>(w); + if(mainWin) { + bool openingCancelled; + mainWin->openObject("kexi/form", subform->formName(), Kexi::DesignViewMode, + openingCancelled); + } + return true; + } +#if 0 + else if( (classname == "KexiDBDateEdit") || (classname == "KexiDBDateTimeEdit") || (classname == "KexiDBTimeEdit") + /*|| (classname == "KexiDBIntSpinBox") || (classname == "KexiDBDoubleSpinBox")*/ ) { + disableFilter(w, container); + return true; + } +#endif + else if(classname == "KexiDBAutoField") { + if(static_cast<KexiDBAutoField*>(w)->hasAutoCaption()) + return false; // caption is auto, abort editing + QLabel *label = static_cast<KexiDBAutoField*>(w)->label(); + createEditor(classname, label->text(), label, container, label->geometry(), label->alignment()); + return true; + } + else if (classname == "KexiDBCheckBox") { + KexiDBCheckBox *cb = static_cast<KexiDBCheckBox*>(w); + QRect r( cb->geometry() ); + r.setLeft( r.left() + 2 + cb->style().subRect( QStyle::SR_CheckBoxIndicator, cb ).width() ); + createEditor(classname, cb->text(), cb, container, r, Qt::AlignAuto); + return true; + } + else if(classname == "KexiDBImageBox") { + KexiDBImageBox *image = static_cast<KexiDBImageBox*>(w); + image->insertFromFile(); + return true; + } + return false; +} + +bool +KexiDBFactory::previewWidget(const QCString &, QWidget *, KFormDesigner::Container *) +{ + return false; +} + +bool +KexiDBFactory::clearWidgetContent(const QCString & /*classname*/, QWidget *w) +{ +//! @todo this code should not be copied here but +//! just inherited StdWidgetFactory::clearWidgetContent() should be called + KexiFormDataItemInterface *iface = dynamic_cast<KexiFormDataItemInterface*>(w); + if(iface) + iface->clear(); + return true; +} + +QValueList<QCString> +KexiDBFactory::autoSaveProperties(const QCString & /*classname*/) +{ + QValueList<QCString> lst; +// if(classname == "KexiDBSubForm") + //lst << "formName"; +// if(classname == "KexiDBLineEdit") +// lst += "dataSource"; +// if(classname == "KexiDBAutoField") +// lst << "labelCaption"; + return lst; +} + +bool +KexiDBFactory::isPropertyVisibleInternal(const QCString& classname, QWidget *w, + const QCString& property, bool isTopLevel) +{ + //general + if (property=="dataSource" || property=="dataSourceMimeType") { + return false; //force + } + + bool ok = true; + + if(classname == "KexiPushButton") { + ok = property!="isDragEnabled" +#ifdef KEXI_NO_UNFINISHED + && property!="onClickAction" /*! @todo reenable */ + && property!="onClickActionOption" /*! @todo reenable */ + && property!="iconSet" /*! @todo reenable */ + && property!="stdItem" /*! @todo reenable stdItem */ +#endif + ; + } + else if(classname == "KexiDBLineEdit") + ok = property!="urlDropsEnabled" + && property!="vAlign" +#ifdef KEXI_NO_UNFINISHED + && property!="inputMask" + && property!="maxLength" //!< we may want to integrate this with db schema +#endif + ; + else if(classname == "KexiDBComboBox") + ok = property!="autoCaption" + && property!="labelPosition" + && property!="widgetType" + && property!="fieldTypeInternal" + && property!="fieldCaptionInternal"; //hide properties that come with KexiDBAutoField + else if(classname == "KexiDBTextEdit") + ok = property!="undoDepth" + && property!="undoRedoEnabled" //always true! + && property!="dragAutoScroll" //always true! + && property!="overwriteMode" //always false! + && property!="resizePolicy" + && property!="autoFormatting" //too complex +#ifdef KEXI_NO_UNFINISHED + && property!="paper" +#endif + ; + else if(classname == "KexiDBSubForm") + ok = property!="dragAutoScroll" + && property!="resizePolicy" + && property!="focusPolicy"; + else if(classname == "KexiDBForm") + ok = property!="iconText" + && property!="geometry" /*nonsense for toplevel widget; for size, "size" property is used*/; + else if(classname == "KexiDBLabel") + ok = property!="focusPolicy"; + else if(classname == "KexiDBAutoField") { + if (!isTopLevel && property=="caption") + return true; //force + if (property=="fieldTypeInternal" || property=="fieldCaptionInternal" +//! @todo unhide in 2.0 + || property=="widgetType") + return false; + ok = property!="text"; /* "text" is not needed as "caption" is used instead */ + } + else if (classname == "KexiDBImageBox") { + ok = property!="font" && property!="wordbreak"; + } + else if(classname == "KexiDBCheckBox") { + //hide text property if the widget is a child of an autofield beause there's already "caption" for this purpose + if (property=="text" && w && dynamic_cast<KFormDesigner::WidgetWithSubpropertiesInterface*>(w->parentWidget())) + return false; + ok = property!="autoRepeat"; + } + + return ok && WidgetFactory::isPropertyVisibleInternal(classname, w, property, isTopLevel); +} + +bool +KexiDBFactory::propertySetShouldBeReloadedAfterPropertyChange(const QCString& classname, + QWidget *w, const QCString& property) +{ + Q_UNUSED(classname); + Q_UNUSED(w); + if (property=="fieldTypeInternal" || property=="widgetType") + return true; + return false; +} + +bool +KexiDBFactory::changeText(const QString &text) +{ + KFormDesigner::Form *form = m_container ? m_container->form() : 0; + if (!form) + return false; + if (!form->selectedWidget()) + return false; + QCString n( form->selectedWidget()->className() ); +// QWidget *w = WidgetFactory::widget(); + if(n == "KexiDBAutoField") { + changeProperty("caption", text, form); + return true; + } + //! \todo check field's geometry + return false; +} + +void +KexiDBFactory::resizeEditor(QWidget *editor, QWidget *w, const QCString &classname) +{ + //QSize s = widget->size(); + //QPoint p = widget->pos(); + + if(classname == "KexiDBAutoField") + editor->setGeometry( static_cast<KexiDBAutoField*>(w)->label()->geometry() ); +} + +void +KexiDBFactory::slotImageBoxIdChanged(KexiBLOBBuffer::Id_t id) +{ +//old KexiFormView *formView = KexiUtils::findParent<KexiFormView>((QWidget*)m_widget, "KexiFormView"); + + // (js) heh, porting to KFormDesigner::FormManager::self() singleton took me entire day of work... + KFormDesigner::Form *form = KFormDesigner::FormManager::self()->activeForm(); + KexiFormView *formView = form ? KexiUtils::findParent<KexiFormView>((QWidget*)form->widget(), "KexiFormView") : 0; + if (formView) { + changeProperty("pixmapId", (uint)/*! @todo unsafe */id, form); +//old formView->setUnsavedLocalBLOB(m_widget, id); + formView->setUnsavedLocalBLOB(form->selectedWidget(), id); + } +} + +KFORMDESIGNER_WIDGET_FACTORY(KexiDBFactory, kexidbwidgets) + +#include "kexidbfactory.moc" |