22#include "widgetfactory.h"
25#include <tqobjectlist.h>
27#include <tqmetaobject.h>
36#include <kdialogbase.h>
37#include <keditlistbox.h>
38#include <kxmlguiclient.h>
39#include <tdeactioncollection.h>
41#include "richtextdialog.h"
42#include "editlistviewdialog.h"
43#include "resizehandle.h"
44#include "formmanager.h"
47#include "objecttree.h"
48#include "widgetlibrary.h"
50#include "widgetpropertyset.h"
51#include "widgetwithsubpropertiesinterface.h"
52#include <koproperty/property.h>
60 , m_overriddenAlternateNames(0)
62 , m_propertiesWithDisabledAutoSync(0)
63 , m_customTypesForProperty(0)
67WidgetInfo::WidgetInfo( WidgetFactory *f, const char* parentFactoryName,
68 const char* inheritedClassName)
69 : m_parentFactoryName( TQCString( "kformdesigner_")+parentFactoryName )
70 , m_inheritedClassName(inheritedClassName)
72 , m_overriddenAlternateNames(0)
74 , m_propertiesWithDisabledAutoSync(0)
75 , m_customTypesForProperty(0)
77 m_class = inheritedClassName;
80WidgetInfo::~WidgetInfo()
82 delete m_overriddenAlternateNames;
83 delete m_propertiesWithDisabledAutoSync;
84 delete m_customTypesForProperty;
89 m_alternateNames += alternateName;
91 if (!m_overriddenAlternateNames)
92 m_overriddenAlternateNames = new TQAsciiDict<char>(101);
93 m_overriddenAlternateNames->insert(alternateName, ( char*)1);
96 if (m_overriddenAlternateNames)
97 m_overriddenAlternateNames->take(alternateName);
103 return m_overriddenAlternateNames && (m_overriddenAlternateNames->find(alternateName) != 0);
108 if (!m_propertiesWithDisabledAutoSync) {
111 m_propertiesWithDisabledAutoSync = new TQAsciiDict<char>(101);
115 m_propertiesWithDisabledAutoSync->remove(propertyName);
118 m_propertiesWithDisabledAutoSync->insert(propertyName, flag== true ? ( char*)1 : ( char*)2);
124 char* flag = m_propertiesWithDisabledAutoSync ? m_propertiesWithDisabledAutoSync->find(propertyName) : 0;
127 return flag==( char*)1 ? true : false;
132 if (!propertyName || type==KoProperty::Auto)
134 if (!m_customTypesForProperty) {
135 m_customTypesForProperty = new TQMap<TQCString,int>();
137 m_customTypesForProperty->replace(propertyName, type);
142 if (!m_customTypesForProperty || !m_customTypesForProperty->contains(propertyName))
143 return KoProperty::Auto;
144 return (*m_customTypesForProperty)[propertyName];
150WidgetFactory::WidgetFactory(TQObject *parent, const char *name)
151 : TQObject(parent, (const char*)(TQCString( "kformdesigner_")+name))
153 m_showAdvancedProperties = true;
154 m_classesByName.setAutoDelete( true);
159WidgetFactory::~WidgetFactory()
161 delete m_hiddenClasses;
170 kdWarning() << "WidgetFactory::addClass(): class with name '" << w-> className()
171 << "' already exists for factory '" << name() << "'" << endl;
174 m_classesByName.insert( w-> className(), w );
179 if (!m_hiddenClasses)
180 m_hiddenClasses = new TQAsciiDict<char>(101, false);
181 m_hiddenClasses->insert(classname, ( char*)1);
186 TQWidget *w, Container *container, TQRect geometry,
187 int align, bool useFrame, bool multiLine, BackgroundMode background)
191 KTextEdit *textedit = new KTextEdit(text, TQString(), w->parentWidget());
192 textedit->setTextFormat(TQt::PlainText);
193 textedit->setAlignment(align);
194 if ( dynamic_cast<TQTextEdit* >(w)) {
195 textedit->setWordWrap( dynamic_cast<TQTextEdit* >(w)->wordWrap());
196 textedit->setWrapPolicy( dynamic_cast<TQTextEdit* >(w)->wrapPolicy());
198 textedit->setPalette(w->palette());
199 textedit->setFont(w->font());
200 textedit->setResizePolicy(TQScrollView::Manual);
201 textedit->setGeometry(geometry);
202 if(background == TQt::NoBackground)
203 textedit->setBackgroundMode(w->backgroundMode());
205 textedit->setBackgroundMode(background);
207 textedit->setPaletteBackgroundColor(w->paletteBackgroundColor());
208 for( int i =0; i <= textedit->paragraphs(); i++)
209 textedit->setParagraphBackgroundColor(i, w->paletteBackgroundColor());
210 textedit->selectAll( true);
211 textedit->setColor(w->paletteForegroundColor());
212 textedit->selectAll( false);
213 textedit->moveCursor(TQTextEdit::MoveEnd, false);
214 textedit->setParagraphBackgroundColor(0, w->paletteBackgroundColor());
215 textedit->setVScrollBarMode(TQScrollView::AlwaysOff);
216 textedit->setHScrollBarMode(TQScrollView::AlwaysOff);
217 textedit->installEventFilter( this);
218 textedit->setFrameShape(useFrame ? TQFrame::LineEditPanel : TQFrame::NoFrame);
219 textedit->setMargin(2);
221 textedit->setFocus();
222 textedit->selectAll();
223 setEditor(w, textedit);
225 connect(textedit, TQ_SIGNAL(textChanged()), this, TQ_SLOT(slotTextChanged()));
226 connect(w, TQ_SIGNAL(destroyed()), this, TQ_SLOT(widgetDestroyed()));
227 connect(textedit, TQ_SIGNAL(destroyed()), this, TQ_SLOT( editorDeleted()));
231 KLineEdit *editor = new KLineEdit(text, w->parentWidget());
232 editor->setAlignment(align);
233 editor->setPalette(w->palette());
234 editor->setFont(w->font());
235 editor->setGeometry(geometry);
236 if(background == TQt::NoBackground)
237 editor->setBackgroundMode(w->backgroundMode());
239 editor->setBackgroundMode(background);
240 editor->installEventFilter( this);
241 editor->setFrame(useFrame);
242 editor->setMargin(2);
246 connect(editor, TQ_SIGNAL(textChanged( const TQString&)), this, TQ_SLOT(changeTextInternal( const TQString&)));
247 connect(w, TQ_SIGNAL(destroyed()), this, TQ_SLOT(widgetDestroyed()));
248 connect(editor, TQ_SIGNAL(destroyed()), this, TQ_SLOT( editorDeleted()));
250 setEditor(w, editor);
255 TQWidget *subwidget = (subpropIface && subpropIface-> subwidget()) ? subpropIface-> subwidget() : w;
256 if (-1!=m_editor->metaObject()->findProperty( "margin", true) && -1!=subwidget->metaObject()->findProperty( "margin", true))
257 m_editor->setProperty( "margin", subwidget->property( "margin"));
262 m_handles->setEditingMode( true);
272 setWidget(w, container);
273 m_editedWidgetClass = classname;
277 changeTextInternal(text);
292 m_handles->setEditingMode( true);
297 setWidget(w, container);
303 if(!tree->isEnabled()) {
304 TQPalette p = w->palette();
305 TQColorGroup cg = p.active();
306 p.setActive(p.disabled());
311 connect(w, TQ_SIGNAL(destroyed()), this, TQ_SLOT(widgetDestroyed()));
317 KDialogBase dialog(w->topLevelWidget(), "stringlist_dialog", true, i18n( "Edit List of Items"),
318 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, false);
320 KEditListBox *edit = new KEditListBox(i18n( "Contents of %1").arg(w->name()), &dialog, "editlist");
321 dialog.setMainWidget(edit);
322 edit->insertStringList(list);
325 if(dialog.exec() == TQDialog::Accepted)
327 list = edit->items();
337 if(dlg.exec()== TQDialog::Accepted)
355 if( ((ev->type() == TQEvent::Resize) || (ev->type() == TQEvent::Move) ) && (obj == m_widget) && editor(m_widget)) {
357 TQWidget *ed = editor(m_widget);
360 else if((ev->type() == TQEvent::Paint) && (obj == m_widget) && editor(m_widget)) {
362 return m_container->eventFilter(obj, ev);
364 else if((ev->type() == TQEvent::MouseButtonPress) && (obj == m_widget) && editor(m_widget)) {
371 if(ev->type() == TQEvent::FocusOut)
373 TQWidget *w = editor(m_widget);
375 w = (TQWidget *)m_widget;
376 if(obj != (TQObject *)w)
379 TQWidget *focus = w->topLevelWidget()->focusWidget();
380 if(focus && w != focus && !w->child(focus->name(), focus->className()))
383 else if(ev->type() == TQEvent::KeyPress)
385 TQWidget *w = editor(m_widget);
387 w = (TQWidget *)m_widget;
388 if(obj != (TQObject *)w)
391 TQKeyEvent *e = static_cast<TQKeyEvent* >(ev);
392 if(((e->key() == TQt::Key_Return) || (e->key() == TQt::Key_Enter)) && (e->state() != AltButton))
394 if(e->key() == TQt::Key_Escape)
396 setEditorText(m_firstText);
401 else if(ev->type() == TQEvent::ContextMenu) {
402 TQWidget *w = editor(m_widget);
404 w = (TQWidget *)m_widget;
405 if(obj != (TQObject *)w)
417WidgetFactory::resetEditor()
420 m_container->stopInlineEditing();
422 TQWidget *ed = editor(m_widget);
425 ObjectTreeItem *tree = m_container ? m_container->form()->objectTree()->lookup(m_widget->name()) : 0;
428 kdDebug() << "WidgetFactory::resetEditor() : error cannot found a tree item " << endl;
433 setRecursiveCursor(m_widget, m_container->form());
434 if (m_widget->inherits( "TQLineEdit") || m_widget->inherits( "TQTextEdit")) {
435 m_widget->unsetCursor();
436 m_widget->setCursor(TQt::ArrowCursor);
441 if(!ed && !tree->isEnabled()) {
442 TQPalette p = m_widget->palette();
443 TQColorGroup cg = p.active();
444 p.setActive(p.disabled());
446 m_widget->setPalette(p);
451 changeTextInternal(editorText());
452 disconnect(ed, 0, this, 0);
458 disconnect(m_widget, 0, this, 0);
464 m_handles->setEditingMode( false);
466 setEditor(m_widget, 0);
475WidgetFactory::widgetDestroyed()
479 m_editor->deleteLater();
485 m_handles->setEditingMode( false);
498 m_handles->setEditingMode( false);
500 setEditor(m_widget, 0);
516 m_widget->setProperty(name, value);
523 if(set->contains(name))
524 (*set)[name] = value;
545 const TQCString &property, bool multiple, bool isTopLevel)
549 return property== "font" || property== "paletteBackgroundColor" || property== "enabled"
550 || property== "paletteForegroundColor" || property== "cursor" || property== "paletteBackgroundPixmap";
564 const TQCString &property, bool isTopLevel)
568#ifdef KEXI_NO_CURSOR_PROPERTY
570 if (property== "cursor")
575 && (property== "caption" || property== "icon" || property== "sizeIncrement" || property== "iconText")) {
584 const TQCString& property)
598WidgetFactory::slotTextChanged()
600 changeTextInternal(editorText());
604WidgetFactory::clearWidgetContent( const TQCString &, TQWidget *)
610WidgetFactory::changeTextInternal( const TQString& text)
615 if (!m_editedWidgetClass.isEmpty()) {
616 WidgetInfo *wi = m_classesByName[ m_editedWidgetClass ];
617 if (wi && wi->inheritedClass()) {
619 wi->inheritedClass()->factory()-> changeText( text );
645 for (TQAsciiDictIterator<WidgetInfo> it(m_classesByName); it.current(); ++it) {
646 if (!it.current()->parentFactoryName().isEmpty())
652TQString WidgetFactory::editorText() const {
653 TQWidget *ed = editor(m_widget);
654 return dynamic_cast<KTextEdit* >(ed) ? dynamic_cast<KTextEdit* >(ed)->text() : dynamic_cast<KLineEdit* >(ed)->text();
657void WidgetFactory::setEditorText( const TQString& text) {
658 TQWidget *ed = editor(m_widget);
659 if ( dynamic_cast<KTextEdit* >(ed))
660 dynamic_cast<KTextEdit* >(ed)->setText(text);
662 dynamic_cast<KLineEdit* >(ed)->setText(text);
665void WidgetFactory::setEditor(TQWidget *widget, TQWidget *editor)
669 WidgetInfo *winfo = m_classesByName[widget->className()];
670 if (!winfo || winfo->parentFactoryName().isEmpty()) {
674 WidgetFactory *f = m_library->factory(winfo->parentFactoryName());
676 f->setEditor(widget, editor);
681TQWidget *WidgetFactory::editor(TQWidget *widget) const
685 WidgetInfo *winfo = m_classesByName[widget->className()];
686 if (!winfo || winfo->parentFactoryName().isEmpty()) {
690 WidgetFactory *f = m_library->factoryForClassName(widget->className());
692 return f->editor(widget);
697void WidgetFactory::setWidget(TQWidget *widget, Container* container)
699 WidgetInfo *winfo = widget ? m_classesByName[widget->className()] : 0;
700 if (winfo && !winfo->parentFactoryName().isEmpty()) {
701 WidgetFactory *f = m_library->factory(winfo->parentFactoryName());
703 f->setWidget(widget, container);
706 m_container = container;
709TQWidget *WidgetFactory::widget() const
715 const TQString& value)
725#include "widgetfactory.moc"
A simple dialog to edit rich text.
3-state logical type with three values: true, false and cancelled and convenient operators.
|