23#include <tqmetaobject.h>
26#include <tqtextstream.h>
31#include <tqobjectlist.h>
32#include <tqdatetime.h>
36#include <tdefiledialog.h>
39#include <tdeaccelmanager.h>
43#include "objecttree.h"
44#include "formmanager.h"
45#include "widgetlibrary.h"
47#include "pixmapcollection.h"
50#include "kexiflowlayout.h"
51#include "widgetwithsubpropertiesinterface.h"
56: TQWidget(parent, name), m_className(className)
58 setBackgroundMode(TQt::PaletteDark);
61CustomWidget::~CustomWidget()
66CustomWidget::paintEvent(TQPaintEvent *)
69 p.setPen(palette().active().text());
72 p.drawText(r, TQt::AlignTop, m_className);
77TQDict<TQLabel> *FormIO::m_buddies = 0;
79Form *FormIO::m_currentForm = 0;
80bool FormIO::m_savePixmapsInline = false;
86 return KFORMDESIGNER_VERSION;
105 if(!form-> filename().isNull() && filename.isNull())
108 if(filename.isNull())
110 m_filename = KFileDialog::getSaveFileName(TQString(), i18n( "*.ui|TQt Designer UI Files"));
111 if(m_filename.isNull())
115 m_filename = filename;
118 TQDomDocument domDoc;
122 TQFile file(m_filename);
123 if (!file.open(IO_WriteOnly))
126 TQTextStream stream(&file);
127 stream << domDoc.toString(3) << endl;
136 TQDomDocument domDoc;
139 dest = domDoc.toCString();
146 TQDomDocument domDoc;
149 dest = domDoc.toString(indent);
156 m_currentForm = form;
158 domDoc = TQDomDocument( "UI");
159 TQDomElement uiElement = domDoc.createElement( "UI");
160 domDoc.appendChild(uiElement);
161 uiElement.setAttribute( "version", "3.1");
162 uiElement.setAttribute( "stdsetdef", 1);
167 TQDomElement headerPropertiesEl = domDoc.createElement( "kfd:customHeader");
169 headerPropertiesEl.setAttribute(it.key(), it.data());
171 uiElement.appendChild(headerPropertiesEl);
174 TQDomElement inlinePix = domDoc.createElement( "pixmapinproject");
175 uiElement.appendChild(inlinePix);
178 TQDomElement baseClass = domDoc.createElement( "class");
179 uiElement.appendChild(baseClass);
180 TQDomText baseClassV = domDoc.createTextNode( "TQWidget");
181 baseClass.appendChild(baseClassV);
187 TQDomElement layoutDefaults = domDoc.createElement( "layoutDefaults");
188 layoutDefaults.setAttribute( "spacing", TQString::number(form-> defaultSpacing()));
189 layoutDefaults.setAttribute( "margin", TQString::number(form-> defaultMargin()));
190 uiElement.appendChild(layoutDefaults);
195 TQDomElement tabStops = domDoc.createElement( "tabstops");
196 uiElement.appendChild(tabStops);
199 TQDomElement tabstop = domDoc.createElement( "tabstop");
200 tabStops.appendChild(tabstop);
201 TQDomText tabStopText = domDoc.createTextNode(it.current()->name());
202 tabstop.appendChild(tabStopText);
206 form->pixmapCollection()->save(uiElement);
208 form->connectionBuffer()->save(uiElement);
210 form->commandHistory()->documentSaved();
227 bool parsed = inBuf.setContent(src, false, &errMsg, &errLine, &errCol);
231 kdDebug() << "WidgetWatcher::load(): " << errMsg << endl;
232 kdDebug() << "WidgetWatcher::load(): line: " << errLine << " col: " << errCol << endl;
244FormIO::loadFormFromString( Form *form, TQWidget *container, TQString &src, bool preview)
251 form->m_recentlyLoadedUICode = src;
255 bool parsed = inBuf.setContent(src, false, &errMsg, &errLine, &errCol);
259 kdDebug() << "WidgetWatcher::load(): " << errMsg << endl;
260 kdDebug() << "WidgetWatcher::load(): line: " << errLine << " col: " << errCol << endl;
279 if(filename.isNull())
281 m_filename = KFileDialog::getOpenFileName(TQString(), i18n( "*.ui|TQt Designer UI Files"));
282 if(m_filename.isNull())
286 m_filename = filename;
288 TQFile file(m_filename);
289 if(!file.open(IO_ReadOnly))
291 kdDebug() << "Cannot open the file " << filename << endl;
294 TQTextStream stream(&file);
295 TQString text = stream.read();
298 bool parsed = inBuf.setContent(text, false, &errMsg, &errLine, &errCol);
302 kdDebug() << "WidgetWatcher::load(): " << errMsg << endl;
303 kdDebug() << "WidgetWatcher::load(): line: " << errLine << " col: " << errCol << endl;
313 m_currentForm = form;
315 TQDomElement ui = inBuf.namedItem( "UI").toElement();
319 TQDomElement headerPropertiesEl = ui.namedItem( "kfd:customHeader").toElement();
320 TQDomAttr attr = headerPropertiesEl.firstChild().toAttr();
321 while (!attr.isNull() && attr.isAttr()) {
323 attr = attr.nextSibling().toAttr();
333 kdDebug() << "FormIO::loadFormFromDom(): original format version: " << ver << endl;
334 form->setOriginalFormatVersion( ver );
338 kdDebug() << "FormIO::loadFormFromDom(): original format is older than current: " << KFormDesigner::version() << endl;
342 form->setFormatVersion( ver );
346 kdDebug() << "FormIO::loadFormFromDom(): original format is newer than current: " << KFormDesigner::version() << endl;
350 m_savePixmapsInline = ( (ui.namedItem( "pixmapinproject").isNull()) || (!ui.namedItem( "images").isNull()) );
351 form->pixmapCollection()->load(ui.namedItem( "collection"));
353 TQDomElement element = ui.namedItem( "widget").toElement();
357 TQDomElement tabStops = ui.namedItem( "tabstops").toElement();
360 if(!tabStops.isNull()) {
362 uint itemsNotFound = 0;
363 for(TQDomNode n = tabStops.firstChild(); !n.isNull(); n = n.nextSibling(), i++)
365 TQString name = n.toElement().text();
369 kdDebug() << "FormIO::loadFormFromDom ERROR : no ObjectTreeItem " << endl;
372 const int index = form-> tabStops()->findRef(item);
374 const int realIndex = i - itemsNotFound;
375 if((index != -1) && (index != realIndex))
378 form-> tabStops()->insert(realIndex, item);
382 kdDebug() << "FormIO: item '" << name << "' not in list" << endl;
388 form->connectionBuffer()->load(ui.namedItem( "connections"));
407 TQWidget *subwidget = w;
408 bool addSubwidgetFlag = false;
409 int propertyId = w->metaObject()->findProperty(name, true);
410 if (propertyId == -1 && subpropIface && subpropIface-> subwidget()) {
412 propertyId = subpropIface-> subwidget()->metaObject()->findProperty(name, true);
413 addSubwidgetFlag = true;
417 kdDebug() << "FormIO::savePropertyValue() The object doesn't have this property. Let's try the WidgetLibrary." << endl;
419 lib->saveSpecialProperty(w->className(), name, value, w, parentNode, parent);
423 const TQMetaProperty *meta = subwidget->metaObject()->property(propertyId, true);
424 if (!meta->stored( subwidget ))
426 TQDomElement propertyE = parent.createElement( "property");
427 propertyE.setAttribute( "name", name);
428 if (addSubwidgetFlag)
429 propertyE.setAttribute( "subwidget", "true");
431 if(meta && meta->isEnumType())
437 if(meta->isSetType())
439 TQStringList list = TQStringList::fromStrList(meta->valueToKeys(value.toInt()));
440 type = parent.createElement( "set");
441 valueE = parent.createTextNode(list.join( "|"));
442 type.appendChild(valueE);
446 TQString s = meta->valueToKey(value.toInt());
447 type = parent.createElement( "enum");
448 valueE = parent.createTextNode(s);
449 type.appendChild(valueE);
451 propertyE.appendChild(type);
452 parentNode.appendChild(propertyE);
456 if(value.type() == TQVariant::Pixmap) {
458 TQDomElement type = parent.createElement( "pixmap");
459 TQCString property = propertyE.attribute( "name").latin1();
461 if(m_savePixmapsInline )
462 valueE = parent.createTextNode( saveImage(parent, value.toPixmap()));
464 valueE = parent.createTextNode(m_currentItem->pixmapName(property));
465 type.appendChild(valueE);
466 propertyE.appendChild(type);
467 parentNode.appendChild(propertyE);
473 parentNode.appendChild(propertyE);
484 case TQVariant::String:
486 type = parent.createElement( "string");
487 valueE = parent.createTextNode(value.toString());
488 type.appendChild(valueE);
491 case TQVariant::CString:
493 type = parent.createElement( "cstring");
494 valueE = parent.createTextNode(value.toString());
495 type.appendChild(valueE);
498 case TQVariant::Rect:
500 type = parent.createElement( "rect");
501 TQDomElement x = parent.createElement( "x");
502 TQDomElement y = parent.createElement( "y");
503 TQDomElement w = parent.createElement( "width");
504 TQDomElement h = parent.createElement( "height");
505 TQDomText valueX = parent.createTextNode(TQString::number(value.toRect().x()));
506 TQDomText valueY = parent.createTextNode(TQString::number(value.toRect().y()));
507 TQDomText valueW = parent.createTextNode(TQString::number(value.toRect().width()));
508 TQDomText valueH = parent.createTextNode(TQString::number(value.toRect().height()));
510 x.appendChild(valueX);
511 y.appendChild(valueY);
512 w.appendChild(valueW);
513 h.appendChild(valueH);
521 case TQVariant::Color:
523 type = parent.createElement( "color");
524 TQDomElement r = parent.createElement( "red");
525 TQDomElement g = parent.createElement( "green");
526 TQDomElement b = parent.createElement( "blue");
527 TQDomText valueR = parent.createTextNode(TQString::number(value.toColor().red()));
528 TQDomText valueG = parent.createTextNode(TQString::number(value.toColor().green()));
529 TQDomText valueB = parent.createTextNode(TQString::number(value.toColor().blue()));
531 r.appendChild(valueR);
532 g.appendChild(valueG);
533 b.appendChild(valueB);
540 case TQVariant::Bool:
542 type = parent.createElement( "bool");
544 valueE = parent.createTextNode(value.toBool() ? "true" : "false");
545 type.appendChild(valueE);
549 case TQVariant::UInt:
551 type = parent.createElement( "number");
552 valueE = parent.createTextNode(TQString::number(value.toInt()));
553 type.appendChild(valueE);
556 case TQVariant::Size:
558 type = parent.createElement( "size");
559 TQDomElement w = parent.createElement( "width");
560 TQDomElement h = parent.createElement( "height");
561 TQDomText valueW = parent.createTextNode(TQString::number(value.toSize().width()));
562 TQDomText valueH = parent.createTextNode(TQString::number(value.toSize().height()));
564 w.appendChild(valueW);
565 h.appendChild(valueH);
571 case TQVariant::Point:
573 type = parent.createElement( "point");
574 TQDomElement x = parent.createElement( "x");
575 TQDomElement y = parent.createElement( "y");
576 TQDomText valueX = parent.createTextNode(TQString::number(value.toPoint().x()));
577 TQDomText valueY = parent.createTextNode(TQString::number(value.toPoint().y()));
579 x.appendChild(valueX);
580 y.appendChild(valueY);
586 case TQVariant::Font:
588 type = parent.createElement( "font");
589 TQDomElement f = parent.createElement( "family");
590 TQDomElement p = parent.createElement( "pointsize");
591 TQDomElement w = parent.createElement( "weight");
592 TQDomElement b = parent.createElement( "bold");
593 TQDomElement i = parent.createElement( "italic");
594 TQDomElement u = parent.createElement( "underline");
595 TQDomElement s = parent.createElement( "strikeout");
596 TQDomText valueF = parent.createTextNode(value.toFont().family());
597 TQDomText valueP = parent.createTextNode(TQString::number(value.toFont().pointSize()));
598 TQDomText valueW = parent.createTextNode(TQString::number(value.toFont().weight()));
599 TQDomText valueB = parent.createTextNode(TQString::number(value.toFont().bold()));
600 TQDomText valueI = parent.createTextNode(TQString::number(value.toFont().italic()));
601 TQDomText valueU = parent.createTextNode(TQString::number(value.toFont().underline()));
602 TQDomText valueS = parent.createTextNode(TQString::number(value.toFont().strikeOut()));
604 f.appendChild(valueF);
605 p.appendChild(valueP);
606 w.appendChild(valueW);
607 b.appendChild(valueB);
608 i.appendChild(valueI);
609 u.appendChild(valueU);
610 s.appendChild(valueS);
621 case TQVariant::Cursor:
623 type = parent.createElement( "cursor");
624 valueE = parent.createTextNode(TQString::number(value.toCursor().shape()));
625 type.appendChild(valueE);
628 case TQVariant::SizePolicy:
630 type = parent.createElement( "sizepolicy");
631 TQDomElement h = parent.createElement( "hsizetype");
632 TQDomElement v = parent.createElement( "vsizetype");
633 TQDomElement hs = parent.createElement( "horstretch");
634 TQDomElement vs = parent.createElement( "verstretch");
635 TQDomText valueH = parent.createTextNode(TQString::number(value.toSizePolicy().horData()));
636 TQDomText valueV = parent.createTextNode(TQString::number(value.toSizePolicy().verData()));
637 TQDomText valueHS = parent.createTextNode(TQString::number(value.toSizePolicy().horStretch()));
638 TQDomText valueVS = parent.createTextNode(TQString::number(value.toSizePolicy().verStretch()));
640 h.appendChild(valueH);
641 v.appendChild(valueV);
642 hs.appendChild(valueHS);
643 vs.appendChild(valueVS);
647 type.appendChild(hs);
648 type.appendChild(vs);
651 case TQVariant::Time:
653 type = parent.createElement( "time");
654 TQDomElement h = parent.createElement( "hour");
655 TQDomElement m = parent.createElement( "minute");
656 TQDomElement s = parent.createElement( "second");
657 TQDomText valueH = parent.createTextNode(TQString::number(value.toTime().hour()));
658 TQDomText valueM = parent.createTextNode(TQString::number(value.toTime().minute()));
659 TQDomText valueS = parent.createTextNode(TQString::number(value.toTime().second()));
661 h.appendChild(valueH);
662 m.appendChild(valueM);
663 s.appendChild(valueS);
670 case TQVariant::Date:
672 type = parent.createElement( "date");
673 TQDomElement y = parent.createElement( "year");
674 TQDomElement m = parent.createElement( "month");
675 TQDomElement d = parent.createElement( "day");
676 TQDomText valueY = parent.createTextNode(TQString::number(value.toDate().year()));
677 TQDomText valueM = parent.createTextNode(TQString::number(value.toDate().month()));
678 TQDomText valueD = parent.createTextNode(TQString::number(value.toDate().day()));
680 y.appendChild(valueY);
681 m.appendChild(valueM);
682 d.appendChild(valueD);
689 case TQVariant::DateTime:
691 type = parent.createElement( "datetime");
692 TQDomElement h = parent.createElement( "hour");
693 TQDomElement m = parent.createElement( "minute");
694 TQDomElement s = parent.createElement( "second");
695 TQDomElement y = parent.createElement( "year");
696 TQDomElement mo = parent.createElement( "month");
697 TQDomElement d = parent.createElement( "day");
698 TQDomText valueH = parent.createTextNode(TQString::number(value.toDateTime().time().hour()));
699 TQDomText valueM = parent.createTextNode(TQString::number(value.toDateTime().time().minute()));
700 TQDomText valueS = parent.createTextNode(TQString::number(value.toDateTime().time().second()));
701 TQDomText valueY = parent.createTextNode(TQString::number(value.toDateTime().date().year()));
702 TQDomText valueMo = parent.createTextNode(TQString::number(value.toDateTime().date().month()));
703 TQDomText valueD = parent.createTextNode(TQString::number(value.toDateTime().date().day()));
705 h.appendChild(valueH);
706 m.appendChild(valueM);
707 s.appendChild(valueS);
708 y.appendChild(valueY);
709 mo.appendChild(valueMo);
710 d.appendChild(valueD);
716 type.appendChild(mo);
724 parentNode.appendChild(type);
728FormIO::savePropertyElement(TQDomElement &parentNode, TQDomDocument &domDoc, const TQString &tagName, const TQString &property, const TQVariant &value)
730 TQDomElement propertyE = domDoc.createElement(tagName);
731 propertyE.setAttribute( "name", property);
733 parentNode.appendChild(propertyE);
739 TQDomElement tag = node.toElement();
740 TQString text = tag.text();
741 TQString type = tag.tagName();
743 if(type == "string" || type == "cstring")
745 else if(type == "rect")
747 TQDomElement x = node.namedItem( "x").toElement();
748 TQDomElement y = node.namedItem( "y").toElement();
749 TQDomElement w = node.namedItem( "width").toElement();
750 TQDomElement h = node.namedItem( "height").toElement();
752 int rx = x.text().toInt();
753 int ry = y.text().toInt();
754 int rw = w.text().toInt();
755 int rh = h.text().toInt();
757 return TQRect(rx, ry, rw, rh);
759 else if(type == "color")
761 TQDomElement r = node.namedItem( "red").toElement();
762 TQDomElement g = node.namedItem( "green").toElement();
763 TQDomElement b = node.namedItem( "blue").toElement();
765 int red = r.text().toInt();
766 int green = g.text().toInt();
767 int blue = b.text().toInt();
769 return TQColor(red, green, blue);
771 else if(type == "bool")
774 return TQVariant( true);
775 else if(text == "false")
776 return TQVariant( false);
777 return TQVariant(text.toInt());
779 else if(type == "number")
783 else if(type == "size")
785 TQDomElement w = node.namedItem( "width").toElement();
786 TQDomElement h = node.namedItem( "height").toElement();
788 return TQSize(w.text().toInt(), h.text().toInt());
790 else if(type == "point")
792 TQDomElement x = node.namedItem( "x").toElement();
793 TQDomElement y = node.namedItem( "y").toElement();
795 return TQPoint(x.text().toInt(), y.text().toInt());
797 else if(type == "font")
799 TQDomElement fa = node.namedItem( "family").toElement();
800 TQDomElement p = node.namedItem( "pointsize").toElement();
801 TQDomElement w = node.namedItem( "weight").toElement();
802 TQDomElement b = node.namedItem( "bold").toElement();
803 TQDomElement i = node.namedItem( "italic").toElement();
804 TQDomElement u = node.namedItem( "underline").toElement();
805 TQDomElement s = node.namedItem( "strikeout").toElement();
808 f.setFamily(fa.text());
809 f.setPointSize(p.text().toInt());
810 f.setWeight(w.text().toInt());
811 f.setBold(b.text().toInt());
812 f.setItalic(i.text().toInt());
813 f.setUnderline(u.text().toInt());
814 f.setStrikeOut(s.text().toInt());
818 else if(type == "cursor")
820 return TQCursor(text.toInt());
822 else if(type == "time")
824 TQDomElement h = node.namedItem( "hour").toElement();
825 TQDomElement m = node.namedItem( "minute").toElement();
826 TQDomElement s = node.namedItem( "second").toElement();
828 return TQTime(h.text().toInt(), m.text().toInt(), s.text().toInt());
830 else if(type == "date")
832 TQDomElement y = node.namedItem( "year").toElement();
833 TQDomElement m = node.namedItem( "month").toElement();
834 TQDomElement d = node.namedItem( "day").toElement();
836 return TQDate(y.text().toInt(), m.text().toInt(), d.text().toInt());
838 else if(type == "datetime")
840 TQDomElement h = node.namedItem( "hour").toElement();
841 TQDomElement m = node.namedItem( "minute").toElement();
842 TQDomElement s = node.namedItem( "second").toElement();
843 TQDomElement y = node.namedItem( "year").toElement();
844 TQDomElement mo = node.namedItem( "month").toElement();
845 TQDomElement d = node.namedItem( "day").toElement();
847 TQTime t(h.text().toInt(), m.text().toInt(), s.text().toInt());
848 TQDate da(y.text().toInt(), mo.text().toInt(), d.text().toInt());
850 return TQDateTime(da, t);
852 else if(type == "sizepolicy")
854 TQDomElement h = node.namedItem( "hsizetype").toElement();
855 TQDomElement v = node.namedItem( "vsizetype").toElement();
856 TQDomElement hs = node.namedItem( "horstretch").toElement();
857 TQDomElement vs = node.namedItem( "verstretch").toElement();
860 s.setHorData((TQSizePolicy::SizeType)h.text().toInt());
861 s.setVerData((TQSizePolicy::SizeType)v.text().toInt());
862 s.setHorStretch(hs.text().toInt());
863 s.setVerStretch(vs.text().toInt());
866 else if(type == "pixmap")
868 if(m_savePixmapsInline || !m_currentForm || !m_currentItem || !m_currentForm->pixmapCollection()->contains(text))
869 return loadImage(tag.ownerDocument(), text);
872 m_currentItem->setPixmapName(name.latin1(), text);
873 return m_currentForm->pixmapCollection()->getPixmap(text);
875 return TQVariant(TQPixmap());
877 else if(type == "enum")
879 else if(type == "set")
882 TQObject *subobject = (subpropIface && subpropIface-> subwidget()) ? subpropIface-> subwidget() : obj;
883 const int count = subobject->metaObject()->findProperty(name.latin1(), true);
884 const TQMetaProperty *meta = count!=-1 ? subobject->metaObject()->property(count, true) : 0;
887 if (meta->isSetType()) {
889 const TQStringList list( TQStringList::split( "|", text) );
890 for (TQStringList::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it)
891 keys.append((*it).latin1());
893 return meta->keysToValue(keys);
901 return TQStringList::split( "|", text);
916 bool savedAlignment = false;
918 if(item->className() == "Spring")
920 Spring::saveSpring(item, parent, domDoc, insideGridLayout);
924 bool resetCurrentForm = false;
925 m_currentItem = item;
928 resetCurrentForm = true;
940 TQDomElement tclass = domDoc.createElement( "widget");
941 parent.appendChild(tclass);
945 tclass.setAttribute( "row", item->gridRow());
946 tclass.setAttribute( "column", item->gridCol());
947 if(item->spanMultipleCells())
949 tclass.setAttribute( "rowspan", item->gridRowSpan());
950 tclass.setAttribute( "colspan", item->gridColSpan());
955 tclass.setAttribute( "class", "TQWidget");
957 else if(item->widget()->isA( "HBox") || item->widget()->isA( "VBox") || item->widget()->isA( "Grid")
958 || item->widget()->isA( "HFlow") || item->widget()->isA( "VFlow"))
959 tclass.setAttribute( "class", "TQLayoutWidget");
960 else if(item->widget()->isA( "CustomWidget"))
961 tclass.setAttribute( "class", item->className());
963 tclass.setAttribute( "class", lib->savingName(item->widget()->className()) );
965 savePropertyValue(tclass, domDoc, "name", item->widget()->property( "name"), item->widget());
975 if(item && !item->parent()) {
978 TQRect( TQPoint(0,0), item->widget()->size()),
982 else if(parent.tagName() == "widget" || parent.tagName() == "UI")
983 savePropertyValue(tclass, domDoc, "geometry", item->widget()->property( "geometry"), item->widget());
986 if(item->widget()->inherits( "TQLabel") && ((TQLabel*)item->widget())->buddy())
987 savePropertyElement(tclass, domDoc, "property", "buddy", ((TQLabel*)item->widget())->buddy()->name());
991 TQStringVariantMap::ConstIterator endIt = map->constEnd();
992 for(TQStringVariantMap::ConstIterator it = map->constBegin(); it != endIt; ++it)
994 const TQCString name( it.key().latin1() );
995 if(name == "hAlign" || name == "vAlign" || name == "wordbreak" || name == "alignment") {
998 savePropertyValue(tclass, domDoc, "alignment", item->widget()->property( "alignment"), item->widget());
999 savedAlignment = true;
1002 else if(name == "name" || name == "geometry" || name == "layout") {
1006 savePropertyValue(tclass, domDoc, it.key().latin1(), item->widget()->property(it.key().latin1()),
1007 item->widget(), lib);
1012 if(item->widget()->isA( "CustomWidget")) {
1013 TQDomDocument doc( "TEMP");
1014 doc.setContent(item->m_unknownProps);
1015 for(TQDomNode n = doc.firstChild(); !n.isNull(); n = n.nextSibling()) {
1016 tclass.appendChild(n.cloneNode());
1021 TQDomElement layout;
1026 layout = domDoc.createElement( "temp");
1032 tclass.appendChild(layout);
1037 switch(layoutType) {
1038 case Container::Grid:
1040 layout.setTagName( "grid");
1041 for( ObjectTreeItem *objIt = item->children()->first(); objIt; objIt = item->children()->next())
1045 case Container::HBox: case Container::VBox:
1049 if(layout.tagName() == "hbox") {
1051 layout.setTagName( "hbox");
1055 layout.setTagName( "vbox");
1058 for( ObjectTreeItem *objTree = item->children()->first(); objTree; objTree = item->children()->next())
1059 list->append(objTree->widget());
1062 for(TQWidget *obj = list->first(); obj; obj = list->next()) {
1070 case Container::HFlow: case Container::VFlow:
1072 layout.setTagName( "grid");
1083 for(TQWidget *obj = list->first(); obj; obj = list->next()) {
1093 for( ObjectTreeItem *objIt = item->children()->first(); objIt; objIt = item->children()->next())
1100 if(resetCurrentForm)
1109 if(!uiElement.namedItem( "includes").isNull())
1110 uiElement.removeChild(uiElement.namedItem( "includes"));
1112 if(!uiElement.namedItem( "connections").isNull())
1113 uiElement.insertAfter(uiElement.namedItem( "connections"), TQDomNode());
1114 if(!uiElement.namedItem( "images").isNull())
1115 uiElement.insertAfter(uiElement.namedItem( "images"), TQDomNode());
1121 bool resetCurrentForm = false;
1124 resetCurrentForm = true;
1125 m_currentForm = container-> form();
1130 for(TQDomNode n = el.firstChild(); !n.isNull(); n = n.nextSibling())
1132 if((n.toElement().tagName() == "property") && (n.toElement().attribute( "name") == "name"))
1134 wname = n.toElement().text();
1140 TQCString classname, alternate;
1142 if(el.tagName() == "spacer")
1143 classname = "Spring";
1144 else if(el.attribute( "class") == "TQLayoutWidget")
1146 for(TQDomNode n = el.firstChild(); !n.isNull(); n = n.nextSibling())
1148 TQString tagName = n.toElement().tagName();
1149 if(tagName == "property")
1151 if(tagName == "hbox")
1153 else if(tagName == "vbox")
1155 else if(tagName == "grid") {
1157 for(TQDomNode child = n.firstChild(); !child.isNull(); child = child.nextSibling()) {
1158 if((child.toElement().tagName() == "property")
1159 && (child.toElement().attribute( "name") == "customLayout"))
1161 classname = child.toElement().text().latin1();
1166 if(classname.isEmpty())
1174 classname = el.attribute( "class").latin1();
1178 if(alternate == "CustomWidget")
1182 if(!alternate.isNull())
1183 classname = alternate;
1185 int widgetOptions = WidgetFactory::DefaultOptions;
1192 wname.latin1(), container, widgetOptions);
1195 container, widgetOptions);
1201 if (m_currentForm->designMode()) {
1203 TDEAcceleratorManager::setNoAccel(w);
1205 w->setStyle(&(container-> widget()->style()));
1213 wname, w, container);
1219 kdDebug() << "FORMIO :: ERROR no parent widget " << endl;
1230 m_currentItem = item;
1232 if(container-> layoutType() == Container::Grid) {
1233 TQGridLayout *layout = (TQGridLayout*)container-> layout();
1234 if(el.hasAttribute( "rowspan")) {
1236 layout->addMultiCellWidget(w, el.attribute( "row").toInt(), el.attribute( "row").toInt() + el.attribute( "rowspan").toInt()-1,
1237 el.attribute( "column").toInt(), el.attribute( "column").toInt() + el.attribute( "colspan").toInt()-1);
1238 item->setGridPos(el.attribute( "row").toInt(), el.attribute( "column").toInt(), el.attribute( "rowspan").toInt(),
1239 el.attribute( "colspan").toInt());
1243 layout->addWidget(w, el.attribute( "row").toInt(), el.attribute( "column").toInt());
1244 item->setGridPos(el.attribute( "row").toInt(), el.attribute( "column").toInt(), 0, 0);
1247 else if(container-> layout())
1248 container-> layout()->add(w);
1256 TQValueList<TQCString> list(container-> form()-> library()->autoSaveProperties(w->className()));
1257 TQValueList<TQCString>::ConstIterator endIt = list.constEnd();
1260 TQWidget *subwidget = (subpropIface && subpropIface-> subwidget()) ? subpropIface-> subwidget() : w;
1261 for(TQValueList<TQCString>::ConstIterator it = list.constBegin(); it != endIt; ++it) {
1262 if(subwidget->metaObject()->findProperty(*it, true) != -1)
1266 if(resetCurrentForm)
1276 for(TQDomNode n = el.firstChild(); !n.isNull(); n = n.nextSibling())
1278 if((n.toElement().tagName() == "property") && (n.toElement().attribute( "name") == "name"))
1280 wname = n.toElement().text();
1286 container->setName(wname.latin1());
1291 TQDict<TQLabel> *oldBuddies = 0;
1293 oldBuddies = m_buddies;
1294 m_buddies = new TQDict<TQLabel>();
1300 TQDictIterator<TQLabel> it(*m_buddies);
1301 for(; it.current(); ++it)
1304 if(!item || !item->widget())
1306 kdDebug() << "Cannot assign buddy for widget " << it.current()->name() << " to " << it.currentKey() << endl;
1309 it.current()->setBuddy(item->widget());
1312 m_buddies = oldBuddies;
1322 TQString eltag = el.tagName();
1325 TQWidget *subwidget = (subpropIface && subpropIface-> subwidget()) ? subpropIface-> subwidget() : w;
1327 for(TQDomNode n = el.firstChild(); !n.isNull(); n = n.nextSibling())
1329 TQString tag = n.toElement().tagName();
1330 TQDomElement node = n.toElement();
1332 if((tag == "property") || (tag == "attribute"))
1334 TQString name = node.attribute( "name");
1337 if( ((eltag == "grid") || (eltag == "hbox") || (eltag == "vbox")) &&
1341 if (node.attribute( "subwidget")== "true") {
1345 kdDebug() << val.toStringList() << endl;
1354 m_buddies->insert( readPropertyValue(node.firstChild(), w, name).toString(), (TQLabel*)w);
1355 else if(((eltag == "grid") || (eltag == "hbox") || (eltag == "vbox")) &&
1358 if(name == "margin") {
1364 else if(name == "spacing") {
1369 else if((name == "justify")){
1373 flow->setJustified(justify);
1377 else if(subwidget->metaObject()->findProperty(name.latin1(), true) == -1)
1379 if(w->className() == TQString::fromLatin1( "CustomWidget"))
1380 item->storeUnknownProperty(node);
1382 bool read = container-> form()-> library()->readSpecialProperty(
1383 w->className(), node, w, item);
1385 item->storeUnknownProperty(node);
1391 if(name == "geometry" && dynamic_cast<FormWidget* >(w)) {
1393 TQRect r( val.toRect() );
1400 subwidget->setProperty(name.latin1(), val);
1409 else if(tag == "widget")
1416 else if(tag == "spacer") {
1419 else if(tag == "grid") {
1421 TQString layoutName;
1422 for(TQDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling()) {
1423 if((child.toElement().tagName() == "property") && (child.toElement().attribute( "name") == "customLayout")) {
1424 layoutName = child.toElement().text();
1429 if(layoutName == "HFlow") {
1430 item-> container()->m_layType = Container::HFlow;
1433 item-> container()->m_layout = (TQLayout*)layout;
1435 else if(layoutName == "VFlow") {
1436 item-> container()->m_layType = Container::VFlow;
1439 item-> container()->m_layout = (TQLayout*)layout;
1442 item-> container()->m_layType = Container::Grid;
1443 TQGridLayout *layout = new TQGridLayout(item->widget(), 1, 1);
1444 item-> container()->m_layout = (TQLayout*)layout;
1448 else if(tag == "vbox") {
1449 item-> container()->m_layType = Container::VBox;
1450 TQVBoxLayout *layout = new TQVBoxLayout(item->widget());
1451 item-> container()->m_layout = (TQLayout*)layout;
1454 else if(tag == "hbox") {
1455 item-> container()->m_layType = Container::HBox;
1456 TQHBoxLayout *layout = new TQHBoxLayout(item->widget());
1457 item-> container()->m_layout = (TQLayout*)layout;
1461 if(w->className() == TQString::fromLatin1( "CustomWidget"))
1462 item->storeUnknownProperty(node);
1464 bool read = container-> form()-> library()->readSpecialProperty(
1465 w->className(), node, w, item);
1467 item->storeUnknownProperty(node);
1480 if(include.isEmpty())
1483 TQDomElement includes;
1484 TQDomElement uiEl = domDoc.namedItem( "UI").toElement();
1485 if(uiEl.namedItem( "includes").isNull())
1487 includes = domDoc.createElement( "includes");
1488 uiEl.appendChild(includes);
1491 includes = uiEl.namedItem( "includes").toElement();
1494 for(TQDomNode n = includes.firstChild(); !n.isNull(); n = n.nextSibling())
1496 if(n.toElement().text() == include)
1500 TQDomElement includeElement = domDoc.createElement( "include");
1501 includes.appendChild(includeElement);
1502 includeElement.setAttribute( "location", "global");
1503 includeElement.setAttribute( "impldecl", "in implementation");
1504 TQDomText includeText = domDoc.createTextNode(include);
1505 includeElement.appendChild(includeText);
1513 TQDomNode node = domDoc.namedItem( "images");
1514 TQDomElement images;
1517 images = domDoc.createElement( "images");
1518 TQDomElement ui = domDoc.namedItem( "UI").toElement();
1519 ui.appendChild(images);
1522 images = node.toElement();
1524 int count = images.childNodes().count();
1525 TQDomElement image = domDoc.createElement( "image");
1526 TQString name = "image" + TQString::number(count);
1527 image.setAttribute( "name", name);
1529 TQImage img = pixmap.convertToImage();
1532 buf.open( IO_WriteOnly | IO_Translate );
1533 TQString format = img.depth() > 1 ? "XPM" : "XBM";
1534 TQImageIO iio( &buf, format.latin1() );
1535 iio.setImage( img );
1538 TQByteArray bazip = tqCompress( ba );
1539 ulong len = bazip.size();
1541 TQDomElement data = domDoc.createElement( "data");
1542 data.setAttribute( "format", format + ".GZ");
1543 data.setAttribute( "length", ba.size());
1545 static const char hexchars[] = "0123456789abcdef";
1547 for( int i = 4; i < (int)len; ++i)
1549 uchar s = (uchar) bazip[i];
1550 content += hexchars[s >> 4];
1551 content += hexchars[s & 0x0f];
1554 TQDomText text = domDoc.createTextNode(content);
1555 data.appendChild(text);
1556 image.appendChild(data);
1557 images.appendChild(image);
1565 TQDomElement images = domDoc.namedItem( "UI").namedItem( "images").toElement();
1570 for(TQDomNode n = images.firstChild(); !n.isNull(); n = n.nextSibling())
1572 if((n.toElement().tagName() == "image") && (n.toElement().attribute( "name") == name))
1574 image = n.toElement();
1580 TQString data = image.namedItem( "data").toElement().text();
1581 const int lengthOffset = 4;
1582 int baSize = data.length() / 2 + lengthOffset;
1583 uchar *ba = new uchar[baSize];
1584 for( int i = lengthOffset; i < baSize; ++i)
1586 char h = data[2 * (i-lengthOffset)].latin1();
1587 char l = data[2 * (i-lengthOffset) + 1].latin1();
1601 TQString format = image.namedItem( "data").toElement().attribute( "format", "PNG");
1602 if((format == "XPM.GZ") || (format == "XBM.GZ"))
1604 ulong len = image.attribute( "length").toULong();
1605 if(len < data.length() * 5)
1606 len = data.length() * 5;
1609 ba[0] = ( len & 0xff000000 ) >> 24;
1610 ba[1] = ( len & 0x00ff0000 ) >> 16;
1611 ba[2] = ( len & 0x0000ff00 ) >> 8;
1612 ba[3] = ( len & 0x000000ff );
1613 TQByteArray baunzip = tqUncompress(ba, baSize);
1614 pix.loadFromData( ( const uchar*)baunzip.data(), baunzip.size(), format.left(format.find( '.')).latin1() );
1617 pix.loadFromData( ( const uchar*)ba+lengthOffset, baSize-lengthOffset, format.latin1() );
1626#include "formIO.moc"
void setOrientation(TQt::Orientation orientation)
TQPtrList< TQWidget > * widgetList() const
|