summaryrefslogtreecommitdiffstats
path: root/kexi/formeditor/widgetlibrary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/formeditor/widgetlibrary.cpp')
-rw-r--r--kexi/formeditor/widgetlibrary.cpp769
1 files changed, 769 insertions, 0 deletions
diff --git a/kexi/formeditor/widgetlibrary.cpp b/kexi/formeditor/widgetlibrary.cpp
new file mode 100644
index 00000000..1a198195
--- /dev/null
+++ b/kexi/formeditor/widgetlibrary.cpp
@@ -0,0 +1,769 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Lucijan Busch <lucijan@gmx.at>
+ Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
+ Copyright (C) 2004-2007 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 <qdom.h>
+#include <qstrlist.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <klibloader.h>
+#include <kparts/componentfactory.h>
+#include <ktrader.h>
+#include <kiconloader.h>
+#include <kpopupmenu.h>
+
+#include "widgetfactory.h"
+#include "widgetlibrary.h"
+#include "libactionwidget.h"
+#include "container.h"
+#include "form.h"
+#include "formIO.h"
+
+namespace KFormDesigner {
+
+//! @internal
+class XMLGUIClient : public QObject, public KXMLGUIClient
+{
+ public:
+ XMLGUIClient(KXMLGUIClient* parent, const QString& xmlFileName)
+ : QObject(parent->actionCollection()), KXMLGUIClient(parent)
+ {
+ setXMLFile( xmlFileName, true /*merge*/ );
+ }
+};
+
+//! @internal
+class WidgetLibraryPrivate
+{
+ public:
+ WidgetLibraryPrivate()
+ : widgets(101)
+// , alternateWidgets(101)
+ , services(101, false)
+ , supportedFactoryGroups(17, false)
+ , factories(101, false)
+ , advancedProperties(1009, true)
+ , hiddenClasses(101, true)
+ , showAdvancedProperties(true)
+ , factoriesLoaded(false)
+ {
+ services.setAutoDelete(true);
+ advancedProperties.insert("autoMask", (char*)1);
+ advancedProperties.insert("baseSize", (char*)1);
+ advancedProperties.insert("mouseTracking", (char*)1);
+ advancedProperties.insert("acceptDrops", (char*)1);
+ advancedProperties.insert("cursorPosition", (char*)1);
+ advancedProperties.insert("contextMenuEnabled", (char*)1);
+ advancedProperties.insert("trapEnterKeyEvent", (char*)1);
+ advancedProperties.insert("dragEnabled", (char*)1);
+ advancedProperties.insert("enableSqueezedText", (char*)1);
+ advancedProperties.insert("sizeIncrement", (char*)1);
+/*! @todo: reenable */ advancedProperties.insert("palette", (char*)1);
+ advancedProperties.insert("backgroundOrigin", (char*)1);
+ advancedProperties.insert("backgroundMode", (char*)1);//this is rather useless
+ advancedProperties.insert("layout", (char*)1);// too large risk to break things
+ // by providing this in propeditor
+ advancedProperties.insert("minimumSize", (char*)1);
+ advancedProperties.insert("maximumSize", (char*)1);
+#ifdef KEXI_NO_UNFINISHED
+/*! @todo reenable */
+ advancedProperties.insert("paletteBackgroundPixmap", (char*)1);
+ advancedProperties.insert("icon", (char*)1);
+ advancedProperties.insert("pixmap", (char*)1);
+ advancedProperties.insert("accel", (char*)1);
+#endif
+ }
+ // dict which associates a class name with a Widget class
+ WidgetInfo::Dict widgets;//, alternateWidgets;
+ QAsciiDict<KService::Ptr> services;
+ QAsciiDict<char> supportedFactoryGroups;
+ QAsciiDict<WidgetFactory> factories;
+ QAsciiDict<char> advancedProperties;
+ QAsciiDict<char> hiddenClasses;
+ bool showAdvancedProperties : 1;
+ bool factoriesLoaded : 1;
+};
+}
+
+using namespace KFormDesigner;
+
+//-------------------------------------------
+
+WidgetLibrary::WidgetLibrary(QObject *parent, const QStringList& supportedFactoryGroups)
+ : QObject(parent)
+ , d(new WidgetLibraryPrivate())
+{
+ for (QStringList::ConstIterator it = supportedFactoryGroups.constBegin();
+ it!=supportedFactoryGroups.constEnd(); ++it)
+ {
+ d->supportedFactoryGroups.insert( (*it).lower().latin1(), (char*)1);
+ }
+ lookupFactories();
+}
+
+WidgetLibrary::~WidgetLibrary()
+{
+ delete d;
+}
+
+void
+WidgetLibrary::loadFactoryWidgets(WidgetFactory *f)
+{
+ const WidgetInfo::Dict widgets = f->classes();
+ WidgetInfo *w;
+ for(QAsciiDictIterator<WidgetInfo> it(widgets); (w = it.current()); ++it)
+ {
+ if (0 != d->hiddenClasses[ w->className() ])
+ continue; //this class is hidden
+ // check if we want to inherit a widget from a different factory
+ if (!w->m_parentFactoryName.isEmpty() && !w->m_inheritedClassName.isEmpty()) {
+ WidgetFactory *parentFactory = d->factories[w->m_parentFactoryName];
+ if (!parentFactory) {
+ kdWarning() << "WidgetLibrary::loadFactoryWidgets(): class '" << w->className()
+ << "' - no such parent factory '" << w->m_parentFactoryName << "'" << endl;
+ continue;
+ }
+ WidgetInfo* inheritedClass = parentFactory->m_classesByName[ w->m_inheritedClassName ];
+ if (!inheritedClass) {
+ kdWarning() << "WidgetLibrary::loadFactoryWidgets(): class '" << w->m_inheritedClassName
+ << "' - no such class to inherit in factory '" << w->m_parentFactoryName << "'" << endl;
+ continue;
+ }
+ //ok: inherit properties:
+ w->m_inheritedClass = inheritedClass;
+ if (w->pixmap().isEmpty())
+ w->setPixmap( inheritedClass->pixmap() );
+ //ok?
+ foreach (QValueList<QCString>::ConstIterator, it_alt, inheritedClass->m_alternateNames) {
+ w->addAlternateClassName( *it_alt, inheritedClass->isOverriddenClassName( *it_alt ) );
+ }
+ if (w->includeFileName().isEmpty())
+ w->setIncludeFileName( inheritedClass->includeFileName() );
+ if (w->name().isEmpty())
+ w->setName( inheritedClass->name() );
+ if (w->namePrefix().isEmpty())
+ w->setNamePrefix( inheritedClass->namePrefix() );
+ if (w->description().isEmpty())
+ w->setDescription( inheritedClass->description() );
+ }
+
+// kdDebug() << "WidgetLibrary::addFactory(): adding class " << w->className() << endl;
+ QValueList<QCString> l = w->alternateClassNames();
+ l.prepend( w->className() );
+ //d->widgets.insert(w->className(), w);
+// if(!w->alternateClassName().isEmpty()) {
+// QStringList l = QStringList::split("|", w->alternateClassName());
+ QValueList<QCString>::ConstIterator endIt = l.constEnd();
+ for(QValueList<QCString>::ConstIterator it = l.constBegin(); it != endIt; ++it) {
+ WidgetInfo *widgetForClass = d->widgets.find( *it );
+ if (!widgetForClass || (widgetForClass && !widgetForClass->isOverriddenClassName(*it))) {
+ //insert a widgetinfo, if:
+ //1) this class has no alternate class assigned yet, or
+ //2) this class has alternate class assigned but without 'override' flag
+ d->widgets.replace( *it, w);
+ }
+
+/* WidgetInfo *widgetForClass = d->alternateWidgets.find(*it);
+ if (!widgetForClass || (widgetForClass && !widgetForClass->isOverriddenClassName(*it))) {
+ //insert a widgetinfo, if:
+ //1) this class has no alternate class assigned yet, or
+ //2) this class has alternate class assigned but without 'override' flag
+ d->alternateWidgets.replace(*it, w);
+ }*/
+ }
+ }
+}
+
+void
+WidgetLibrary::lookupFactories()
+{
+ KTrader::OfferList tlist = KTrader::self()->query("KFormDesigner/WidgetFactory");
+ KTrader::OfferList::ConstIterator it, end( tlist.constEnd() );
+ for( it = tlist.constBegin(); it != end; ++it)
+ {
+ KService::Ptr ptr = (*it);
+ KService::Ptr* existingService = (d->services)[ptr->library().latin1()];
+ if (existingService) {
+ kdWarning() << "WidgetLibrary::lookupFactories(): factory '" << ptr->name()
+ << "' already found (library="<< (*existingService)->library()
+ <<")! skipping this one: library=" << ptr->library() << endl;
+ continue;
+ }
+ kdDebug() << "WidgetLibrary::lookupFactories(): found factory: " << ptr->name() << endl;
+
+ QCString groupName = ptr->property("X-KFormDesigner-FactoryGroup").toCString();
+ if (!groupName.isEmpty() && !d->supportedFactoryGroups[groupName]) {
+ kdDebug() << "WidgetLibrary::lookupFactories(): factory group '" << groupName
+ << "' is unsupported by this application (library=" << ptr->library() << ")"<< endl;
+ continue;
+ }
+ const uint factoryVersion = ptr->property("X-KFormDesigner-WidgetFactoryVersion").toUInt();
+ if (KFormDesigner::version()!=factoryVersion) {
+ kdWarning() << QString("WidgetLibrary::lookupFactories(): factory '%1'"
+ " has version '%2' but required Widget Factory version is '%3'\n"
+ " -- skipping this factory!").arg(ptr->library()).arg(factoryVersion)
+ .arg(KFormDesigner::version()) << endl;
+ continue;
+ }
+ d->services.insert(ptr->library().latin1(), new KService::Ptr( ptr ));
+ }
+}
+
+void
+WidgetLibrary::loadFactories()
+{
+ if (d->factoriesLoaded)
+ return;
+ d->factoriesLoaded = true;
+ for (QAsciiDictIterator<KService::Ptr> it(d->services); it.current(); ++it) {
+ WidgetFactory *f = KParts::ComponentFactory::createInstanceFromService<WidgetFactory>(
+ *it.current(), this, (*it.current())->library().latin1(), QStringList());
+ if (!f) {
+ kdWarning() << "WidgetLibrary::loadFactories(): creating factory failed! "
+ << (*it.current())->library() << endl;
+ continue;
+ }
+ f->m_library = this;
+ f->m_showAdvancedProperties = d->showAdvancedProperties; //inherit this flag from the library
+ f->m_xmlGUIFileName = (*it.current())->property("X-KFormDesigner-XMLGUIFileName").toString();
+ d->factories.insert( f->name(), f );
+
+ //collect information about classes to be hidden
+ if (f->m_hiddenClasses) {
+ for (QAsciiDictIterator<char> it2(*f->m_hiddenClasses); it2.current(); ++it2) {
+ d->hiddenClasses.replace( it2.currentKey(), (char*)1 );
+ }
+ }
+ }
+
+ //now we have factories instantiated: load widgets
+ QPtrList<WidgetFactory> loadLater;
+ for (QAsciiDictIterator<WidgetFactory> it(d->factories); it.current(); ++it) {
+ //ONE LEVEL, FLAT INHERITANCE, but works!
+ //if this factory inherits from something, load its witgets later
+//! @todo improve
+ if (it.current()->inheritsFactories())
+ loadLater.append( it.current() );
+ else
+ loadFactoryWidgets(it.current());
+ }
+ //load now the rest
+ for (QPtrListIterator<WidgetFactory> it(loadLater); it.current(); ++it) {
+ loadFactoryWidgets(it.current());
+ }
+}
+
+/* old
+QString
+WidgetLibrary::createXML()
+{
+ loadFactories();
+
+ QDomDocument doc("kpartgui");
+ QDomElement root = doc.createElement("kpartgui");
+
+ root.setAttribute("name", "kformdesigner");
+ root.setAttribute("version", "0.3");
+ doc.appendChild(root);
+
+ QDomElement toolbar = doc.createElement("ToolBar");
+ toolbar.setAttribute("name", "widgets");
+ root.appendChild(toolbar);
+
+ QDomElement texttb = doc.createElement("text");
+ toolbar.appendChild(texttb);
+ QDomText ttext = doc.createTextNode("Widgets");
+ texttb.appendChild(ttext);
+
+ QDomElement menubar = doc.createElement("MenuBar");
+ toolbar.setAttribute("name", "widgets");
+ root.appendChild(menubar);
+
+ QDomElement Mtextb = doc.createElement("text");
+ toolbar.appendChild(Mtextb);
+ QDomText Mtext = doc.createTextNode("Widgets");
+ Mtextb.appendChild(Mtext);
+ QDomElement menu = doc.createElement("Menu");
+ menu.setAttribute("name", "widgets");
+
+ QAsciiDictIterator<WidgetInfo> it(d->widgets);
+ int i = 0;
+ for(; it.current(); ++it)
+ {
+ QDomElement action = doc.createElement("Action");
+ action.setAttribute("name", "library_widget" + it.current()->className());
+ toolbar.appendChild(action);
+
+ i++;
+ }
+
+ return doc.toString();
+}*/
+
+ActionList
+WidgetLibrary::createWidgetActions(KXMLGUIClient* client, KActionCollection *parent,
+ QObject *receiver, const char *slot)
+{
+ loadFactories();
+
+ // init XML gui clients (custom factories have their own .rc files)
+ for (QAsciiDictIterator<WidgetFactory> it(d->factories); it.current(); ++it)
+ {
+ if (it.current()->m_xmlGUIFileName.isEmpty()) { // probably a built-in factory, with GUI file like kexiformpartinstui.rc
+ it.current()->m_guiClient = 0;
+ }
+ else { // a custom factory with its own .rc file
+ it.current()->m_guiClient = new XMLGUIClient(client, it.current()->m_xmlGUIFileName);
+ }
+ }
+
+ ActionList actions;
+ for (QAsciiDictIterator<WidgetInfo> it(d->widgets); it.current(); ++it)
+ {
+ LibActionWidget *a = new LibActionWidget(it.current(),
+ it.current()->factory()->m_guiClient
+ ? it.current()->factory()->m_guiClient->actionCollection() : parent);
+ connect(a, SIGNAL(prepareInsert(const QCString &)), receiver, slot);
+ actions.append(a);
+ }
+ return actions;
+}
+
+void
+WidgetLibrary::addCustomWidgetActions(KActionCollection *col)
+{
+ for (QAsciiDictIterator<WidgetFactory> it(d->factories); it.current(); ++it)
+ {
+ it.current()->createCustomActions(
+ it.current()->m_guiClient
+ ? it.current()->m_guiClient->actionCollection() : col);
+ }
+}
+
+QWidget*
+WidgetLibrary::createWidget(const QCString &classname, QWidget *parent, const char *name, Container *c,
+ int options)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[classname];
+ if(!wclass)
+ return 0;
+
+ QWidget *widget = wclass->factory()->createWidget(wclass->className(), parent, name, c, options);
+ if (!widget) {
+ //try to instantiate from inherited class
+ if (wclass->inheritedClass())
+ widget = wclass->inheritedClass()->factory()->createWidget(
+ wclass->className(), parent, name, c, options);
+ if (!widget)
+ return 0;
+ }
+ widget->setAcceptDrops(true);
+ emit widgetCreated(widget);
+ return widget;
+}
+
+bool
+WidgetLibrary::createMenuActions(const QCString &c, QWidget *w, QPopupMenu *menu,
+ KFormDesigner::Container *container)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[c];
+ if(!wclass)
+ return false;
+
+ wclass->factory()->m_widget = w;
+ wclass->factory()->m_container = container;
+ if (wclass->factory()->createMenuActions(c, w, menu, container))
+ return true;
+ //try from inherited class
+ if (wclass->inheritedClass())
+ return wclass->inheritedClass()->factory()
+ ->createMenuActions(wclass->className(), w, menu, container);
+ return false;
+}
+
+bool
+WidgetLibrary::startEditing(const QCString &classname, QWidget *w, Container *container)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[classname];
+ if(!wclass)
+ return false;
+
+ if (wclass->factory()->startEditing(classname, w, container))
+ return true;
+ //try from inherited class
+ if (wclass->inheritedClass())
+ return wclass->inheritedClass()->factory()->startEditing(wclass->className(), w, container);
+ return false;
+}
+
+bool
+WidgetLibrary::previewWidget(const QCString &classname, QWidget *widget, Container *container)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[classname];
+ if(!wclass)
+ return false;
+
+ if (wclass->factory()->previewWidget(classname, widget, container))
+ return true;
+ //try from inherited class
+ if (wclass->inheritedClass())
+ return wclass->inheritedClass()->factory()->previewWidget(wclass->className(), widget, container);
+ return false;
+}
+
+bool
+WidgetLibrary::clearWidgetContent(const QCString &classname, QWidget *w)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[classname];
+ if(!wclass)
+ return false;
+
+ if (wclass->factory()->clearWidgetContent(classname, w))
+ return true;
+ //try from inherited class
+ if (wclass->inheritedClass())
+ return wclass->inheritedClass()->factory()->clearWidgetContent(wclass->className(), w);
+ return false;
+}
+
+QString
+WidgetLibrary::displayName(const QCString &classname)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if(wi)
+ return wi->name();
+
+ return classname;
+}
+
+QString
+WidgetLibrary::savingName(const QCString &classname)
+{
+ loadFactories();
+ QString s;
+ WidgetInfo *wi = d->widgets.find(classname);
+ if(wi && !wi->savingName().isEmpty())
+ return wi->savingName();
+
+ return classname;
+}
+
+QString
+WidgetLibrary::namePrefix(const QCString &classname)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if(wi)
+ return wi->namePrefix();
+
+ return classname;
+}
+
+QString
+WidgetLibrary::textForWidgetName(const QCString &name, const QCString &className)
+{
+ loadFactories();
+ WidgetInfo *widget = d->widgets[className];
+ if(!widget)
+ return QString::null;
+
+ QString newName = name;
+ newName.remove(widget->namePrefix());
+ newName = widget->name() + " " + newName;
+ return newName;
+}
+
+QCString
+WidgetLibrary::classNameForAlternate(const QCString &classname)
+{
+ loadFactories();
+ if(d->widgets.find(classname))
+ return classname;
+
+ WidgetInfo *wi = d->widgets[classname];
+ if (wi) {
+ return wi->className();
+ }
+
+ // widget not supported
+ return "CustomWidget";
+}
+
+QString
+WidgetLibrary::includeFileName(const QCString &classname)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if(wi)
+ return wi->includeFileName();
+
+ return QString::null;
+}
+
+QString
+WidgetLibrary::iconName(const QCString &classname)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if(wi)
+ return wi->pixmap();
+
+ return QString::fromLatin1("unknown_widget");
+}
+
+bool
+WidgetLibrary::saveSpecialProperty(const QCString &classname, const QString &name, const QVariant &value, QWidget *w, QDomElement &parentNode, QDomDocument &parent)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if (!wi)
+ return false;
+
+ if (wi->factory()->saveSpecialProperty(classname, name, value, w, parentNode, parent))
+ return true;
+ //try from inherited class
+ if (wi->inheritedClass())
+ return wi->inheritedClass()->factory()->saveSpecialProperty(wi->className(), name, value, w, parentNode, parent);
+ return false;
+}
+
+bool
+WidgetLibrary::readSpecialProperty(const QCString &classname, QDomElement &node, QWidget *w, ObjectTreeItem *item)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if (!wi)
+ return false;
+ if (wi->factory()->readSpecialProperty(classname, node, w, item))
+ return true;
+ //try from inherited class
+ if (wi->inheritedClass())
+ return wi->inheritedClass()->factory()->readSpecialProperty(wi->className(), node, w, item);
+ return false;
+}
+
+void WidgetLibrary::setAdvancedPropertiesVisible(bool set)
+{
+ d->showAdvancedProperties = set;
+}
+
+bool WidgetLibrary::advancedPropertiesVisible() const
+{
+ return d->showAdvancedProperties;
+}
+
+bool
+WidgetLibrary::isPropertyVisible(const QCString &classname, QWidget *w,
+ const QCString &property, bool multiple, bool isTopLevel)
+{
+ if (isTopLevel) {
+ // no focus policy for top-level form widget...
+ if (!d->showAdvancedProperties && property == "focusPolicy")
+ return false;
+ }
+
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if (!wi)
+ return false;
+ if (!d->showAdvancedProperties && d->advancedProperties[ property ]) {
+ //this is advanced property, should we hide it?
+ if (wi->factory()->internalProperty(classname, "forceShowAdvancedProperty:"+property).isEmpty()
+ && (!wi->inheritedClass() || wi->inheritedClass()->factory()->internalProperty(classname, "forceShowAdvancedProperty:"+property).isEmpty()))
+ {
+ return false; //hide it
+ }
+ }
+
+ if (!wi->factory()->isPropertyVisible(classname, w, property, multiple, isTopLevel))
+ return false;
+ //try from inherited class
+ if (wi->inheritedClass()
+ && !wi->inheritedClass()->factory()->isPropertyVisible(wi->className(), w, property, multiple, isTopLevel))
+ return false;
+
+ return true;
+}
+
+QValueList<QCString>
+WidgetLibrary::autoSaveProperties(const QCString &classname)
+{
+ loadFactories();
+ WidgetInfo *wi = d->widgets.find(classname);
+ if(!wi)
+ return QValueList<QCString>();
+ QValueList<QCString> lst;
+ //prepend from inherited class
+ if (wi->inheritedClass())
+ lst = wi->inheritedClass()->factory()->autoSaveProperties(wi->className());
+ lst += wi->factory()->autoSaveProperties(classname);
+ return lst;
+}
+
+WidgetInfo*
+WidgetLibrary::widgetInfoForClassName(const char* classname)
+{
+ loadFactories();
+ return d->widgets.find(classname);
+}
+
+WidgetFactory*
+WidgetLibrary::factoryForClassName(const char* classname)
+{
+ WidgetInfo *wi = widgetInfoForClassName(classname);
+ return wi ? wi->factory() : 0;
+}
+
+QString WidgetLibrary::propertyDescForName(WidgetInfo *winfo, const QCString& propertyName)
+{
+ if (!winfo || !winfo->factory())
+ return QString::null;
+ QString desc( winfo->factory()->propertyDescForName(propertyName) );
+ if (!desc.isEmpty())
+ return desc;
+ if (winfo->m_parentFactoryName.isEmpty())
+ return QString::null;
+
+ //try in parent factory, if exists
+ WidgetFactory *parentFactory = d->factories[winfo->m_parentFactoryName];
+ if (!parentFactory)
+ return QString::null;
+
+ return parentFactory->propertyDescForName(propertyName);
+}
+
+QString WidgetLibrary::propertyDescForValue(WidgetInfo *winfo, const QCString& name)
+{
+ if (!winfo->factory())
+ return QString::null;
+ QString desc( winfo->factory()->propertyDescForValue(name) );
+ if (!desc.isEmpty())
+ return desc;
+ if (winfo->m_parentFactoryName.isEmpty())
+ return QString::null;
+
+ //try in parent factory, if exists
+ WidgetFactory *parentFactory = d->factories[winfo->m_parentFactoryName];
+ if (!parentFactory)
+ return QString::null;
+
+ return parentFactory->propertyDescForValue(name);
+}
+
+void WidgetLibrary::setPropertyOptions( WidgetPropertySet& buf, const WidgetInfo& winfo, QWidget* w )
+{
+ if (!winfo.factory())
+ return;
+ winfo.factory()->setPropertyOptions(buf, winfo, w);
+ if (winfo.m_parentFactoryName.isEmpty())
+ return;
+ WidgetFactory *parentFactory = d->factories[winfo.m_parentFactoryName];
+ if (!parentFactory)
+ return;
+ parentFactory->setPropertyOptions(buf, winfo, w);
+}
+
+WidgetFactory* WidgetLibrary::factory(const char* factoryName) const
+{
+ return d->factories[factoryName];
+}
+
+QString WidgetLibrary::internalProperty(const QCString& classname, const QCString& property)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[classname];
+ if(!wclass)
+ return QString::null;
+ QString value( wclass->factory()->internalProperty(classname, property) );
+ if (value.isEmpty() && wclass->inheritedClass())
+ return wclass->inheritedClass()->factory()->internalProperty(classname, property);
+ return value;
+}
+
+WidgetFactory::CreateWidgetOptions WidgetLibrary::showOrientationSelectionPopup(
+ const QCString &classname, QWidget* parent, const QPoint& pos)
+{
+ loadFactories();
+ WidgetInfo *wclass = d->widgets[classname];
+ if(!wclass)
+ return WidgetFactory::AnyOrientation;
+
+ //get custom icons and strings
+ QPixmap iconHorizontal, iconVertical;
+ QString iconName( wclass->factory()->internalProperty(classname, "orientationSelectionPopup:horizontalIcon") );
+ if (iconName.isEmpty() && wclass->inheritedClass())
+ iconName = wclass->inheritedClass()->factory()->internalProperty(classname, "orientationSelectionPopup:horizontalIcon");
+ if (!iconName.isEmpty())
+ iconHorizontal = SmallIcon(iconName);
+
+ iconName = wclass->factory()->internalProperty(classname, "orientationSelectionPopup:verticalIcon");
+ if (iconName.isEmpty() && wclass->inheritedClass())
+ iconName = wclass->inheritedClass()->factory()->internalProperty(classname, "orientationSelectionPopup:verticalIcon");
+ if (!iconName.isEmpty())
+ iconVertical = SmallIcon(iconName);
+
+ QString textHorizontal = wclass->factory()->internalProperty(classname, "orientationSelectionPopup:horizontalText");
+ if (textHorizontal.isEmpty() && wclass->inheritedClass())
+ iconName = wclass->inheritedClass()->factory()->internalProperty(classname, "orientationSelectionPopup:horizontalText");
+ if (textHorizontal.isEmpty()) //default
+ textHorizontal = i18n("Insert Horizontal Widget", "Insert Horizontal");
+
+ QString textVertical = wclass->factory()->internalProperty(classname, "orientationSelectionPopup:verticalText");
+ if (textVertical.isEmpty() && wclass->inheritedClass())
+ iconName = wclass->inheritedClass()->factory()->internalProperty(classname, "orientationSelectionPopup:verticalText");
+ if (textVertical.isEmpty()) //default
+ textVertical = i18n("Insert Vertical Widget", "Insert Vertical");
+
+ KPopupMenu* popup = new KPopupMenu(parent, "orientationSelectionPopup");
+ popup->insertTitle(SmallIcon(wclass->pixmap()), i18n("Insert Widget: %1").arg(wclass->name()));
+ popup->insertItem(iconHorizontal, textHorizontal, 1);
+ popup->insertItem(iconVertical, textVertical, 2);
+ popup->insertSeparator();
+ popup->insertItem(SmallIcon("button_cancel"), i18n("Cancel"), 3);
+ WidgetFactory::CreateWidgetOptions result;
+ switch (popup->exec(pos)) {
+ case 1:
+ result = WidgetFactory::HorizontalOrientation; break;
+ case 2:
+ result = WidgetFactory::VerticalOrientation; break;
+ default:
+ result = WidgetFactory::AnyOrientation; //means "cancelled"
+ }
+ delete popup;
+ return result;
+}
+
+bool WidgetLibrary::propertySetShouldBeReloadedAfterPropertyChange(
+ const QCString& classname, QWidget *w, const QCString& property)
+{
+ WidgetInfo *winfo = widgetInfoForClassName(classname);
+ if (!winfo)
+ return false;
+ return winfo->factory()->propertySetShouldBeReloadedAfterPropertyChange(classname, w, property);
+}
+
+#include "widgetlibrary.moc"