summaryrefslogtreecommitdiffstats
path: root/lib/koproperty/factory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/koproperty/factory.cpp')
-rw-r--r--lib/koproperty/factory.cpp265
1 files changed, 265 insertions, 0 deletions
diff --git a/lib/koproperty/factory.cpp b/lib/koproperty/factory.cpp
new file mode 100644
index 000000000..9b05552df
--- /dev/null
+++ b/lib/koproperty/factory.cpp
@@ -0,0 +1,265 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
+ Copyright (C) 2004 Alexander Dymo <cloudtemple@mskat.net>
+
+ 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 "factory.h"
+#include "property.h"
+#include "customproperty.h"
+
+#include "booledit.h"
+#include "combobox.h"
+#include "coloredit.h"
+#include "cursoredit.h"
+#include "dateedit.h"
+#include "datetimeedit.h"
+#include "dummywidget.h"
+#include "fontedit.h"
+#include "linestyleedit.h"
+#include "pixmapedit.h"
+#include "pointedit.h"
+#include "rectedit.h"
+#include "sizeedit.h"
+#include "sizepolicyedit.h"
+#include "spinbox.h"
+#include "stringlistedit.h"
+#include "stringedit.h"
+#include "symbolcombo.h"
+#include "timeedit.h"
+#include "urledit.h"
+
+#include <qvaluelist.h>
+#include <qintdict.h>
+
+#include <kdebug.h>
+
+static KStaticDeleter<KoProperty::FactoryManager> m_managerDeleter;
+static KoProperty::FactoryManager* m_manager = 0;
+
+namespace KoProperty {
+
+CustomPropertyFactory::CustomPropertyFactory(QObject *parent)
+ : QObject(parent)
+{
+}
+
+CustomPropertyFactory::~CustomPropertyFactory()
+{
+}
+
+
+//! @internal
+class FactoryManagerPrivate
+{
+ public:
+ FactoryManagerPrivate() {}
+ ~FactoryManagerPrivate() {}
+
+ //registered widgets for property types
+ QIntDict<CustomPropertyFactory> registeredWidgets;
+ QIntDict<CustomPropertyFactory> registeredCustomProperties;
+};
+}
+
+using namespace KoProperty;
+
+FactoryManager::FactoryManager()
+: QObject(0, "KoProperty::FactoryManager")
+{
+ d = new FactoryManagerPrivate();
+}
+
+FactoryManager::~FactoryManager()
+{
+ delete d;
+}
+
+FactoryManager*
+FactoryManager::self()
+{
+ if(!m_manager)
+ m_managerDeleter.setObject( m_manager, new FactoryManager() );
+ return m_manager;
+}
+
+/////////////////// Functions related to widgets /////////////////////////////////////
+
+void
+FactoryManager::registerFactoryForEditor(int editorType, CustomPropertyFactory *widgetFactory)
+{
+ if(!widgetFactory)
+ return;
+ if(d->registeredWidgets.find(editorType))
+ kopropertywarn << "FactoryManager::registerFactoryForEditor(): "
+ "Overriding already registered custom widget type \"" << editorType << "\"" << endl;
+ d->registeredWidgets.replace(editorType, widgetFactory);
+}
+
+void
+FactoryManager::registerFactoryForEditors(const QValueList<int> &editorTypes, CustomPropertyFactory *factory)
+{
+ QValueList<int>::ConstIterator endIt = editorTypes.constEnd();
+ for(QValueList<int>::ConstIterator it = editorTypes.constBegin(); it != endIt; ++it)
+ registerFactoryForEditor(*it, factory);
+}
+
+CustomPropertyFactory *
+FactoryManager::factoryForEditorType(int type)
+{
+ return d->registeredWidgets.find(type);
+}
+
+Widget*
+FactoryManager::createWidgetForProperty(Property *property)
+{
+ if(!property)
+ return 0;
+
+ const int type = property->type();
+
+ CustomPropertyFactory *factory = d->registeredWidgets.find(type);
+ if (factory)
+ return factory->createCustomWidget(property);
+
+ //handle combobox-based widgets:
+ if (type==Cursor)
+ return new CursorEdit(property);
+
+ if (property->listData()) {
+ return new ComboBox(property);
+ }
+
+ //handle other widget types:
+ switch(type)
+ {
+ // Default QVariant types
+ case String:
+ case CString:
+ return new StringEdit(property);
+ case Rect_X:
+ case Rect_Y:
+ case Rect_Width:
+ case Rect_Height:
+ case Point_X:
+ case Point_Y:
+ case Size_Width:
+ case Size_Height:
+ case SizePolicy_HorStretch:
+ case SizePolicy_VerStretch:
+ case Integer:
+ return new IntEdit(property);
+ case Double:
+ return new DoubleEdit(property);
+ case Boolean: {
+ //boolean editors can optionally accept 3rd state:
+ QVariant thirdState = property ? property->option("3rdState") : QVariant();
+ if (thirdState.toString().isEmpty())
+ return new BoolEdit(property);
+ else
+ return new ThreeStateBoolEdit(property);
+ }
+ case Date:
+ return new DateEdit(property);
+ case Time:
+ return new TimeEdit(property);
+ case DateTime:
+ return new DateTimeEdit(property);
+ case StringList:
+ return new StringListEdit(property);
+ case Color:
+ return new ColorButton(property);
+ case Font:
+ return new FontEdit(property);
+ case Pixmap:
+ return new PixmapEdit(property);
+
+ // Other default types
+ case Symbol:
+ return new SymbolCombo(property);
+ //case FontName:
+ // return new FontCombo(property);
+ case FileURL:
+ case DirectoryURL:
+ return new URLEdit(property);
+ case LineStyle:
+ return new LineStyleEdit(property);
+
+ // Composed types
+ case Size:
+ return new SizeEdit(property);
+ case Point:
+ return new PointEdit(property);
+ case Rect:
+ return new RectEdit(property);
+ case SizePolicy:
+ return new SizePolicyEdit(property);
+
+ case List:
+ case Map:
+ default:
+ kopropertywarn << "No editor for property " << property->name() << " of type " << property->type() << endl;
+ return new DummyWidget(property);
+ }
+}
+
+/////////////////// Functions related to custom properties /////////////////////////////////////
+
+void
+FactoryManager::registerFactoryForProperty(int propertyType, CustomPropertyFactory *factory)
+{
+ if(!factory)
+ return;
+ if(d->registeredCustomProperties.find(propertyType))
+ kopropertywarn << "FactoryManager::registerFactoryForProperty(): "
+ "Overriding already registered custom property type \"" << propertyType << "\"" << endl;
+
+ d->registeredCustomProperties.replace(propertyType, factory);
+}
+
+void
+FactoryManager::registerFactoryForProperties(const QValueList<int> &propertyTypes,
+ CustomPropertyFactory *factory)
+{
+ QValueList<int>::ConstIterator endIt = propertyTypes.constEnd();
+ for(QValueList<int>::ConstIterator it = propertyTypes.constBegin(); it != endIt; ++it)
+ registerFactoryForProperty(*it, factory);
+}
+
+CustomProperty*
+FactoryManager::createCustomProperty(Property *parent)
+{
+ const int type = parent->type();
+ CustomPropertyFactory *factory = d->registeredWidgets.find(type);
+ if (factory)
+ return factory->createCustomProperty(parent);
+
+ switch(type) {
+ case Size: case Size_Width: case Size_Height:
+ return new SizeCustomProperty(parent);
+ case Point: case Point_X: case Point_Y:
+ return new PointCustomProperty(parent);
+ case Rect: case Rect_X: case Rect_Y: case Rect_Width: case Rect_Height:
+ return new RectCustomProperty(parent);
+ case SizePolicy: case SizePolicy_HorStretch: case SizePolicy_VerStretch:
+ case SizePolicy_HorData: case SizePolicy_VerData:
+ return new SizePolicyCustomProperty(parent);
+ default:
+ return 0;
+ }
+}
+