27#include <klibloader.h>
28#include <tdeparts/componentfactory.h>
30#include <kiconloader.h>
31#include <tdepopupmenu.h>
33#include "widgetfactory.h"
34#include "widgetlibrary.h"
35#include "libactionwidget.h"
43class XMLGUIClient : public TQObject, public KXMLGUIClient
46 XMLGUIClient(KXMLGUIClient* parent, const TQString& xmlFileName)
47 : TQObject(parent->actionCollection()), KXMLGUIClient(parent)
54class WidgetLibraryPrivate
57 WidgetLibraryPrivate()
60 , services(101, false)
61 , supportedFactoryGroups(17, false)
62 , factories(101, false)
63 , advancedProperties(1009, true)
64 , hiddenClasses(101, true)
65 , showAdvancedProperties(true)
66 , factoriesLoaded(false)
68 services.setAutoDelete( true);
69 advancedProperties.insert( "autoMask", ( char*)1);
70 advancedProperties.insert( "baseSize", ( char*)1);
71 advancedProperties.insert( "mouseTracking", ( char*)1);
72 advancedProperties.insert( "acceptDrops", ( char*)1);
73 advancedProperties.insert( "cursorPosition", ( char*)1);
74 advancedProperties.insert( "contextMenuEnabled", ( char*)1);
75 advancedProperties.insert( "trapEnterKeyEvent", ( char*)1);
76 advancedProperties.insert( "dragEnabled", ( char*)1);
77 advancedProperties.insert( "enableSqueezedText", ( char*)1);
78 advancedProperties.insert( "sizeIncrement", ( char*)1);
advancedProperties.insert( "palette", ( char*)1); 80 advancedProperties.insert( "backgroundOrigin", ( char*)1);
81 advancedProperties.insert( "backgroundMode", ( char*)1);
82 advancedProperties.insert( "layout", ( char*)1);
84 advancedProperties.insert( "minimumSize", ( char*)1);
85 advancedProperties.insert( "maximumSize", ( char*)1);
86#ifdef KEXI_NO_UNFINISHED
88 advancedProperties.insert( "paletteBackgroundPixmap", ( char*)1);
89 advancedProperties.insert( "icon", ( char*)1);
90 advancedProperties.insert( "pixmap", ( char*)1);
91 advancedProperties.insert( "accel", ( char*)1);
95 WidgetInfo::Dict widgets;
96 TQAsciiDict<KService::Ptr> services;
97 TQAsciiDict<char> supportedFactoryGroups;
99 TQAsciiDict<char> advancedProperties;
100 TQAsciiDict<char> hiddenClasses;
101 bool showAdvancedProperties : 1;
102 bool factoriesLoaded : 1;
112 , d( new WidgetLibraryPrivate())
114 for (TQStringList::ConstIterator it = supportedFactoryGroups.constBegin();
115 it!=supportedFactoryGroups.constEnd(); ++ it)
117 d->supportedFactoryGroups.insert( (*it).lower().latin1(), ( char*)1);
122WidgetLibrary::~WidgetLibrary()
130 const WidgetInfo::Dict widgets = f-> classes();
134 if (0 != d->hiddenClasses[ w->className() ])
137 if (! w->m_parentFactoryName.isEmpty() && ! w->m_inheritedClassName.isEmpty()) {
140 kdWarning() << "WidgetLibrary::loadFactoryWidgets(): class '" << w->className()
141 << "' - no such parent factory '" << w->m_parentFactoryName << "'" << endl;
145 if (!inheritedClass) {
147 << "' - no such class to inherit in factory '" << w->m_parentFactoryName << "'" << endl;
151 w->m_inheritedClass = inheritedClass;
152 if ( w->pixmap().isEmpty())
153 w->setPixmap( inheritedClass-> pixmap() );
155 foreach (TQValueList<TQCString>::ConstIterator, it_alt, inheritedClass->m_alternateNames) {
158 if ( w->includeFileName().isEmpty())
159 w->setIncludeFileName( inheritedClass->includeFileName() );
160 if ( w->name().isEmpty())
161 w->setName( inheritedClass-> name() );
162 if ( w->namePrefix().isEmpty())
164 if ( w->description().isEmpty())
165 w->setDescription( inheritedClass->description() );
169 TQValueList<TQCString> l = w->alternateClassNames();
170 l.prepend( w->className() );
174 TQValueList<TQCString>::ConstIterator endIt = l.constEnd();
175 for(TQValueList<TQCString>::ConstIterator it = l.constBegin(); it != endIt; ++ it) {
181 d->widgets.replace( * it, w);
198 TDETrader::OfferList tlist = TDETrader::self()->query( "KFormDesigner/WidgetFactory");
199 TDETrader::OfferList::ConstIterator it, end( tlist.constEnd() );
200 for( it = tlist.constBegin(); it != end; ++ it)
202 KService::Ptr ptr = (*it);
203 KService::Ptr* existingService = (d->services)[ptr->library().latin1()];
205 kdWarning() << "WidgetLibrary::lookupFactories(): factory '" << ptr->name()
206 << "' already found (library="<< (*existingService)->library()
207 << ")! skipping this one: library=" << ptr->library() << endl;
210 kdDebug() << "WidgetLibrary::lookupFactories(): found factory: " << ptr->name() << endl;
212 TQCString groupName = ptr->property( "X-KFormDesigner-FactoryGroup").toCString();
213 if (!groupName.isEmpty() && !d->supportedFactoryGroups[groupName]) {
214 kdDebug() << "WidgetLibrary::lookupFactories(): factory group '" << groupName
215 << "' is unsupported by this application (library=" << ptr->library() << ")"<< endl;
218 const uint factoryVersion = ptr->property( "X-KFormDesigner-WidgetFactoryVersion").toUInt();
220 kdWarning() << TQString( "WidgetLibrary::lookupFactories(): factory '%1'"
221 " has version '%2' but required Widget Factory version is '%3'\n"
222 " -- skipping this factory!").arg(ptr->library()).arg( factoryVersion)
223 .arg(KFormDesigner::version()) << endl;
226 d->services.insert(ptr->library().latin1(), new KService::Ptr( ptr ));
233 if (d->factoriesLoaded)
235 d->factoriesLoaded = true;
237 WidgetFactory *f = KParts::ComponentFactory::createInstanceFromService<WidgetFactory>(
238 * it.current(), this, (* it.current())->library().latin1(), TQStringList());
240 kdWarning() << "WidgetLibrary::loadFactories(): creating factory failed! "
241 << (* it.current())->library() << endl;
246 f-> m_xmlGUIFileName = (* it.current())->property( "X-KFormDesigner-XMLGUIFileName").toString();
247 d->factories.insert( f->name(), f );
250 if (f->m_hiddenClasses) {
252 d->hiddenClasses.replace( it2.currentKey(), ( char*)1 );
263 if ( it.current()->inheritsFactories())
323 TQObject *receiver, const char *slot)
330 if ( it.current()->m_xmlGUIFileName.isEmpty()) {
331 it.current()->m_guiClient = 0;
334 it.current()->m_guiClient = new XMLGUIClient( client, it.current()->m_xmlGUIFileName);
342 it.current()->factory()->m_guiClient
343 ? it.current()->factory()->m_guiClient->actionCollection() : parent);
344 connect( a, TQ_SIGNAL(prepareInsert( const TQCString &)), receiver, slot);
351WidgetLibrary::addCustomWidgetActions(TDEActionCollection * col)
355 it.current()->createCustomActions(
356 it.current()->m_guiClient
357 ? it.current()->m_guiClient->actionCollection() : col);
370 TQWidget *widget = wclass->factory()->createWidget( wclass->className(), parent, name, c, options);
373 if ( wclass->inheritedClass())
374 widget = wclass->inheritedClass()->factory()->createWidget(
375 wclass->className(), parent, name, c, options);
379 widget->setAcceptDrops( true);
385WidgetLibrary::createMenuActions( const TQCString & c, TQWidget * w, TQPopupMenu * menu,
393 wclass->factory()->m_widget = w;
394 wclass->factory()->m_container = container;
395 if ( wclass->factory()->createMenuActions( c, w, menu, container))
398 if ( wclass->inheritedClass())
399 return wclass->inheritedClass()->factory()
400 ->createMenuActions( wclass->className(), w, menu, container);
415 if ( wclass->inheritedClass())
416 return wclass->inheritedClass()->factory()->startEditing( wclass->className(), w, container);
421WidgetLibrary::previewWidget( const TQCString & classname, TQWidget *widget, Container *container)
431 if ( wclass->inheritedClass())
432 return wclass->inheritedClass()->factory()->previewWidget( wclass->className(), widget, container);
437WidgetLibrary::clearWidgetContent( const TQCString & classname, TQWidget * w)
447 if ( wclass->inheritedClass())
448 return wclass->inheritedClass()->factory()->clearWidgetContent( wclass->className(), w);
453WidgetLibrary::displayName( const TQCString & classname)
464WidgetLibrary::savingName( const TQCString & classname)
469 if( wi && ! wi->savingName().isEmpty())
470 return wi->savingName();
476WidgetLibrary::namePrefix( const TQCString & classname)
481 return wi->namePrefix();
487WidgetLibrary::textForWidgetName( const TQCString &name, const TQCString &className)
509 return wi->className();
513 return "CustomWidget";
517WidgetLibrary::includeFileName( const TQCString & classname)
522 return wi->includeFileName();
528WidgetLibrary::iconName( const TQCString & classname)
535 return TQString::fromLatin1( "unknown_widget");
539WidgetLibrary::saveSpecialProperty( const TQCString & classname, const TQString &name, const TQVariant &value, TQWidget * w, TQDomElement & parentNode, TQDomDocument &parent)
549 if ( wi->inheritedClass())
550 return wi->inheritedClass()->factory()->saveSpecialProperty( wi->className(), name, value, w, parentNode, parent);
564 if ( wi->inheritedClass())
565 return wi->inheritedClass()->factory()->readSpecialProperty( wi->className(), node, w, item);
571 d->showAdvancedProperties = set;
576 return d->showAdvancedProperties;
580WidgetLibrary::isPropertyVisible( const TQCString & classname, TQWidget * w,
581 const TQCString &property, bool multiple, bool isTopLevel)
585 if (!d->showAdvancedProperties && property == "focusPolicy")
593 if (!d->showAdvancedProperties && d->advancedProperties[ property ]) {
595 if ( wi->factory()->internalProperty( classname, "forceShowAdvancedProperty:"+property).isEmpty()
596 && (! wi->inheritedClass() || wi->inheritedClass()->factory()->internalProperty( classname, "forceShowAdvancedProperty:"+property).isEmpty()))
605 if ( wi->inheritedClass()
606 && ! wi->inheritedClass()->factory()->isPropertyVisible( wi->className(), w, property, multiple, isTopLevel))
612TQValueList<TQCString>
613WidgetLibrary::autoSaveProperties( const TQCString & classname)
618 return TQValueList<TQCString>();
619 TQValueList<TQCString> lst;
621 if ( wi->inheritedClass())
622 lst = wi->inheritedClass()->factory()->autoSaveProperties( wi->className());
628WidgetLibrary::widgetInfoForClassName( const char* classname)
635WidgetLibrary::factoryForClassName( const char* classname)
638 return wi ? wi->factory() : 0;
645 TQString desc( winfo->factory()->propertyDescForName(propertyName) );
648 if ( winfo->m_parentFactoryName.isEmpty())
661 if (! winfo->factory())
663 TQString desc( winfo->factory()->propertyDescForValue(name) );
666 if ( winfo->m_parentFactoryName.isEmpty())
679 if (! winfo.factory())
682 if ( winfo.m_parentFactoryName.isEmpty())
695TQString WidgetLibrary::internalProperty( const TQCString& classname, const TQCString& property)
701 TQString value( wclass->factory()->internalProperty( classname, property) );
702 if (value.isEmpty() && wclass->inheritedClass())
703 return wclass->inheritedClass()->factory()->internalProperty( classname, property);
708 const TQCString & classname, TQWidget* parent, const TQPoint& pos)
717 TQString iconName( wclass->factory()->internalProperty( classname, "orientationSelectionPopup:horizontalIcon") );
718 if (iconName.isEmpty() && wclass->inheritedClass())
719 iconName = wclass->inheritedClass()->factory()->internalProperty( classname, "orientationSelectionPopup:horizontalIcon");
720 if (!iconName.isEmpty())
723 iconName = wclass->factory()->internalProperty( classname, "orientationSelectionPopup:verticalIcon");
724 if (iconName.isEmpty() && wclass->inheritedClass())
725 iconName = wclass->inheritedClass()->factory()->internalProperty( classname, "orientationSelectionPopup:verticalIcon");
726 if (!iconName.isEmpty())
731 iconName = wclass->inheritedClass()->factory()->internalProperty( classname, "orientationSelectionPopup:horizontalText");
737 iconName = wclass->inheritedClass()->factory()->internalProperty( classname, "orientationSelectionPopup:verticalText");
741 TDEPopupMenu* popup = new TDEPopupMenu(parent, "orientationSelectionPopup");
745 popup->insertSeparator();
746 popup->insertItem( SmallIcon( "button_cancel"), i18n( "Cancel"), 3);
748 switch (popup->exec( pos)) {
761 const TQCString& classname, TQWidget * w, const TQCString& property)
766 return winfo->factory()->propertySetShouldBeReloadedAfterPropertyChange( classname, w, property);
769#include "widgetlibrary.moc"
|