/* This file is part of the KDE project Copyright (C) 2003 Lucijan Busch Copyright (C) 2004 Cedric Pasteur Copyright (C) 2006-2007 Jaroslaw Staniek 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "containerfactory.h" #include "container.h" #include "form.h" #include "formIO.h" #include "objecttree.h" #include "commands.h" #include "formmanager.h" #include "widgetlibrary.h" #include #if KDE_VERSION < KDE_MAKE_VERSION(3,1,9) # define KInputDialog TQInputDialog # include # include #else # include #endif ContainerWidget::ContainerWidget(TQWidget *tqparent, const char *name) : TQWidget(tqparent, name) { } ContainerWidget::~ContainerWidget() { } TQSize ContainerWidget::tqsizeHint() const { return TQSize(30,30); //default } void ContainerWidget::dragMoveEvent( TQDragMoveEvent *e ) { TQWidget::dragMoveEvent(e); emit handleDragMoveEvent(e); } void ContainerWidget::dropEvent( TQDropEvent *e ) { TQWidget::dropEvent(e); emit handleDropEvent(e); } //////////////////////// GroupBox::GroupBox(const TQString & title, TQWidget *tqparent, const char *name) : TQGroupBox(title, tqparent, name) { } GroupBox::~GroupBox() { } void GroupBox::dragMoveEvent( TQDragMoveEvent *e ) { TQGroupBox::dragMoveEvent(e); emit handleDragMoveEvent(e); } void GroupBox::dropEvent( TQDropEvent *e ) { TQGroupBox::dropEvent(e); emit handleDropEvent(e); } //////////////////////// KFDTabWidget::KFDTabWidget(TQWidget *tqparent, const char *name) : KFormDesigner::TabWidget(tqparent, name) { } KFDTabWidget::~KFDTabWidget() { } TQSize KFDTabWidget::tqsizeHint() const { TQSize s(30,30); // default min size for(int i=0; i < count(); i++) s = s.expandedTo( KFormDesigner::getSizeFromChildren(page(i)) ); return s + TQSize(10/*margin*/, tabBar()->height() + 20/*margin*/); } void KFDTabWidget::dragMoveEvent( TQDragMoveEvent *e ) { TabWidgetBase::dragMoveEvent( e ); if (dynamic_cast(currentPage())) emit dynamic_cast(currentPage())->handleDragMoveEvent(e); emit handleDragMoveEvent(e); } void KFDTabWidget::dropEvent( TQDropEvent *e ) { TabWidgetBase::dropEvent( e ); if (dynamic_cast(currentPage())) emit dynamic_cast(currentPage())->handleDropEvent(e); emit handleDropEvent(e); } /// Various tqlayout widgets /////////////////: HBox::HBox(TQWidget *tqparent, const char *name) : TQFrame(tqparent, name), m_preview(false) {} void HBox::paintEvent(TQPaintEvent *) { if(m_preview) return; TQPainter p(this); p.setPen(TQPen(red, 2, TQt::DashLine)); p.drawRect(1, 1, width()-1, height() - 1); } VBox::VBox(TQWidget *tqparent, const char *name) : TQFrame(tqparent, name), m_preview(false) {} void VBox::paintEvent(TQPaintEvent *) { if(m_preview) return; TQPainter p(this); p.setPen(TQPen(blue, 2, TQt::DashLine)); p.drawRect(1, 1, width()-1, height() - 1); } Grid::Grid(TQWidget *tqparent, const char *name) : TQFrame(tqparent, name), m_preview(false) {} void Grid::paintEvent(TQPaintEvent *) { if(m_preview) return; TQPainter p(this); p.setPen(TQPen(darkGreen, 2, TQt::DashLine)); p.drawRect(1, 1, width()-1, height() - 1); } HFlow::HFlow(TQWidget *tqparent, const char *name) : TQFrame(tqparent, name), m_preview(false) {} void HFlow::paintEvent(TQPaintEvent *) { if(m_preview) return; TQPainter p(this); p.setPen(TQPen(magenta, 2, TQt::DashLine)); p.drawRect(1, 1, width()-1, height() - 1); } VFlow::VFlow(TQWidget *tqparent, const char *name) : TQFrame(tqparent, name), m_preview(false) {} void VFlow::paintEvent(TQPaintEvent *) { if(m_preview) return; TQPainter p(this); p.setPen(TQPen(cyan, 2, TQt::DashLine)); p.drawRect(1, 1, width()-1, height() - 1); } TQSize VFlow::tqsizeHint() const { if(tqlayout()) return tqlayout()->tqsizeHint(); else return TQSize(700, 50); // default } /////// Tab related KCommand (to allow tab creation/deletion undoing) InsertPageCommand::InsertPageCommand(KFormDesigner::Container *container, TQWidget *tqparent) : KCommand() { m_containername = container->widget()->name(); m_form = container->form(); m_parentname = tqparent->name(); m_pageid = -1; } void InsertPageCommand::execute() { KFormDesigner::Container *container = m_form->objectTree()->lookup(m_containername)->container(); TQWidget *tqparent = m_form->objectTree()->lookup(m_parentname)->widget(); if(m_name.isEmpty()) { m_name = container->form()->objectTree()->generateUniqueName( container->form()->library()->displayName(TQWIDGET_OBJECT_NAME_STRING).latin1(), /*!numberSuffixRequired*/false); } TQWidget *page = container->form()->library()->createWidget(TQWIDGET_OBJECT_NAME_STRING, tqparent, m_name.latin1(), container); // TQWidget *page = new ContainerWidget(tqparent, m_name.latin1()); // new KFormDesigner::Container(container, page, tqparent); TQCString classname = tqparent->className(); if(classname == "KFDTabWidget") { TabWidgetBase *tab = dynamic_cast(tqparent); TQString n = i18n("Page %1").tqarg(tab->count() + 1); tab->addTab(page, n); tab->showPage(page); KFormDesigner::ObjectTreeItem *item = container->form()->objectTree()->lookup(m_name); item->addModifiedProperty("title", n); } else if(classname == TQWIDGETSTACK_OBJECT_NAME_STRING) { TQWidgetStack *stack = (TQWidgetStack*)tqparent; stack->addWidget(page, m_pageid); stack->raiseWidget(page); m_pageid = stack->id(page); KFormDesigner::ObjectTreeItem *item = container->form()->objectTree()->lookup(m_name); item->addModifiedProperty("id", stack->id(page)); } } void InsertPageCommand::unexecute() { TQWidget *page = m_form->objectTree()->lookup(m_name)->widget(); TQWidget *tqparent = m_form->objectTree()->lookup(m_parentname)->widget(); KFormDesigner::WidgetList list; list.append(page); KCommand *com = new KFormDesigner::DeleteWidgetCommand(list, m_form); TQCString classname = tqparent->className(); if(classname == "KFDTabWidget") { TabWidgetBase *tab = dynamic_cast(tqparent); tab->removePage(page); } else if(classname == TQWIDGETSTACK_OBJECT_NAME_STRING) { TQWidgetStack *stack = (TQWidgetStack*)tqparent; int id = stack->id(page) - 1; while(!stack->widget(id)) id--; stack->raiseWidget(id); stack->removeWidget(page); } com->execute(); delete com; } TQString InsertPageCommand::name() const { return i18n("Add Page"); } /////// Sub forms ////////////////////////: SubForm::SubForm(TQWidget *tqparent, const char *name) : TQScrollView(tqparent, name), m_form(0), m_widget(0) { setFrameStyle(TQFrame::WinPanel | TQFrame::Sunken); viewport()->setPaletteBackgroundColor(tqcolorGroup().mid()); } void SubForm::setFormName(const TQString &name) { if(name.isEmpty()) return; TQFileInfo info(name); if(!info.exists() || (KFormDesigner::FormManager::self()->activeForm() && (info.fileName() == KFormDesigner::FormManager::self()->activeForm()->filename()) ) ) return; // we check if this is valid form // we create the container widget delete m_widget; m_widget = new TQWidget(viewport(), "subform_widget"); // m_widget->show(); addChild(m_widget); m_form = new KFormDesigner::Form( KFormDesigner::FormManager::self()->activeForm()->library(), this->name()); m_form->createToplevel(m_widget); // and load the sub form KFormDesigner::FormIO::loadFormFromFile(m_form, m_widget, name); m_form->setDesignMode(false); m_formName = name; } ///// The factory ///////////////////////// ContainerFactory::ContainerFactory(TQObject *tqparent, const char *, const TQStringList &) : KFormDesigner::WidgetFactory(tqparent, "containers") { KFormDesigner::WidgetInfo *wBtnGroup = new KFormDesigner::WidgetInfo(this); wBtnGroup->setPixmap("frame"); wBtnGroup->setClassName(TQBUTTONGROUP_OBJECT_NAME_STRING); wBtnGroup->setName(i18n("Button Group")); wBtnGroup->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "buttonGroup")); wBtnGroup->setDescription(i18n("A simple container to group buttons")); addClass(wBtnGroup); KFormDesigner::WidgetInfo *wTabWidget = new KFormDesigner::WidgetInfo(this); wTabWidget->setPixmap("tabwidget"); wTabWidget->setClassName("KFDTabWidget"); #if KDE_VERSION >= KDE_MAKE_VERSION(3,1,9) wTabWidget->addAlternateClassName("KTabWidget"); wTabWidget->addAlternateClassName(TQTABWIDGET_OBJECT_NAME_STRING); //tmp: wTabWidget->setSavingName(TQTABWIDGET_OBJECT_NAME_STRING); wTabWidget->setSavingName("KTabWidget"); #else wTabWidget->setSavingName(TQTABWIDGET_OBJECT_NAME_STRING); #endif wTabWidget->setIncludeFileName("ktabwidget.h"); wTabWidget->setName(i18n("Tab Widget")); wTabWidget->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "tabWidget")); wTabWidget->setDescription(i18n("A widget to display multiple pages using tabs")); addClass(wTabWidget); KFormDesigner::WidgetInfo *wWidget = new KFormDesigner::WidgetInfo(this); wWidget->setPixmap("frame"); wWidget->setClassName(TQWIDGET_OBJECT_NAME_STRING); wWidget->addAlternateClassName("ContainerWidget"); wWidget->setName(i18n("Basic container")); wWidget->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "container")); wWidget->setDescription(i18n("An empty container with no frame")); addClass(wWidget); KFormDesigner::WidgetInfo *wGroupBox = new KFormDesigner::WidgetInfo(this); wGroupBox->setPixmap("groupbox"); wGroupBox->setClassName(TQGROUPBOX_OBJECT_NAME_STRING); wGroupBox->addAlternateClassName("GroupBox"); wGroupBox->setName(i18n("Group Box")); wGroupBox->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "groupBox")); wGroupBox->setDescription(i18n("A container to group some widgets")); addClass(wGroupBox); KFormDesigner::WidgetInfo *wFrame = new KFormDesigner::WidgetInfo(this); wFrame->setPixmap("frame"); wFrame->setClassName(TQFRAME_OBJECT_NAME_STRING); wFrame->setName(i18n("Frame")); wFrame->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "frame")); wFrame->setDescription(i18n("A simple frame container")); addClass(wFrame); KFormDesigner::WidgetInfo *wWidgetStack = new KFormDesigner::WidgetInfo(this); wWidgetStack->setPixmap("widgetstack"); wWidgetStack->setClassName(TQWIDGETSTACK_OBJECT_NAME_STRING); wWidgetStack->setName(i18n("Widget Stack")); wWidgetStack->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "widgetStack")); wWidgetStack->setDescription(i18n("A container with multiple pages")); addClass(wWidgetStack); KFormDesigner::WidgetInfo *wHBox = new KFormDesigner::WidgetInfo(this); wHBox->setPixmap("frame"); wHBox->setClassName("HBox"); wHBox->setName(i18n("Horizontal Box")); wHBox->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "horizontalBox")); wHBox->setDescription(i18n("A simple container to group widgets horizontally")); addClass(wHBox); KFormDesigner::WidgetInfo *wVBox = new KFormDesigner::WidgetInfo(this); wVBox->setPixmap("frame"); wVBox->setClassName("VBox"); wVBox->setName(i18n("Vertical Box")); wVBox->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "verticalBox")); wVBox->setDescription(i18n("A simple container to group widgets vertically")); addClass(wVBox); KFormDesigner::WidgetInfo *wGrid = new KFormDesigner::WidgetInfo(this); wGrid->setPixmap("frame"); wGrid->setClassName("Grid"); wGrid->setName(i18n("Grid Box")); wGrid->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "gridBox")); wGrid->setDescription(i18n("A simple container to group widgets in a grid")); addClass(wGrid); KFormDesigner::WidgetInfo *wSplitter = new KFormDesigner::WidgetInfo(this); //! @todo horizontal/vertical splitter icons wSplitter->setPixmap("frame"); wSplitter->setClassName("Splitter"); wSplitter->addAlternateClassName(TQSPLITTER_OBJECT_NAME_STRING); wSplitter->setName(i18n("Splitter")); wSplitter->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "splitter")); wSplitter->setDescription(i18n("A container that enables user to resize its tqchildren")); addClass(wSplitter); KFormDesigner::WidgetInfo *wHFlow = new KFormDesigner::WidgetInfo(this); //! @todo hflow icon wHFlow->setPixmap("frame"); wHFlow->setClassName("HFlow"); wHFlow->setName(i18n("Row Layout")); wHFlow->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "rowLayout")); wHFlow->setDescription(i18n("A simple container to group widgets by rows")); addClass(wHFlow); KFormDesigner::WidgetInfo *wVFlow = new KFormDesigner::WidgetInfo(this); //! @todo vflow icon wVFlow->setPixmap("frame"); wVFlow->setClassName("VFlow"); wVFlow->setName(i18n("Column Layout")); wVFlow->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "columnLayout")); wVFlow->setDescription(i18n("A simple container to group widgets by columns")); addClass(wVFlow); KFormDesigner::WidgetInfo *wSubForm = new KFormDesigner::WidgetInfo(this); wSubForm->setPixmap("form"); wSubForm->setClassName("SubForm"); wSubForm->setName(i18n("Sub Form")); wSubForm->setNamePrefix( i18n("Widget name. This string will be used to name widgets of this class. It must _not_ contain white spaces and non latin1 characters.", "subForm")); wSubForm->setDescription(i18n("A form widget included in another Form")); wSubForm->setAutoSyncForProperty( "formName", false ); addClass(wSubForm); //groupbox m_propDesc["title"] = i18n("Title"); m_propDesc["flat"] = i18n("Flat"); //tab widget m_propDesc["tabPosition"] = i18n("Tab Position"); m_propDesc["currentPage"] = i18n("Current Page"); m_propDesc["tabShape"] = i18n("Tab Shape"); m_propDesc["tabPosition"] = i18n("Tab Position"); m_propDesc["tabPosition"] = i18n("Tab Position"); m_propValDesc["Rounded"] = i18n("for Tab Shape", "Rounded"); m_propValDesc["Triangular"] = i18n("for Tab Shape", "Triangular"); } TQWidget* ContainerFactory::createWidget(const TQCString &c, TQWidget *p, const char *n, KFormDesigner::Container *container, int options) { if(c == TQBUTTONGROUP_OBJECT_NAME_STRING) { TQString text = container->form()->library()->textForWidgetName(n, c); TQButtonGroup *w = new TQButtonGroup(/*i18n("Button Group")*/text, p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == "KFDTabWidget") { KFDTabWidget *tab = new KFDTabWidget(p, n); #if defined(USE_KTabWidget) && KDE_VERSION >= KDE_MAKE_VERSION(3,1,9) tab->setTabReorderingEnabled(true); connect(tab, TQT_SIGNAL(movedTab(int,int)), this, TQT_SLOT(reorderTabs(int,int))); #endif container->form()->objectTree()->addItem(container->objectTree(), new KFormDesigner::ObjectTreeItem( container->form()->library()->displayName(c), n, tab, container)); // m_manager = container->form()->manager(); // if we are loading, don't add this tab if(container->form()->interactiveMode()) { //m_widget=tab; setWidget(tab, container); // m_container=container; addTabPage(); } return tab; } else if(c == TQWIDGET_OBJECT_NAME_STRING || c=="ContainerWidget") { TQWidget *w = new ContainerWidget(p, n); new KFormDesigner::Container(container, w, TQT_TQOBJECT(p)); return w; } else if(c == TQGROUPBOX_OBJECT_NAME_STRING || c == "GroupBox") { TQString text = container->form()->library()->textForWidgetName(n, c); TQGroupBox *w = new GroupBox(text, p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == TQFRAME_OBJECT_NAME_STRING) { TQFrame *w = new TQFrame(p, n); w->setLineWidth(2); w->setFrameStyle(TQFrame::StyledPanel|TQFrame::Raised); new KFormDesigner::Container(container, w, container); return w; } else if(c == TQWIDGETSTACK_OBJECT_NAME_STRING) { TQWidgetStack *stack = new TQWidgetStack(p, n); stack->setLineWidth(2); stack->setFrameStyle(TQFrame::StyledPanel|TQFrame::Raised); container->form()->objectTree()->addItem( container->objectTree(), new KFormDesigner::ObjectTreeItem( container->form()->library()->displayName(c), n, stack, container)); if(container->form()->interactiveMode()) { //m_widget = stack; setWidget(stack, container); // m_container = container; addStackPage(); } return stack; } else if(c == "HBox") { HBox *w = new HBox(p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == "VBox") { VBox *w = new VBox(p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == "Grid") { Grid *w = new Grid(p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == "HFlow") { HFlow *w = new HFlow(p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == "VFlow") { VFlow *w = new VFlow(p, n); new KFormDesigner::Container(container, w, container); return w; } else if(c == "SubForm") { SubForm *subform = new SubForm(p, n); return subform; } else if(c == TQSPLITTER_OBJECT_NAME_STRING) { TQSplitter *split = new TQSplitter(p, n); if (0 == (options & WidgetFactory::AnyOrientation)) split->setOrientation( (options & WidgetFactory::VerticalOrientation) ? Qt::Vertical : Qt::Horizontal); new KFormDesigner::Container(container, split, container); return split; } return 0; } bool ContainerFactory::previewWidget(const TQCString &classname, TQWidget *widget, KFormDesigner::Container *container) { if(classname == "WidgetStack") { TQWidgetStack *stack = ((TQWidgetStack*)widget); KFormDesigner::ObjectTreeItem *tree = container->form()->objectTree()->lookup(widget->name()); if(!tree->modifiedProperties()->tqcontains("frameShape")) stack->setFrameStyle(TQFrame::NoFrame); } else if(classname == "HBox") ((HBox*)widget)->setPreviewMode(); else if(classname == "VBox") ((VBox*)widget)->setPreviewMode(); else if(classname == "Grid") ((Grid*)widget)->setPreviewMode(); else if(classname == "HFlow") ((HFlow*)widget)->setPreviewMode(); else if(classname == "VFlow") ((VFlow*)widget)->setPreviewMode(); else return false; return true; } bool ContainerFactory::createMenuActions(const TQCString &classname, TQWidget *w, TQPopupMenu *menu, KFormDesigner::Container *container) { setWidget(w, container); //m_widget = w; // m_container = container; if((classname == "KFDTabWidget") || (w->parentWidget()->parentWidget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING))) { if(w->parentWidget()->parentWidget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING)) { //m_widget = w->parentWidget()->parentWidget(); setWidget(w->parentWidget()->parentWidget(), m_container->toplevel()); // m_container = m_container->toplevel(); } int id = menu->insertItem(SmallIconSet("tab_new"), i18n("Add Page"), this, TQT_SLOT(addTabPage()) ); id = menu->insertItem(SmallIconSet("edit"), i18n("Rename Page..."), this, TQT_SLOT(renameTabPage())); id = menu->insertItem(SmallIconSet("tab_remove"), i18n("Remove Page"), this, TQT_SLOT(removeTabPage())); // if( dynamic_cast(m_widget)->count() == 1) if( dynamic_cast(widget())->count() == 1) menu->setItemEnabled(id, false); return true; } else if(w->parentWidget()->isA(TQWIDGETSTACK_OBJECT_NAME_STRING) && !w->parentWidget()->parentWidget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING)) { //m_widget = w->parentWidget(); TQWidgetStack *stack = (TQWidgetStack*)w->parentWidget(); //m_widget; setWidget( w->parentWidget(), container->form()->objectTree()->lookup(stack->name())->tqparent()->container() ); // m_container = container->form()->objectTree()->lookup(m_widget->name())->tqparent()->container(); // m_container = container->form()->objectTree()->lookup(stack->name())->tqparent()->container(); int id = menu->insertItem(SmallIconSet("tab_new"), i18n("Add Page"), this, TQT_SLOT(addStackPage()) ); id = menu->insertItem(SmallIconSet("tab_remove"), i18n("Remove Page"), this, TQT_SLOT(removeStackPage()) ); // if( ((TQWidgetStack*)m_widget)->tqchildren()->count() == 4) // == the stack has only one page if(stack->childrenListObject().count() == 4) // == the stack has only one page menu->setItemEnabled(id, false); id = menu->insertItem(SmallIconSet("next"), i18n("Jump to Next Page"), this, TQT_SLOT(nextStackPage())); if(!stack->widget(stack->id(stack->visibleWidget())+1)) menu->setItemEnabled(id, false); id = menu->insertItem(SmallIconSet("previous"), i18n("Jump to Previous Page"), this, TQT_SLOT(prevStackPage())); if(!stack->widget(stack->id(stack->visibleWidget()) -1) ) menu->setItemEnabled(id, false); return true; } return false; } bool ContainerFactory::startEditing(const TQCString &classname, TQWidget *w, KFormDesigner::Container *container) { m_container = container; if(classname == TQBUTTONGROUP_OBJECT_NAME_STRING) { TQButtonGroup *group = static_cast(w); TQRect r = TQRect(group->x()+2, group->y()-5, group->width()-10, w->fontMetrics().height() + 10); createEditor(classname, group->title(), group, container, r, TQt::AlignAuto); return true; } if(classname == TQGROUPBOX_OBJECT_NAME_STRING || classname == "GroupBox") { TQGroupBox *group = static_cast(w); TQRect r = TQRect(group->x()+2, group->y()-5, group->width()-10, w->fontMetrics().height() + 10); createEditor(classname, group->title(), group, container, r, TQt::AlignAuto); return true; } return false; } bool ContainerFactory::saveSpecialProperty(const TQCString &, const TQString &name, const TQVariant &, TQWidget *w, TQDomElement &parentNode, TQDomDocument &tqparent) { if((name == "title") && (w->parentWidget()->parentWidget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING))) { TabWidgetBase *tab = dynamic_cast(w->parentWidget()->parentWidget()); KFormDesigner::FormIO::savePropertyElement(parentNode, tqparent, "attribute", "title", tab->tabLabel(w)); } else if((name == "id") && (w->parentWidget()->isA(TQWIDGETSTACK_OBJECT_NAME_STRING))) { TQWidgetStack *stack = (TQWidgetStack*)w->parentWidget(); KFormDesigner::FormIO::savePropertyElement(parentNode, tqparent, "attribute", "id", stack->id(w)); } else return false; return true; } bool ContainerFactory::readSpecialProperty(const TQCString &, TQDomElement &node, TQWidget *w, KFormDesigner::ObjectTreeItem *item) { TQString name = node.attribute("name"); if((name == "title") && (item->tqparent()->widget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING))) { TabWidgetBase *tab = dynamic_cast(w->parentWidget()); tab->addTab(w, node.firstChild().toElement().text()); item->addModifiedProperty("title", node.firstChild().toElement().text()); return true; } if((name == "id") && (w->parentWidget()->isA(TQWIDGETSTACK_OBJECT_NAME_STRING))) { TQWidgetStack *stack = (TQWidgetStack*)w->parentWidget(); int id = KFormDesigner::FormIO::readPropertyValue(node.firstChild(), TQT_TQOBJECT(w), name).toInt(); stack->addWidget(w, id); stack->raiseWidget(w); item->addModifiedProperty("id", id); return true; } return false; } TQValueList ContainerFactory::autoSaveProperties(const TQCString &c) { TQValueList lst; // if(c == "SubForm") // lst << "formName"; if(c == TQSPLITTER_OBJECT_NAME_STRING) lst << "orientation"; return lst; } bool ContainerFactory::isPropertyVisibleInternal(const TQCString &classname, TQWidget *w, const TQCString &property, bool isTopLevel) { bool ok = true; if((classname == "HBox") || (classname == "VBox") || (classname == "Grid") || (classname == "HFlow") || (classname == "VFlow")) { return property == "name" || property == "geometry"; } else if (classname == TQGROUPBOX_OBJECT_NAME_STRING || classname=="GroupBox") { ok = #ifdef KEXI_NO_UNFINISHED /*! @todo Hidden for now in Kexi. "checkable" and "checked" props need adding a fake properties which will allow to properly work in design mode, otherwise child widgets become frozen when checked==true */ (m_showAdvancedProperties || (property != "checkable" && property != "checked")) && #endif true ; } else if (classname == "KFDTabWidget") { ok = (m_showAdvancedProperties || (property != "tabReorderingEnabled" && property != "hoverCloseButton" && property != "hoverCloseButtonDelayed")); } return ok && WidgetFactory::isPropertyVisibleInternal(classname, w, property, isTopLevel); } bool ContainerFactory::changeText(const TQString &text) { changeProperty("title", text, m_container->form()); return true; } void ContainerFactory::resizeEditor(TQWidget *editor, TQWidget *widget, const TQCString &) { TQSize s = widget->size(); editor->move(widget->x() + 2, widget->y() - 5); editor->resize(s.width() - 20, widget->fontMetrics().height() +10); } // Widget Specific slots used in menu items void ContainerFactory::addTabPage() { // if (!m_widget->inherits(TQTABWIDGET_OBJECT_NAME_STRING)) if (!widget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING)) return; KCommand *com = new InsertPageCommand(m_container, widget()); if(dynamic_cast(widget())->count() == 0) { com->execute(); delete com; } else m_container->form()->addCommand(com, true); } void ContainerFactory::removeTabPage() { if (!widget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING)) return; TabWidgetBase *tab = dynamic_cast(widget()); TQWidget *w = tab->currentPage(); KFormDesigner::WidgetList list; list.append(w); KCommand *com = new KFormDesigner::DeleteWidgetCommand(list, m_container->form()); tab->removePage(w); m_container->form()->addCommand(com, true); } void ContainerFactory::renameTabPage() { if (!widget()->inherits(TQTABWIDGET_OBJECT_NAME_STRING)) return; TabWidgetBase *tab = dynamic_cast(widget()); TQWidget *w = tab->currentPage(); bool ok; TQString name = KInputDialog::getText(i18n("New Page Title"), i18n("Enter a new title for the current page:"), #if KDE_VERSION < KDE_MAKE_VERSION(3,1,9) TQLineEdit::Normal, #endif tab->tabLabel(w), &ok, w->tqtopLevelWidget()); if(ok) tab->changeTab(w, name); } void ContainerFactory::reorderTabs(int oldpos, int newpos) { KFormDesigner::ObjectTreeItem *tab = KFormDesigner::FormManager::self()->activeForm()->objectTree()->lookup(TQT_TQOBJECT(const_cast(sender()))->name()); if(!tab) return; KFormDesigner::ObjectTreeItem *item = tab->tqchildren()->take(oldpos); tab->tqchildren()->insert(newpos, item); } void ContainerFactory::addStackPage() { if (!widget()->isA(TQWIDGETSTACK_OBJECT_NAME_STRING)) return; KCommand *com = new InsertPageCommand(m_container, widget()); if(!((TQWidgetStack*)widget())->visibleWidget()) { com->execute(); delete com; } else m_container->form()->addCommand(com, true); } void ContainerFactory::removeStackPage() { if (!widget()->isA(TQWIDGETSTACK_OBJECT_NAME_STRING)) return; TQWidgetStack *stack = (TQWidgetStack*)widget(); TQWidget *page = stack->visibleWidget(); KFormDesigner::WidgetList list; list.append(page); KCommand *com = new KFormDesigner::DeleteWidgetCommand(list, m_container->form()); // raise prev widget int id = stack->id(page) - 1; while(!stack->widget(id)) id--; stack->raiseWidget(id); stack->removeWidget(page); m_container->form()->addCommand(com, true); } void ContainerFactory::prevStackPage() { TQWidgetStack *stack = (TQWidgetStack*)widget(); int id = stack->id(stack->visibleWidget()) - 1; if(stack->widget(id)) stack->raiseWidget(id); } void ContainerFactory::nextStackPage() { TQWidgetStack *stack = (TQWidgetStack*)widget(); int id = stack->id(stack->visibleWidget()) + 1; if(stack->widget(id)) stack->raiseWidget(id); } ContainerFactory::~ContainerFactory() { } KFORMDESIGNER_WIDGET_FACTORY(ContainerFactory, containers) #include "containerfactory.moc"