kexi

widgetlibrary.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2003 Lucijan Busch <lucijan@gmx.at>
3 Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
4 Copyright (C) 2004-2007 Jaroslaw Staniek <js@iidea.pl>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20*/
21
22#include <tqdom.h>
23#include <tqstrlist.h>
24
25#include <kdebug.h>
26#include <tdelocale.h>
27#include <klibloader.h>
28#include <tdeparts/componentfactory.h>
29#include <ktrader.h>
30#include <kiconloader.h>
31#include <tdepopupmenu.h>
32
33#include "widgetfactory.h"
34#include "widgetlibrary.h"
35#include "libactionwidget.h"
36#include "container.h"
37#include "form.h"
38#include "formIO.h"
39
40namespace KFormDesigner {
41
43class XMLGUIClient : public TQObject, public KXMLGUIClient
44{
45 public:
46 XMLGUIClient(KXMLGUIClient* parent, const TQString& xmlFileName)
47 : TQObject(parent->actionCollection()), KXMLGUIClient(parent)
48 {
49 setXMLFile( xmlFileName, true /*merge*/ );
50 }
51};
52
54class WidgetLibraryPrivate
55{
56 public:
57 WidgetLibraryPrivate()
58 : widgets(1009)
59// , alternateWidgets(101)
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)
67 {
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);//this is rather useless
82 advancedProperties.insert("layout", (char*)1);// too large risk to break things
83 // by providing this in propeditor
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);
92#endif
93 }
94 // dict which associates a class name with a Widget class
95 WidgetInfo::Dict widgets;//, alternateWidgets;
96 TQAsciiDict<KService::Ptr> services;
97 TQAsciiDict<char> supportedFactoryGroups;
98 TQAsciiDict<WidgetFactory> factories;
99 TQAsciiDict<char> advancedProperties;
100 TQAsciiDict<char> hiddenClasses;
101 bool showAdvancedProperties : 1;
102 bool factoriesLoaded : 1;
103};
104}
105
106using namespace KFormDesigner;
107
108//-------------------------------------------
109
110WidgetLibrary::WidgetLibrary(TQObject *parent, const TQStringList& supportedFactoryGroups)
111 : TQObject(parent)
112 , d(new WidgetLibraryPrivate())
113{
114 for (TQStringList::ConstIterator it = supportedFactoryGroups.constBegin();
115 it!=supportedFactoryGroups.constEnd(); ++it)
116 {
117 d->supportedFactoryGroups.insert( (*it).lower().latin1(), (char*)1);
118 }
120}
121
122WidgetLibrary::~WidgetLibrary()
123{
124 delete d;
125}
126
127void
129{
130 const WidgetInfo::Dict widgets = f->classes();
131 WidgetInfo *w;
132 for(TQAsciiDictIterator<WidgetInfo> it(widgets); (w = it.current()); ++it)
133 {
134 if (0 != d->hiddenClasses[ w->className() ])
135 continue; //this class is hidden
136 // check if we want to inherit a widget from a different factory
137 if (!w->m_parentFactoryName.isEmpty() && !w->m_inheritedClassName.isEmpty()) {
138 WidgetFactory *parentFactory = d->factories[w->m_parentFactoryName];
139 if (!parentFactory) {
140 kdWarning() << "WidgetLibrary::loadFactoryWidgets(): class '" << w->className()
141 << "' - no such parent factory '" << w->m_parentFactoryName << "'" << endl;
142 continue;
143 }
144 WidgetInfo* inheritedClass = parentFactory->m_classesByName[ w->m_inheritedClassName ];
145 if (!inheritedClass) {
146 kdWarning() << "WidgetLibrary::loadFactoryWidgets(): class '" << w->m_inheritedClassName
147 << "' - no such class to inherit in factory '" << w->m_parentFactoryName << "'" << endl;
148 continue;
149 }
150 //ok: inherit properties:
151 w->m_inheritedClass = inheritedClass;
152 if (w->pixmap().isEmpty())
153 w->setPixmap( inheritedClass->pixmap() );
154 //ok?
155 foreach (TQValueList<TQCString>::ConstIterator, it_alt, inheritedClass->m_alternateNames) {
156 w->addAlternateClassName( *it_alt, inheritedClass->isOverriddenClassName( *it_alt ) );
157 }
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())
163 w->setNamePrefix( inheritedClass->namePrefix() );
164 if (w->description().isEmpty())
165 w->setDescription( inheritedClass->description() );
166 }
167
168// kdDebug() << "WidgetLibrary::addFactory(): adding class " << w->className() << endl;
169 TQValueList<TQCString> l = w->alternateClassNames();
170 l.prepend( w->className() );
171 //d->widgets.insert(w->className(), w);
172// if(!w->alternateClassName().isEmpty()) {
173// TQStringList l = TQStringList::split("|", w->alternateClassName());
174 TQValueList<TQCString>::ConstIterator endIt = l.constEnd();
175 for(TQValueList<TQCString>::ConstIterator it = l.constBegin(); it != endIt; ++it) {
176 WidgetInfo *widgetForClass = d->widgets.find( *it );
177 if (!widgetForClass || (widgetForClass && !widgetForClass->isOverriddenClassName(*it))) {
178 //insert a widgetinfo, if:
179 //1) this class has no alternate class assigned yet, or
180 //2) this class has alternate class assigned but without 'override' flag
181 d->widgets.replace( *it, w);
182 }
183
184/* WidgetInfo *widgetForClass = d->alternateWidgets.find(*it);
185 if (!widgetForClass || (widgetForClass && !widgetForClass->isOverriddenClassName(*it))) {
186 //insert a widgetinfo, if:
187 //1) this class has no alternate class assigned yet, or
188 //2) this class has alternate class assigned but without 'override' flag
189 d->alternateWidgets.replace(*it, w);
190 }*/
191 }
192 }
193}
194
195void
197{
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)
201 {
202 KService::Ptr ptr = (*it);
203 KService::Ptr* existingService = (d->services)[ptr->library().latin1()];
204 if (existingService) {
205 kdWarning() << "WidgetLibrary::lookupFactories(): factory '" << ptr->name()
206 << "' already found (library="<< (*existingService)->library()
207 <<")! skipping this one: library=" << ptr->library() << endl;
208 continue;
209 }
210 kdDebug() << "WidgetLibrary::lookupFactories(): found factory: " << ptr->name() << endl;
211
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;
216 continue;
217 }
218 const uint factoryVersion = ptr->property("X-KFormDesigner-WidgetFactoryVersion").toUInt();
219 if (KFormDesigner::version()!=factoryVersion) {
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;
224 continue;
225 }
226 d->services.insert(ptr->library().latin1(), new KService::Ptr( ptr ));
227 }
228}
229
230void
232{
233 if (d->factoriesLoaded)
234 return;
235 d->factoriesLoaded = true;
236 for (TQAsciiDictIterator<KService::Ptr> it(d->services); it.current(); ++it) {
237 WidgetFactory *f = KParts::ComponentFactory::createInstanceFromService<WidgetFactory>(
238 *it.current(), this, (*it.current())->library().latin1(), TQStringList());
239 if (!f) {
240 kdWarning() << "WidgetLibrary::loadFactories(): creating factory failed! "
241 << (*it.current())->library() << endl;
242 continue;
243 }
244 f->m_library = this;
245 f->m_showAdvancedProperties = d->showAdvancedProperties; //inherit this flag from the library
246 f->m_xmlGUIFileName = (*it.current())->property("X-KFormDesigner-XMLGUIFileName").toString();
247 d->factories.insert( f->name(), f );
248
249 //collect information about classes to be hidden
250 if (f->m_hiddenClasses) {
251 for (TQAsciiDictIterator<char> it2(*f->m_hiddenClasses); it2.current(); ++it2) {
252 d->hiddenClasses.replace( it2.currentKey(), (char*)1 );
253 }
254 }
255 }
256
257 //now we have factories instantiated: load widgets
258 TQPtrList<WidgetFactory> loadLater;
259 for (TQAsciiDictIterator<WidgetFactory> it(d->factories); it.current(); ++it) {
260 //ONE LEVEL, FLAT INHERITANCE, but works!
261 //if this factory inherits from something, load its witgets later
263 if (it.current()->inheritsFactories())
264 loadLater.append( it.current() );
265 else
266 loadFactoryWidgets(it.current());
267 }
268 //load now the rest
269 for (TQPtrListIterator<WidgetFactory> it(loadLater); it.current(); ++it) {
270 loadFactoryWidgets(it.current());
271 }
272}
273
274/* old
275TQString
276WidgetLibrary::createXML()
277{
278 loadFactories();
279
280 TQDomDocument doc("kpartgui");
281 TQDomElement root = doc.createElement("kpartgui");
282
283 root.setAttribute("name", "kformdesigner");
284 root.setAttribute("version", "0.3");
285 doc.appendChild(root);
286
287 TQDomElement toolbar = doc.createElement("ToolBar");
288 toolbar.setAttribute("name", "widgets");
289 root.appendChild(toolbar);
290
291 TQDomElement texttb = doc.createElement("text");
292 toolbar.appendChild(texttb);
293 TQDomText ttext = doc.createTextNode("Widgets");
294 texttb.appendChild(ttext);
295
296 TQDomElement menubar = doc.createElement("MenuBar");
297 toolbar.setAttribute("name", "widgets");
298 root.appendChild(menubar);
299
300 TQDomElement Mtextb = doc.createElement("text");
301 toolbar.appendChild(Mtextb);
302 TQDomText Mtext = doc.createTextNode("Widgets");
303 Mtextb.appendChild(Mtext);
304 TQDomElement menu = doc.createElement("Menu");
305 menu.setAttribute("name", "widgets");
306
307 TQAsciiDictIterator<WidgetInfo> it(d->widgets);
308 int i = 0;
309 for(; it.current(); ++it)
310 {
311 TQDomElement action = doc.createElement("Action");
312 action.setAttribute("name", "library_widget" + it.current()->className());
313 toolbar.appendChild(action);
314
315 i++;
316 }
317
318 return doc.toString();
319}*/
320
321ActionList
322WidgetLibrary::createWidgetActions(KXMLGUIClient* client, TDEActionCollection *parent,
323 TQObject *receiver, const char *slot)
324{
326
327 // init XML gui clients (custom factories have their own .rc files)
328 for (TQAsciiDictIterator<WidgetFactory> it(d->factories); it.current(); ++it)
329 {
330 if (it.current()->m_xmlGUIFileName.isEmpty()) { // probably a built-in factory, with GUI file like kexiformpartinstui.rc
331 it.current()->m_guiClient = 0;
332 }
333 else { // a custom factory with its own .rc file
334 it.current()->m_guiClient = new XMLGUIClient(client, it.current()->m_xmlGUIFileName);
335 }
336 }
337
338 ActionList actions;
339 for (TQAsciiDictIterator<WidgetInfo> it(d->widgets); it.current(); ++it)
340 {
341 LibActionWidget *a = new LibActionWidget(it.current(),
342 it.current()->factory()->m_guiClient
343 ? it.current()->factory()->m_guiClient->actionCollection() : parent);
344 connect(a, TQ_SIGNAL(prepareInsert(const TQCString &)), receiver, slot);
345 actions.append(a);
346 }
347 return actions;
348}
349
350void
351WidgetLibrary::addCustomWidgetActions(TDEActionCollection *col)
352{
353 for (TQAsciiDictIterator<WidgetFactory> it(d->factories); it.current(); ++it)
354 {
355 it.current()->createCustomActions(
356 it.current()->m_guiClient
357 ? it.current()->m_guiClient->actionCollection() : col);
358 }
359}
360
361TQWidget*
362WidgetLibrary::createWidget(const TQCString &classname, TQWidget *parent, const char *name, Container *c,
363 int options)
364{
366 WidgetInfo *wclass = d->widgets[classname];
367 if(!wclass)
368 return 0;
369
370 TQWidget *widget = wclass->factory()->createWidget(wclass->className(), parent, name, c, options);
371 if (!widget) {
372 //try to instantiate from inherited class
373 if (wclass->inheritedClass())
374 widget = wclass->inheritedClass()->factory()->createWidget(
375 wclass->className(), parent, name, c, options);
376 if (!widget)
377 return 0;
378 }
379 widget->setAcceptDrops(true);
380 emit widgetCreated(widget);
381 return widget;
382}
383
384bool
385WidgetLibrary::createMenuActions(const TQCString &c, TQWidget *w, TQPopupMenu *menu,
386 KFormDesigner::Container *container)
387{
389 WidgetInfo *wclass = d->widgets[c];
390 if(!wclass)
391 return false;
392
393 wclass->factory()->m_widget = w;
394 wclass->factory()->m_container = container;
395 if (wclass->factory()->createMenuActions(c, w, menu, container))
396 return true;
397 //try from inherited class
398 if (wclass->inheritedClass())
399 return wclass->inheritedClass()->factory()
400 ->createMenuActions(wclass->className(), w, menu, container);
401 return false;
402}
403
404bool
405WidgetLibrary::startEditing(const TQCString &classname, TQWidget *w, Container *container)
406{
408 WidgetInfo *wclass = d->widgets[classname];
409 if(!wclass)
410 return false;
411
412 if (wclass->factory()->startEditing(classname, w, container))
413 return true;
414 //try from inherited class
415 if (wclass->inheritedClass())
416 return wclass->inheritedClass()->factory()->startEditing(wclass->className(), w, container);
417 return false;
418}
419
420bool
421WidgetLibrary::previewWidget(const TQCString &classname, TQWidget *widget, Container *container)
422{
424 WidgetInfo *wclass = d->widgets[classname];
425 if(!wclass)
426 return false;
427
428 if (wclass->factory()->previewWidget(classname, widget, container))
429 return true;
430 //try from inherited class
431 if (wclass->inheritedClass())
432 return wclass->inheritedClass()->factory()->previewWidget(wclass->className(), widget, container);
433 return false;
434}
435
436bool
437WidgetLibrary::clearWidgetContent(const TQCString &classname, TQWidget *w)
438{
440 WidgetInfo *wclass = d->widgets[classname];
441 if(!wclass)
442 return false;
443
444 if (wclass->factory()->clearWidgetContent(classname, w))
445 return true;
446 //try from inherited class
447 if (wclass->inheritedClass())
448 return wclass->inheritedClass()->factory()->clearWidgetContent(wclass->className(), w);
449 return false;
450}
451
452TQString
453WidgetLibrary::displayName(const TQCString &classname)
454{
456 WidgetInfo *wi = d->widgets.find(classname);
457 if(wi)
458 return wi->name();
459
460 return classname;
461}
462
463TQString
464WidgetLibrary::savingName(const TQCString &classname)
465{
467 TQString s;
468 WidgetInfo *wi = d->widgets.find(classname);
469 if(wi && !wi->savingName().isEmpty())
470 return wi->savingName();
471
472 return classname;
473}
474
475TQString
476WidgetLibrary::namePrefix(const TQCString &classname)
477{
479 WidgetInfo *wi = d->widgets.find(classname);
480 if(wi)
481 return wi->namePrefix();
482
483 return classname;
484}
485
486TQString
487WidgetLibrary::textForWidgetName(const TQCString &name, const TQCString &className)
488{
490 WidgetInfo *widget = d->widgets[className];
491 if(!widget)
492 return TQString();
493
494 TQString newName = name;
495 newName.remove(widget->namePrefix());
496 newName = widget->name() + " " + newName;
497 return newName;
498}
499
500TQCString
501WidgetLibrary::classNameForAlternate(const TQCString &classname)
502{
504 if(d->widgets.find(classname))
505 return classname;
506
507 WidgetInfo *wi = d->widgets[classname];
508 if (wi) {
509 return wi->className();
510 }
511
512 // widget not supported
513 return "CustomWidget";
514}
515
516TQString
517WidgetLibrary::includeFileName(const TQCString &classname)
518{
520 WidgetInfo *wi = d->widgets.find(classname);
521 if(wi)
522 return wi->includeFileName();
523
524 return TQString();
525}
526
527TQString
528WidgetLibrary::iconName(const TQCString &classname)
529{
531 WidgetInfo *wi = d->widgets.find(classname);
532 if(wi)
533 return wi->pixmap();
534
535 return TQString::fromLatin1("unknown_widget");
536}
537
538bool
539WidgetLibrary::saveSpecialProperty(const TQCString &classname, const TQString &name, const TQVariant &value, TQWidget *w, TQDomElement &parentNode, TQDomDocument &parent)
540{
542 WidgetInfo *wi = d->widgets.find(classname);
543 if (!wi)
544 return false;
545
546 if (wi->factory()->saveSpecialProperty(classname, name, value, w, parentNode, parent))
547 return true;
548 //try from inherited class
549 if (wi->inheritedClass())
550 return wi->inheritedClass()->factory()->saveSpecialProperty(wi->className(), name, value, w, parentNode, parent);
551 return false;
552}
553
554bool
555WidgetLibrary::readSpecialProperty(const TQCString &classname, TQDomElement &node, TQWidget *w, ObjectTreeItem *item)
556{
558 WidgetInfo *wi = d->widgets.find(classname);
559 if (!wi)
560 return false;
561 if (wi->factory()->readSpecialProperty(classname, node, w, item))
562 return true;
563 //try from inherited class
564 if (wi->inheritedClass())
565 return wi->inheritedClass()->factory()->readSpecialProperty(wi->className(), node, w, item);
566 return false;
567}
568
570{
571 d->showAdvancedProperties = set;
572}
573
575{
576 return d->showAdvancedProperties;
577}
578
579bool
580WidgetLibrary::isPropertyVisible(const TQCString &classname, TQWidget *w,
581 const TQCString &property, bool multiple, bool isTopLevel)
582{
583 if (isTopLevel) {
584 // no focus policy for top-level form widget...
585 if (!d->showAdvancedProperties && property == "focusPolicy")
586 return false;
587 }
588
590 WidgetInfo *wi = d->widgets.find(classname);
591 if (!wi)
592 return false;
593 if (!d->showAdvancedProperties && d->advancedProperties[ property ]) {
594 //this is advanced property, should we hide it?
595 if (wi->factory()->internalProperty(classname, "forceShowAdvancedProperty:"+property).isEmpty()
596 && (!wi->inheritedClass() || wi->inheritedClass()->factory()->internalProperty(classname, "forceShowAdvancedProperty:"+property).isEmpty()))
597 {
598 return false; //hide it
599 }
600 }
601
602 if (!wi->factory()->isPropertyVisible(classname, w, property, multiple, isTopLevel))
603 return false;
604 //try from inherited class
605 if (wi->inheritedClass()
606 && !wi->inheritedClass()->factory()->isPropertyVisible(wi->className(), w, property, multiple, isTopLevel))
607 return false;
608
609 return true;
610}
611
612TQValueList<TQCString>
613WidgetLibrary::autoSaveProperties(const TQCString &classname)
614{
616 WidgetInfo *wi = d->widgets.find(classname);
617 if(!wi)
618 return TQValueList<TQCString>();
619 TQValueList<TQCString> lst;
620 //prepend from inherited class
621 if (wi->inheritedClass())
622 lst = wi->inheritedClass()->factory()->autoSaveProperties(wi->className());
623 lst += wi->factory()->autoSaveProperties(classname);
624 return lst;
625}
626
628WidgetLibrary::widgetInfoForClassName(const char* classname)
629{
631 return d->widgets.find(classname);
632}
633
635WidgetLibrary::factoryForClassName(const char* classname)
636{
637 WidgetInfo *wi = widgetInfoForClassName(classname);
638 return wi ? wi->factory() : 0;
639}
640
641TQString WidgetLibrary::propertyDescForName(WidgetInfo *winfo, const TQCString& propertyName)
642{
643 if (!winfo || !winfo->factory())
644 return TQString();
645 TQString desc( winfo->factory()->propertyDescForName(propertyName) );
646 if (!desc.isEmpty())
647 return desc;
648 if (winfo->m_parentFactoryName.isEmpty())
649 return TQString();
650
651 //try in parent factory, if exists
652 WidgetFactory *parentFactory = d->factories[winfo->m_parentFactoryName];
653 if (!parentFactory)
654 return TQString();
655
656 return parentFactory->propertyDescForName(propertyName);
657}
658
659TQString WidgetLibrary::propertyDescForValue(WidgetInfo *winfo, const TQCString& name)
660{
661 if (!winfo->factory())
662 return TQString();
663 TQString desc( winfo->factory()->propertyDescForValue(name) );
664 if (!desc.isEmpty())
665 return desc;
666 if (winfo->m_parentFactoryName.isEmpty())
667 return TQString();
668
669 //try in parent factory, if exists
670 WidgetFactory *parentFactory = d->factories[winfo->m_parentFactoryName];
671 if (!parentFactory)
672 return TQString();
673
674 return parentFactory->propertyDescForValue(name);
675}
676
677void WidgetLibrary::setPropertyOptions( WidgetPropertySet& buf, const WidgetInfo& winfo, TQWidget* w )
678{
679 if (!winfo.factory())
680 return;
681 winfo.factory()->setPropertyOptions(buf, winfo, w);
682 if (winfo.m_parentFactoryName.isEmpty())
683 return;
684 WidgetFactory *parentFactory = d->factories[winfo.m_parentFactoryName];
685 if (!parentFactory)
686 return;
687 parentFactory->setPropertyOptions(buf, winfo, w);
688}
689
690WidgetFactory* WidgetLibrary::factory(const char* factoryName) const
691{
692 return d->factories[factoryName];
693}
694
695TQString WidgetLibrary::internalProperty(const TQCString& classname, const TQCString& property)
696{
698 WidgetInfo *wclass = d->widgets[classname];
699 if(!wclass)
700 return TQString();
701 TQString value( wclass->factory()->internalProperty(classname, property) );
702 if (value.isEmpty() && wclass->inheritedClass())
703 return wclass->inheritedClass()->factory()->internalProperty(classname, property);
704 return value;
705}
706
708 const TQCString &classname, TQWidget* parent, const TQPoint& pos)
709{
711 WidgetInfo *wclass = d->widgets[classname];
712 if(!wclass)
714
715 //get custom icons and strings
716 TQPixmap iconHorizontal, iconVertical;
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())
721 iconHorizontal = SmallIcon(iconName);
722
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())
727 iconVertical = SmallIcon(iconName);
728
729 TQString textHorizontal = wclass->factory()->internalProperty(classname, "orientationSelectionPopup:horizontalText");
730 if (textHorizontal.isEmpty() && wclass->inheritedClass())
731 iconName = wclass->inheritedClass()->factory()->internalProperty(classname, "orientationSelectionPopup:horizontalText");
732 if (textHorizontal.isEmpty()) //default
733 textHorizontal = i18n("Insert Horizontal Widget", "Insert Horizontal");
734
735 TQString textVertical = wclass->factory()->internalProperty(classname, "orientationSelectionPopup:verticalText");
736 if (textVertical.isEmpty() && wclass->inheritedClass())
737 iconName = wclass->inheritedClass()->factory()->internalProperty(classname, "orientationSelectionPopup:verticalText");
738 if (textVertical.isEmpty()) //default
739 textVertical = i18n("Insert Vertical Widget", "Insert Vertical");
740
741 TDEPopupMenu* popup = new TDEPopupMenu(parent, "orientationSelectionPopup");
742 popup->insertTitle(SmallIcon(wclass->pixmap()), i18n("Insert Widget: %1").arg(wclass->name()));
743 popup->insertItem(iconHorizontal, textHorizontal, 1);
744 popup->insertItem(iconVertical, textVertical, 2);
745 popup->insertSeparator();
746 popup->insertItem(SmallIcon("button_cancel"), i18n("Cancel"), 3);
748 switch (popup->exec(pos)) {
749 case 1:
751 case 2:
753 default:
754 result = WidgetFactory::AnyOrientation; //means "cancelled"
755 }
756 delete popup;
757 return result;
758}
759
761 const TQCString& classname, TQWidget *w, const TQCString& property)
762{
763 WidgetInfo *winfo = widgetInfoForClassName(classname);
764 if (!winfo)
765 return false;
766 return winfo->factory()->propertySetShouldBeReloadedAfterPropertyChange(classname, w, property);
767}
768
769#include "widgetlibrary.moc"
This class makes a container out of any TQWidget.
Definition container.h:74
TDEToggleAction subclass which remembers the matching class name.
An item representing a widget Holds the properties of a widget (classname, name, parent,...
Definition objecttree.h:59
The base class for all widget Factories.
virtual bool readSpecialProperty(const TQCString &classname, TQDomElement &node, TQWidget *w, ObjectTreeItem *item)
virtual bool startEditing(const TQCString &classname, TQWidget *w, Container *container)=0
TQString propertyDescForValue(const TQCString &name)
TQString internalProperty(const TQCString &classname, const TQCString &property) const
CreateWidgetOptions
Options used in createWidget().
@ VerticalOrientation
vertical orientation hint
@ HorizontalOrientation
horizontal orientation hint
@ AnyOrientation
any orientation hint
virtual TQValueList< TQCString > autoSaveProperties(const TQCString &classname)=0
bool isPropertyVisible(const TQCString &classname, TQWidget *w, const TQCString &property, bool multiple, bool isTopLevel)
virtual void setPropertyOptions(WidgetPropertySet &buf, const WidgetInfo &info, TQWidget *w)
virtual bool createMenuActions(const TQCString &classname, TQWidget *w, TQPopupMenu *menu, KFormDesigner::Container *container)=0
TQString propertyDescForName(const TQCString &name)
const WidgetInfo::Dict classes() const
virtual bool propertySetShouldBeReloadedAfterPropertyChange(const TQCString &classname, TQWidget *w, const TQCString &property)
virtual TQWidget * createWidget(const TQCString &classname, TQWidget *parent, const char *name, KFormDesigner::Container *container, int options=DefaultOptions)=0
Creates a widget (and if needed a KFormDesigner::Container).
virtual bool saveSpecialProperty(const TQCString &classname, const TQString &name, const TQVariant &value, TQWidget *w, TQDomElement &parentNode, TQDomDocument &parent)
virtual bool previewWidget(const TQCString &classname, TQWidget *widget, Container *container)=0
This class holds properties of widget classes provided by a factory.
void addAlternateClassName(const TQCString &alternateName, bool override=false)
TQString namePrefix() const
TQString pixmap() const
bool isOverriddenClassName(const TQCString &alternateName) const
void setIncludeFileName(const TQString &name)
TQCString m_inheritedClassName
Used for inheriting widgets between factories.
TQCString className() const
TQCString classNameForAlternate(const TQCString &classname)
ActionList createWidgetActions(KXMLGUIClient *client, TDEActionCollection *parent, TQObject *receiver, const char *slot)
creates actions for widget creating
TQWidget * createWidget(const TQCString &classname, TQWidget *parent, const char *name, Container *c, int options=WidgetFactory::DefaultOptions)
searches the right factory and creates a widget.
WidgetFactory::CreateWidgetOptions showOrientationSelectionPopup(const TQCString &classname, TQWidget *parent, const TQPoint &pos)
Shows orientation selection popup.
void setAdvancedPropertiesVisible(bool set)
void widgetCreated(TQWidget *widget)
TQString propertyDescForName(WidgetInfo *winfo, const TQCString &propertyName)
TQString propertyDescForValue(WidgetInfo *winfo, const TQCString &name)
WidgetLibrary(TQObject *parent=0, const TQStringList &supportedFactoryGroups=TQStringList())
void loadFactories()
Loads widget factories found in lookupFactories().
void lookupFactories()
Lookups widget factories list (note that this function get called once in ctor).
void setPropertyOptions(WidgetPropertySet &list, const WidgetInfo &winfo, TQWidget *w)
bool propertySetShouldBeReloadedAfterPropertyChange(const TQCString &classname, TQWidget *w, const TQCString &property)
void loadFactoryWidgets(WidgetFactory *f)
Adds a factory to the library, creates actions for widgets in the added factory.
KFORMEDITOR_EXPORT uint version()
Definition formIO.cpp:84