diff options
Diffstat (limited to 'kdevdesigner/designer')
392 files changed, 69002 insertions, 0 deletions
diff --git a/kdevdesigner/designer/CMakeLists.txt b/kdevdesigner/designer/CMakeLists.txt new file mode 100644 index 00000000..4cdcea2b --- /dev/null +++ b/kdevdesigner/designer/CMakeLists.txt @@ -0,0 +1,107 @@ +################################################# +# +# (C) 2010-2011 Serghei Amelian +# serghei (DOT) amelian (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +add_definitions( -DDESIGNER -UQT_NO_ASCII_CAST ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/kdevdesigner/shared + ${CMAKE_SOURCE_DIR}/lib/interfaces/external + ${TDE_INCLUDE_DIR} + ${TQT_INCLUDE_DIRS} +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + + +##### other data ################################ + +install( FILES + kdevdesigner_part.desktop + DESTINATION ${SERVICES_INSTALL_DIR} ) + +install( FILES + kdevdesigner_part.rc kdevdesigner_part_sh.rc + DESTINATION ${DATA_INSTALL_DIR}/kdevdesignerpart ) + +add_subdirectory( pics ) + + +##### libkdevdesignerpart (module) ############## + +set( SRCS + about.ui dbconnection.ui gotolinedialog.ui + newform.ui actionlistview.cpp asciivalidator.cpp + command.cpp connectionitems.cpp connectiontable.cpp + customwidgeteditor.ui formsettings.ui + multilineeditor.ui customwidgeteditorimpl.cpp + database.cpp dbconnectioneditor.ui iconvieweditor.ui + paletteeditor.ui dbconnectionimpl.cpp dbconnectionsimpl.cpp + dbconnections.ui listboxeditor.ui paletteeditoradvanced.ui + defs.cpp designerapp.cpp designerappiface.cpp + editfunctionsimpl.cpp filechooser.cpp formfile.cpp + formsettingsimpl.cpp formwindow.cpp hierarchyview.cpp + iconvieweditorimpl.cpp layout.cpp listboxdnd.cpp + kdevdesigner_part.cpp actiondnd.cpp actioneditorimpl.cpp + listboxeditorimpl.cpp listboxrename.cpp listdnd.cpp + listeditor.ui pixmapcollectioneditor.ui listviewdnd.cpp + listvieweditorimpl.cpp mainwindow.cpp listvieweditor.ui + pixmapfunction.ui startdialog.ui mainwindowactions.cpp + menubareditor.cpp metadatabase.cpp multilineeditorimpl.cpp + newformimpl.cpp orderindicator.cpp myiconloader.cpp + outputwindow.cpp paletteeditoradvancedimpl.cpp + paletteeditorimpl.cpp pixmapchooser.cpp + pixmapcollection.cpp popupmenueditor.cpp previewframe.cpp + preferences.ui tableeditor.ui designeraction.cpp + previewwidget.ui variabledialog.ui actioneditor.ui + previewwidgetimpl.cpp project.cpp projectsettingsimpl.cpp + projectsettings.ui wizardeditor.ui configtoolboxdialog.ui + propertyeditor.cpp propertyobject.cpp qcompletionedit.cpp + replacedialog.ui connectiondialog.ui editfunctions.ui + resource.cpp sizehandle.cpp sourceeditor.cpp + richtextfontdialog.ui createtemplate.ui finddialog.ui + sourcefile.cpp startdialogimpl.cpp styledbutton.cpp + syntaxhighlighter_html.cpp tableeditorimpl.cpp + timestamp.cpp variabledialogimpl.cpp widgetaction.cpp + widgetfactory.cpp wizardeditorimpl.cpp workspace.cpp +) + +tde_moc( SRCS + actiondnd.h actioneditorimpl.h actionlistview.h + asciivalidator.h command.h connectionitems.h + connectiontable.h customwidgeteditorimpl.h database.h + dbconnectionimpl.h dbconnectionsimpl.h editfunctionsimpl.h + filechooser.h formfile.h formsettingsimpl.h + formwindow.h hierarchyview.h iconvieweditorimpl.h + layout.h listboxdnd.h listboxeditorimpl.h listboxrename.h + listdnd.h listviewdnd.h listvieweditorimpl.h mainwindow.h + menubareditor.h multilineeditorimpl.h newformimpl.h + orderindicator.h outputwindow.h paletteeditoradvancedimpl.h + paletteeditorimpl.h pixmapchooser.h popupmenueditor.h + previewframe.h previewwidgetimpl.h project.h + projectsettingsimpl.h propertyeditor.h qcompletionedit.h + sizehandle.h sourceeditor.h sourcefile.h startdialogimpl.h + styledbutton.h tableeditorimpl.h timestamp.h + variabledialogimpl.h widgetaction.h widgetfactory.h + wizardeditorimpl.h workspace.h + ) + + +tde_add_kpart( libkdevdesignerpart AUTOMOC + SOURCES ${SRCS} + LINK + kdevqui-static shared-static kinterfacedesigner-shared + tdeio-shared tdeparts-shared tqassistantclient + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/kdevdesigner/designer/Makefile.am b/kdevdesigner/designer/Makefile.am new file mode 100644 index 00000000..1857de19 --- /dev/null +++ b/kdevdesigner/designer/Makefile.am @@ -0,0 +1,21 @@ +SUBDIRS = pics + +AM_CXXFLAGS=-DDESIGNER +KDE_CXXFLAGS=-UQT_NO_ASCII_CAST +INCLUDES = -I$(top_srcdir)/kdevdesigner/shared \ + -I$(top_srcdir)/lib/interfaces/external $(all_includes) +METASOURCES = AUTO +kde_module_LTLIBRARIES = libkdevdesignerpart.la +libkdevdesignerpart_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) +libkdevdesignerpart_la_LIBADD = \ + $(top_builddir)/kdevdesigner/uilib/libkdevqui.la $(top_builddir)/kdevdesigner/shared/libshared.la \ + $(top_builddir)/lib/interfaces/external/libkinterfacedesigner.la $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltqassistantclient $(LIB_TDEFILE) $(LIB_TDEPARTS) +libkdevdesignerpart_la_SOURCES = kdevdesigner_part.cpp actiondnd.cpp actioneditorimpl.cpp actionlistview.cpp asciivalidator.cpp command.cpp connectionitems.cpp connectiontable.cpp customwidgeteditorimpl.cpp database.cpp dbconnectionimpl.cpp dbconnectionsimpl.cpp defs.cpp designerapp.cpp designerappiface.cpp editfunctionsimpl.cpp filechooser.cpp formfile.cpp formsettingsimpl.cpp formwindow.cpp hierarchyview.cpp iconvieweditorimpl.cpp layout.cpp listboxdnd.cpp listboxeditorimpl.cpp listboxrename.cpp listdnd.cpp listviewdnd.cpp listvieweditorimpl.cpp mainwindow.cpp mainwindowactions.cpp menubareditor.cpp metadatabase.cpp multilineeditorimpl.cpp newformimpl.cpp orderindicator.cpp outputwindow.cpp paletteeditoradvancedimpl.cpp paletteeditorimpl.cpp pixmapchooser.cpp pixmapcollection.cpp popupmenueditor.cpp previewframe.cpp previewwidgetimpl.cpp project.cpp projectsettingsimpl.cpp propertyeditor.cpp propertyobject.cpp qcompletionedit.cpp resource.cpp sizehandle.cpp sourceeditor.cpp sourcefile.cpp startdialogimpl.cpp styledbutton.cpp syntaxhighlighter_html.cpp tableeditorimpl.cpp timestamp.cpp variabledialogimpl.cpp widgetaction.cpp widgetfactory.cpp wizardeditorimpl.cpp workspace.cpp about.ui dbconnection.ui gotolinedialog.ui newform.ui previewwidget.ui variabledialog.ui actioneditor.ui dbconnectioneditor.ui iconvieweditor.ui paletteeditor.ui projectsettings.ui wizardeditor.ui configtoolboxdialog.ui dbconnections.ui listboxeditor.ui paletteeditoradvanced.ui replacedialog.ui connectiondialog.ui editfunctions.ui listeditor.ui pixmapcollectioneditor.ui richtextfontdialog.ui createtemplate.ui finddialog.ui listvieweditor.ui pixmapfunction.ui startdialog.ui customwidgeteditor.ui formsettings.ui multilineeditor.ui preferences.ui tableeditor.ui designeraction.cpp myiconloader.cpp +partrcdir = $(kde_datadir)/kdevdesignerpart +partdesktopdir = $(kde_servicesdir) +partdesktop_DATA = kdevdesigner_part.desktop +partrc_DATA = kdevdesigner_part.rc kdevdesigner_part_sh.rc +noinst_HEADERS = kdevdesigner_part.h designeraction.h myiconloader.h +picsdirdir = $(kde_datadir)/kdevdesignerpart/pics + +KDE_OPTIONS=nofinal diff --git a/kdevdesigner/designer/about.ui b/kdevdesigner/designer/about.ui new file mode 100644 index 00000000..48d53486 --- /dev/null +++ b/kdevdesigner/designer/about.ui @@ -0,0 +1,219 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>AboutDialog</class> +<comment>********************************************************************* +** Copyright (C) 2001-2003 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>AboutDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>544</width> + <height>667</height> + </rect> + </property> + <property name="caption"> + <string>Qt Designer</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>aboutPixmap</cstring> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <property name="pixmap"> + <pixmap>"designer_splash.png"</pixmap> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + <property name="hAlign" stdset="0"> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>aboutVersion</cstring> + </property> + <property name="text"> + <string>Version 3.2</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + <property name="hAlign" stdset="0"> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>aboutCopyright</cstring> + </property> + <property name="text"> + <string>Copyright (C) 2000-2003 Trolltech AS. All Rights Reserved.</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + <property name="hAlign" stdset="0"> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>aboutLicense</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p>Qt Commercial Edition license holders: This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution.</p><p></p><p>Qt Free Edition users: This program is licensed to you under the terms of the GNU General Public License Version 2. For details, see the file LICENSE.GPL that came with this software distribution.</p><p>The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p></string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter|AlignLeft</set> + </property> + <property name="wordwrap" stdset="0"> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>AboutDialog</receiver> + <slot>accept()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/actiondnd.cpp b/kdevdesigner/designer/actiondnd.cpp new file mode 100644 index 00000000..33f0c4bf --- /dev/null +++ b/kdevdesigner/designer/actiondnd.cpp @@ -0,0 +1,728 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "actiondnd.h" +#include "command.h" +#include "defs.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "metadatabase.h" +#include "widgetfactory.h" +#include "hierarchyview.h" + +#include <tqaction.h> +#include <tqapplication.h> +#include <tqbitmap.h> +#include <tqdragobject.h> +#include <tqinputdialog.h> +#include <tqlayout.h> +#include <tqmainwindow.h> +#include <tqmenudata.h> +#include <tqmessagebox.h> +#include <tqobjectlist.h> +#include <tqpainter.h> +#include <tqstyle.h> +#include <tqtimer.h> + +#include <tdelocale.h> + +TQAction *ActionDrag::the_action = 0; + +ActionDrag::ActionDrag(TQAction *action, TQWidget *source) +: TQStoredDrag("application/x-designer-actions", source) +{ + Q_ASSERT(the_action == 0); + the_action = action; +} + +ActionDrag::ActionDrag(TQActionGroup *group, TQWidget *source) +: TQStoredDrag("application/x-designer-actiongroup", source) +{ + Q_ASSERT(the_action == 0); + the_action = group; +} + +ActionDrag::ActionDrag(const TQString &type, TQAction *action, TQWidget *source) +: TQStoredDrag(type, source) +{ + Q_ASSERT(the_action == 0); + the_action = action; +} + +bool ActionDrag::canDecode(TQDropEvent *e) +{ + return e->provides( "application/x-designer-actions" ) || + e->provides( "application/x-designer-actiongroup" ) || + e->provides( "application/x-designer-separator" ); +} + +ActionDrag::~ActionDrag() +{ + the_action = 0; +} + +void QDesignerAction::init() +{ + MetaDataBase::addEntry( this ); + int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( this ) ); + WidgetFactory::saveDefaultProperties( this, id ); + WidgetFactory::saveChangedProperties( this, id ); +} + +void QDesignerActionGroup::init() +{ + MetaDataBase::addEntry( this ); + int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( this ) ); + WidgetFactory::saveDefaultProperties( this, id ); + WidgetFactory::saveChangedProperties( this, id ); +} + +bool QDesignerAction::addTo( TQWidget *w ) +{ + if ( !widgetToInsert ) + return TQAction::addTo( w ); + + if ( ::tqqt_cast<TQPopupMenu*>(w) ) + return FALSE; + + widgetToInsert->reparent( w, TQPoint( 0, 0 ), FALSE ); + widgetToInsert->show(); + addedTo( widgetToInsert, w ); + return TRUE; +} + +bool QDesignerAction::removeFrom( TQWidget *w ) +{ + if ( !widgetToInsert ) + return TQAction::removeFrom( w ); + + remove(); + return TRUE; +} + +void QDesignerAction::remove() +{ + if ( !widgetToInsert ) + return; + MainWindow::self->formWindow()->selectWidget( TQT_TQOBJECT(widgetToInsert), FALSE ); + widgetToInsert->reparent( 0, TQPoint( 0, 0 ), FALSE ); +} + +QDesignerToolBarSeparator::QDesignerToolBarSeparator(Qt::Orientation o , TQToolBar *parent, + const char* name ) + : TQWidget( parent, name ) +{ + connect( parent, TQT_SIGNAL(orientationChanged(Qt::Orientation)), + this, TQT_SLOT(setOrientation(Qt::Orientation)) ); + setOrientation( o ); + setBackgroundMode( parent->backgroundMode() ); + setBackgroundOrigin( ParentOrigin ); + setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); +} + +void QDesignerToolBarSeparator::setOrientation( Qt::Orientation o ) +{ + orient = o; +} + +void QDesignerToolBarSeparator::styleChange( TQStyle& ) +{ + setOrientation( orient ); +} + +TQSize QDesignerToolBarSeparator::sizeHint() const +{ + int extent = style().pixelMetric( TQStyle::PM_DockWindowSeparatorExtent, + this ); + if ( orient ==Qt::Horizontal ) + return TQSize( extent, 0 ); + else + return TQSize( 0, extent ); +} + +void QDesignerToolBarSeparator::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + TQStyle::SFlags flags = TQStyle::Style_Default; + + if ( orientation() ==Qt::Horizontal ) + flags |= TQStyle::Style_Horizontal; + + style().tqdrawPrimitive( TQStyle::PE_DockWindowSeparator, &p, rect(), + colorGroup(), flags ); +} + + + +QSeparatorAction::QSeparatorAction( TQObject *parent ) + : TQAction( parent, "qt_designer_separator" ), wid( 0 ) +{ +} + +bool QSeparatorAction::addTo( TQWidget *w ) +{ + if ( ::tqqt_cast<TQToolBar*>(w) ) { + TQToolBar *tb = (TQToolBar*)w; + wid = new QDesignerToolBarSeparator( tb->orientation(), tb ); + return TRUE; + } else if ( ::tqqt_cast<TQPopupMenu*>(w) ) { + idx = ( (TQPopupMenu*)w )->count(); + ( (TQPopupMenu*)w )->insertSeparator( idx ); + return TRUE; + } + return FALSE; +} + +bool QSeparatorAction::removeFrom( TQWidget *w ) +{ + if ( ::tqqt_cast<TQToolBar*>(w) ) { + delete wid; + return TRUE; + } else if ( ::tqqt_cast<TQPopupMenu*>(w) ) { + ( (TQPopupMenu*)w )->removeItemAt( idx ); + return TRUE; + } + return FALSE; +} + +TQWidget *QSeparatorAction::widget() const +{ + return wid; +} + + + +QDesignerToolBar::QDesignerToolBar( TQMainWindow *mw ) + : TQToolBar( mw ), lastIndicatorPos( -1, -1 ) +{ + insertAnchor = 0; + afterAnchor = TRUE; + setAcceptDrops( TRUE ); + MetaDataBase::addEntry( TQT_TQOBJECT(this) ); + lastIndicatorPos = TQPoint( -1, -1 ); + indicator = new QDesignerIndicatorWidget( this ); + indicator->hide(); + installEventFilter( this ); + widgetInserting = FALSE; + findFormWindow(); + mw->setDockEnabled( DockTornOff, FALSE ); +} + +QDesignerToolBar::QDesignerToolBar( TQMainWindow *mw, Dock dock ) + : TQToolBar( TQString(), mw, dock), lastIndicatorPos( -1, -1 ) +{ + insertAnchor = 0; + afterAnchor = TRUE; + setAcceptDrops( TRUE ); + indicator = new QDesignerIndicatorWidget( this ); + indicator->hide(); + MetaDataBase::addEntry( TQT_TQOBJECT(this) ); + installEventFilter( this ); + widgetInserting = FALSE; + findFormWindow(); + mw->setDockEnabled( DockTornOff, FALSE ); +} + +void QDesignerToolBar::findFormWindow() +{ + TQWidget *w = this; + while ( w ) { + formWindow = ::tqqt_cast<FormWindow*>(w); + if ( formWindow ) + break; + w = w->parentWidget(); + } +} + +void QDesignerToolBar::addAction( TQAction *a ) +{ + actionList.append( a ); + connect( a, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( actionRemoved() ) ); + if ( ::tqqt_cast<TQActionGroup*>(a) ) { + ( (QDesignerActionGroup*)a )->widget()->installEventFilter( this ); + actionMap.insert( ( (QDesignerActionGroup*)a )->widget(), a ); + } else if ( ::tqqt_cast<QSeparatorAction*>(a) ) { + ( (QSeparatorAction*)a )->widget()->installEventFilter( this ); + actionMap.insert( ( (QSeparatorAction*)a )->widget(), a ); + } else { + ( (QDesignerAction*)a )->widget()->installEventFilter( this ); + actionMap.insert( ( (QDesignerAction*)a )->widget(), a ); + } +} + +static void fixObject( TQObject *&o ) +{ + while ( o && o->parent() && !::tqqt_cast<QDesignerToolBar*>(o->parent()) ) + o = o->parent(); +} + +bool QDesignerToolBar::eventFilter( TQObject *o, TQEvent *e ) +{ + if ( !o || !e || o->inherits( TQDOCKWINDOWHANDLE_OBJECT_NAME_STRING ) || o->inherits( "TQDockWindowTitleBar" ) ) + return TQToolBar::eventFilter( o, e ); + + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this) && e->type() == TQEvent::MouseButtonPress && + ( ( TQMouseEvent*)e )->button() == Qt::LeftButton ) { + mousePressEvent( (TQMouseEvent*)e ); + return TRUE; + } + + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this) ) + return TQToolBar::eventFilter( o, e ); + + if ( e->type() == TQEvent::MouseButtonPress ) { + TQMouseEvent *ke = (TQMouseEvent*)e; + fixObject( o ); + if ( !o ) + return FALSE; + buttonMousePressEvent( ke, o ); + return TRUE; + } else if(e->type() == TQEvent::ContextMenu ) { + TQContextMenuEvent *ce = (TQContextMenuEvent*)e; + fixObject( o ); + if( !o ) + return FALSE; + buttonContextMenuEvent( ce, o ); + return TRUE; + } else if ( e->type() == TQEvent::MouseMove ) { + TQMouseEvent *ke = (TQMouseEvent*)e; + fixObject( o ); + if ( !o ) + return FALSE; + buttonMouseMoveEvent( ke, o ); + return TRUE; + } else if ( e->type() == TQEvent::MouseButtonRelease ) { + TQMouseEvent *ke = (TQMouseEvent*)e; + fixObject( o ); + if ( !o ) + return FALSE; + buttonMouseReleaseEvent( ke, o ); + return TRUE; + } else if ( e->type() == TQEvent::DragEnter ) { + TQDragEnterEvent *de = (TQDragEnterEvent*)e; + if (ActionDrag::canDecode(de)) + de->accept(); + } else if ( e->type() == TQEvent::DragMove ) { + TQDragMoveEvent *de = (TQDragMoveEvent*)e; + if (ActionDrag::canDecode(de)) + de->accept(); + } + + return TQToolBar::eventFilter( o, e ); +} + +void QDesignerToolBar::paintEvent( TQPaintEvent *e ) +{ + TQToolBar::paintEvent( e ); + if ( e->rect() != rect() ) + return; + lastIndicatorPos = TQPoint( -1, -1 ); +} + +void QDesignerToolBar::contextMenuEvent( TQContextMenuEvent *e ) +{ + e->accept(); + TQPopupMenu menu( 0 ); + menu.insertItem( i18n( "Delete Toolbar" ), 1 ); + int res = menu.exec( e->globalPos() ); + if ( res != -1 ) { + RemoveToolBarCommand *cmd = new RemoveToolBarCommand( i18n( "Delete Toolbar '%1'" ).arg( name() ), + formWindow, 0, this ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +void QDesignerToolBar::mousePressEvent( TQMouseEvent *e ) +{ + widgetInserting = FALSE; + if ( e->button() == Qt::LeftButton && + MainWindow::self->currentTool() != POINTER_TOOL && + MainWindow::self->currentTool() != ORDER_TOOL && + MainWindow::self->currentTool() != CONNECT_TOOL && + MainWindow::self->currentTool() != BUDDY_TOOL ) + widgetInserting = TRUE; +} + +void QDesignerToolBar::mouseReleaseEvent( TQMouseEvent *e ) +{ + if ( widgetInserting ) + doInsertWidget( mapFromGlobal( e->globalPos() ) ); + widgetInserting = FALSE; +} + +void QDesignerToolBar::buttonMouseReleaseEvent( TQMouseEvent *e, TQObject *w ) +{ + if ( widgetInserting ) + doInsertWidget( mapFromGlobal( e->globalPos() ) ); + else if ( w->isWidgetType() && formWindow->widgets()->find( w ) ) { + formWindow->clearSelection( FALSE ); + formWindow->selectWidget( w ); + } + widgetInserting = FALSE; +} + +void QDesignerToolBar::buttonContextMenuEvent( TQContextMenuEvent *e, TQObject *o ) +{ + e->accept(); + TQPopupMenu menu( 0 ); + const int ID_DELETE = 1; + const int ID_SEP = 2; + const int ID_DELTOOLBAR = 3; + TQMap<TQWidget*, TQAction*>::Iterator it = actionMap.find( (TQWidget*)o ); + if ( it != actionMap.end() && ::tqqt_cast<QSeparatorAction*>(*it) ) + menu.insertItem( i18n( "Delete Separator" ), ID_DELETE ); + else + menu.insertItem( i18n( "Delete Item" ), ID_DELETE ); + menu.insertItem( i18n( "Insert Separator" ), ID_SEP ); + menu.insertSeparator(); + menu.insertItem( i18n( "Delete Toolbar" ), ID_DELTOOLBAR ); + int res = menu.exec( e->globalPos() ); + if ( res == ID_DELETE ) { + TQMap<TQWidget*, TQAction*>::Iterator it = actionMap.find( (TQWidget*)o ); + if ( it == actionMap.end() ) + return; + TQAction *a = *it; + int index = actionList.find( a ); + RemoveActionFromToolBarCommand *cmd = new RemoveActionFromToolBarCommand( + i18n( "Delete Action '%1' From Toolbar '%2'" ). + arg( a->name() ).arg( caption() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( res == ID_SEP ) { + calcIndicatorPos( mapFromGlobal( e->globalPos() ) ); + TQAction *a = new QSeparatorAction( 0 ); + int index = actionList.findRef( *actionMap.find( insertAnchor ) ); + if ( index != -1 && afterAnchor ) + ++index; + if ( !insertAnchor ) + index = 0; + + AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( + i18n( "Add Separator to Toolbar '%1'" ). + arg( a->name() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( res == ID_DELTOOLBAR ) { + RemoveToolBarCommand *cmd = new RemoveToolBarCommand( i18n( "Delete Toolbar '%1'" ).arg( name() ), + formWindow, 0, this ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +void QDesignerToolBar::buttonMousePressEvent( TQMouseEvent *e, TQObject * ) +{ + widgetInserting = FALSE; + + if ( e->button() == Qt::MidButton ) + return; + + if ( e->button() == Qt::LeftButton && + MainWindow::self->currentTool() != POINTER_TOOL && + MainWindow::self->currentTool() != ORDER_TOOL && + MainWindow::self->currentTool() != CONNECT_TOOL && + MainWindow::self->currentTool() != BUDDY_TOOL ) { + widgetInserting = TRUE; + return; + } + + dragStartPos = e->pos(); +} + +void QDesignerToolBar::removeWidget( TQWidget *w ) +{ + TQMap<TQWidget*, TQAction*>::Iterator it = actionMap.find( w ); + if ( it == actionMap.end() ) + return; + TQAction *a = *it; + int index = actionList.find( a ); + RemoveActionFromToolBarCommand *cmd = + new RemoveActionFromToolBarCommand( i18n( "Delete Action '%1' From Toolbar '%2'" ). + arg( a->name() ).arg( caption() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + TQApplication::sendPostedEvents(); + adjustSize(); +} + +void QDesignerToolBar::buttonMouseMoveEvent( TQMouseEvent *e, TQObject *o ) +{ + if ( widgetInserting || ( e->state() & Qt::LeftButton ) == 0 ) + return; + if ( TQABS( TQPoint( dragStartPos - e->pos() ).manhattanLength() ) < TQApplication::startDragDistance() ) + return; + TQMap<TQWidget*, TQAction*>::Iterator it = actionMap.find( (TQWidget*)o ); + if ( it == actionMap.end() ) + return; + TQAction *a = *it; + if ( !a ) + return; + int index = actionList.find( a ); + RemoveActionFromToolBarCommand *cmd = + new RemoveActionFromToolBarCommand( i18n( "Delete Action '%1' From Toolbar '%2'" ). + arg( a->name() ).arg( caption() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + TQApplication::sendPostedEvents(); + adjustSize(); + + TQString type = ::tqqt_cast<TQActionGroup*>(a) ? TQString( "application/x-designer-actiongroup" ) : + ::tqqt_cast<QSeparatorAction*>(a) ? TQString( "application/x-designer-separator" ) : TQString( "application/x-designer-actions" ); + TQStoredDrag *drag = new ActionDrag( type, a, this ); + drag->setPixmap( a->iconSet().pixmap() ); + if ( ::tqqt_cast<QDesignerAction*>(a) ) { + if ( formWindow->widgets()->find( ( (QDesignerAction*)a )->widget() ) ) + formWindow->selectWidget( ( TQT_TQOBJECT(( (QDesignerAction*)a )->widget())), FALSE ); + } + if ( !drag->drag() ) { + AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( i18n( "Add Action '%1' to Toolbar '%2'" ). + arg( a->name() ).arg( caption() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + lastIndicatorPos = TQPoint( -1, -1 ); + indicator->hide(); +} + +#ifndef TQT_NO_DRAGANDDROP + +void QDesignerToolBar::dragEnterEvent( TQDragEnterEvent *e ) +{ + widgetInserting = FALSE; + lastIndicatorPos = TQPoint( -1, -1 ); + if (ActionDrag::canDecode(e)) + e->accept(); +} + +void QDesignerToolBar::dragMoveEvent( TQDragMoveEvent *e ) +{ + if (ActionDrag::canDecode(e)) { + e->accept(); + drawIndicator( calcIndicatorPos( e->pos() ) ); + } +} + +void QDesignerToolBar::dragLeaveEvent( TQDragLeaveEvent * ) +{ + indicator->hide(); + insertAnchor = 0; + afterAnchor = TRUE; +} + +void QDesignerToolBar::dropEvent( TQDropEvent *e ) +{ + if (!ActionDrag::canDecode(e)) + return; + + e->accept(); + + indicator->hide(); + TQAction *a = 0; + int index = actionList.findRef( *actionMap.find( insertAnchor ) ); + if ( index != -1 && afterAnchor ) + ++index; + if ( !insertAnchor ) + index = 0; + if ( e->provides( "application/x-designer-actions" ) || + e->provides( "application/x-designer-separator" ) ) { + if ( e->provides( "application/x-designer-actions" ) ) + a = ::tqqt_cast<QDesignerAction*>(ActionDrag::action()); + else + a = ::tqqt_cast<QSeparatorAction*>(ActionDrag::action()); + } else { + a = ::tqqt_cast<QDesignerActionGroup*>(ActionDrag::action()); + } + + if ( actionList.findRef( a ) != -1 ) { + TQMessageBox::warning( MainWindow::self, i18n( "Insert/Move Action" ), + i18n( "Action '%1' has already been added to this toolbar.\n" + "An Action may only occur once in a given toolbar." ). + arg( a->name() ) ); + return; + } + + AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( i18n( "Add Action '%1' to Toolbar '%2'" ). + arg( a->name() ).arg( caption() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + + lastIndicatorPos = TQPoint( -1, -1 ); +} + +#endif + +void QDesignerToolBar::reInsert() +{ + TQAction *a = 0; + actionMap.clear(); + clear(); + for ( a = actionList.first(); a; a = actionList.next() ) { + a->addTo( this ); + if ( ::tqqt_cast<TQActionGroup*>(a) ) { + actionMap.insert( ( (QDesignerActionGroup*)a )->widget(), a ); + if ( ( (QDesignerActionGroup*)a )->widget() ) + ( (QDesignerActionGroup*)a )->widget()->installEventFilter( this ); + } else if ( ::tqqt_cast<QDesignerAction*>(a) ) { + actionMap.insert( ( (QDesignerAction*)a )->widget(), a ); + ( (QDesignerAction*)a )->widget()->installEventFilter( this ); + } else if ( ::tqqt_cast<QSeparatorAction*>(a) ) { + actionMap.insert( ( (QSeparatorAction*)a )->widget(), a ); + ( (QSeparatorAction*)a )->widget()->installEventFilter( this ); + } + } + TQApplication::sendPostedEvents(); + adjustSize(); +} + +void QDesignerToolBar::actionRemoved() +{ + actionList.removeRef( (TQAction*)sender() ); +} + +TQPoint QDesignerToolBar::calcIndicatorPos( const TQPoint &pos ) +{ + if ( orientation() ==Qt::Horizontal ) { + TQPoint pnt( width() - 2, 0 ); + insertAnchor = 0; + afterAnchor = TRUE; + TQObjectList clo = childrenListObject(); + if ( clo.isEmpty() ) + return pnt; + pnt = TQPoint( 13, 0 ); + TQObjectListIt it( clo ); + TQObject * obj; + while( (obj=it.current()) != 0 ) { + ++it; + if ( obj->isWidgetType() && + qstrcmp( "qt_dockwidget_internal", obj->name() ) != 0 ) { + TQWidget *w = (TQWidget*)obj; + if ( w->x() < pos.x() ) { + pnt.setX( w->x() + w->width() + 1 ); + insertAnchor = w; + afterAnchor = TRUE; + } + } + } + return pnt; + } else { + TQPoint pnt( 0, height() - 2 ); + insertAnchor = 0; + afterAnchor = TRUE; + TQObjectList clo = childrenListObject(); + if ( clo.isEmpty() ) + return pnt; + pnt = TQPoint( 0, 13 ); + TQObjectListIt it( clo ); + TQObject * obj; + while( (obj=it.current()) != 0 ) { + ++it; + if ( obj->isWidgetType() && + qstrcmp( "qt_dockwidget_internal", obj->name() ) != 0 ) { + TQWidget *w = (TQWidget*)obj; + if ( w->y() < pos.y() ) { + pnt.setY( w->y() + w->height() + 1 ); + insertAnchor = w; + afterAnchor = TRUE; + } + } + } + return pnt; + } +} + +void QDesignerToolBar::drawIndicator( const TQPoint &pos ) +{ + if ( lastIndicatorPos == pos ) + return; + bool wasVsisible = indicator->isVisible(); + if ( orientation() ==Qt::Horizontal ) { + indicator->resize( 3, height() ); + if ( pos != TQPoint( -1, -1 ) ) + indicator->move( pos.x() - 1, 0 ); + indicator->show(); + indicator->raise(); + lastIndicatorPos = pos; + } else { + indicator->resize( width(), 3 ); + if ( pos != TQPoint( -1, -1 ) ) + indicator->move( 0, pos.y() - 1 ); + indicator->show(); + indicator->raise(); + lastIndicatorPos = pos; + } + if ( !wasVsisible ) + TQApplication::sendPostedEvents(); +} + +void QDesignerToolBar::doInsertWidget( const TQPoint &p ) +{ + if ( formWindow != MainWindow::self->formWindow() ) + return; + calcIndicatorPos( p ); + TQWidget *w = WidgetFactory::create( MainWindow::self->currentTool(), this, 0, TRUE ); + installEventFilters( w ); + MainWindow::self->formWindow()->insertWidget( w, TRUE ); + QDesignerAction *a = new QDesignerAction( w, parent() ); + int index = actionList.findRef( *actionMap.find( insertAnchor ) ); + if ( index != -1 && afterAnchor ) + ++index; + if ( !insertAnchor ) + index = 0; + AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( i18n( "Add Widget '%1' to Toolbar '%2'" ). + arg( w->name() ).arg( caption() ), + formWindow, a, this, index ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + MainWindow::self->resetTool(); +} + +void QDesignerToolBar::clear() +{ + for ( TQAction *a = actionList.first(); a; a = actionList.next() ) { + if ( ::tqqt_cast<QDesignerAction*>(a) ) + ( (QDesignerAction*)a )->remove(); + } + TQToolBar::clear(); +} + +void QDesignerToolBar::installEventFilters( TQWidget *w ) +{ + if ( !w ) + return; + TQObjectList *l = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) + o->installEventFilter( this ); + delete l; +} + +//#include "actiondnd.moc" diff --git a/kdevdesigner/designer/actiondnd.h b/kdevdesigner/designer/actiondnd.h new file mode 100644 index 00000000..1e9f68b0 --- /dev/null +++ b/kdevdesigner/designer/actiondnd.h @@ -0,0 +1,254 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACTIONDND_H +#define ACTIONDND_H + +#include <tqaction.h> +#include <tqdragobject.h> +#include <tqmap.h> +#include <tqmenubar.h> +#include <tqpixmap.h> +#include <tqpopupmenu.h> +#include <tqptrlist.h> +#include <tqtoolbar.h> +#include <tqguardedptr.h> +#include "../shared/widgetdatabase.h" + +//class TQDesignerPopupMenu; +class QDesignerIndicatorWidget; +class FormWindow; +class TQPopupMenu; + +class QDesignerIndicatorWidget : public TQWidget +{ + Q_OBJECT + + +public: + QDesignerIndicatorWidget( TQWidget *p ) + : TQWidget( p, "qt_dockwidget_internal" ) { + setBackgroundColor( red ); + } + +}; + +class ActionDrag : public TQStoredDrag +{ + Q_OBJECT + + +public: + ActionDrag(const TQString &type, TQAction *action, TQWidget *source); + ActionDrag(TQAction *action, TQWidget *source); + ActionDrag(TQActionGroup *group, TQWidget *source); + + ~ActionDrag(); + + static bool canDecode(TQDropEvent *e); + + static TQAction *action() + { + return the_action; + } + +private: + static TQAction *the_action; +}; + +class QDesignerActionGroup : public TQActionGroup +{ + Q_OBJECT + + +public: + QDesignerActionGroup( TQObject *parent ) + : TQActionGroup( ::tqqt_cast<TQActionGroup*>(parent) ? parent : 0 ), wid( 0 ), idx( -1 ) { init(); } + + void init(); + + TQWidget *widget() const { return wid; } + TQWidget *widget( TQAction *a ) const { return *widgets.find( a ); } + int index() const { return idx; } + +protected: +#if !defined(TQ_NO_USING_KEYWORD) + using TQActionGroup::addedTo; +#endif + void addedTo( TQWidget *w, TQWidget * ) { + wid = w; + } + void addedTo( TQWidget *w, TQWidget *, TQAction *a ) { + widgets.insert( a, w ); + } + void addedTo( int index, TQPopupMenu * ) { + idx = index; + } + +private: + TQWidget *wid; + TQMap<TQAction *, TQWidget *> widgets; + int idx; + +}; + +class QDesignerAction : public TQAction +{ + Q_OBJECT + + +public: + QDesignerAction( TQObject *parent ) + : TQAction( ::tqqt_cast<TQActionGroup*>(parent) ? parent : 0 ), wid( 0 ), idx( -1 ), widgetToInsert( 0 ) { init(); } + QDesignerAction( TQWidget *w, TQObject *parent ) + : TQAction( ::tqqt_cast<TQActionGroup*>(parent) ? parent : 0 ), wid( 0 ), idx( -1 ), widgetToInsert( w ) { init(); } + + void init(); + + TQWidget *widget() const { return wid; } + int index() const { return idx; } + + bool addTo( TQWidget *w ); + bool removeFrom( TQWidget *w ); + + void remove(); + bool supportsMenu() const { return !widgetToInsert; } + +protected: + void addedTo( TQWidget *w, TQWidget * ) { + wid = w; + } + void addedTo( int index, TQPopupMenu * ) { + idx = index; + } + +private: + TQWidget *wid; + int idx; + TQWidget *widgetToInsert; + +}; + +class QDesignerToolBarSeparator : public TQWidget +{ + Q_OBJECT + + +public: + QDesignerToolBarSeparator( Qt::Orientation, TQToolBar *parent, const char* name=0 ); + + TQSize sizeHint() const; + Qt::Orientation orientation() const { return orient; } +public slots: + void setOrientation( Qt::Orientation ); +protected: + void styleChange( TQStyle& ); + void paintEvent( TQPaintEvent * ); +private: + Qt::Orientation orient; +}; + + +class QSeparatorAction : public TQAction +{ + Q_OBJECT + + +public: + QSeparatorAction( TQObject *parent ); + + bool addTo( TQWidget *w ); + bool removeFrom( TQWidget *w ); + TQWidget *widget() const; + int index() const; + +private: + TQWidget *wid; + int idx; + +}; + + +class QDesignerToolBar : public TQToolBar +{ + Q_OBJECT + + +public: + QDesignerToolBar( TQMainWindow *mw ); + QDesignerToolBar( TQMainWindow *mw, Dock dock ); + TQPtrList<TQAction> insertedActions() const { return actionList; } + void addAction( TQAction *a ); + + void clear(); + void installEventFilters( TQWidget *w ); + void insertAction( TQWidget *w, TQAction *a ) { actionMap.insert( w, a ); } + void insertAction( int index, TQAction *a ) { actionList.insert( index, a ); } + void appendAction( TQAction *a ) { actionList.append( a ); } + void removeAction( TQAction *a ) { actionList.remove( a ); } + void reInsert(); + void removeWidget( TQWidget *w ); + +protected: + bool eventFilter( TQObject *, TQEvent * ); + void paintEvent( TQPaintEvent * ); +#ifndef TQT_NO_DRAGANDDROP + void dragEnterEvent( TQDragEnterEvent * ); + void dragMoveEvent( TQDragMoveEvent * ); + void dragLeaveEvent( TQDragLeaveEvent * ); + void dropEvent( TQDropEvent * ); +#endif + void contextMenuEvent( TQContextMenuEvent *e ); + void mousePressEvent( TQMouseEvent *e ); + void mouseReleaseEvent( TQMouseEvent *e ); + +private slots: + void actionRemoved(); + +private: + void drawIndicator( const TQPoint &pos ); + TQPoint calcIndicatorPos( const TQPoint &pos ); + void buttonContextMenuEvent( TQContextMenuEvent *e, TQObject *o ); + void buttonMousePressEvent( TQMouseEvent *e, TQObject *o ); + void buttonMouseMoveEvent( TQMouseEvent *e, TQObject *o ); + void buttonMouseReleaseEvent( TQMouseEvent *e, TQObject *o ); + void doInsertWidget( const TQPoint &p ); + void findFormWindow(); + +private: + TQPoint lastIndicatorPos; + TQWidget *insertAnchor; + bool afterAnchor; + TQPtrList<TQAction> actionList; + TQMap<TQWidget*, TQAction*> actionMap; + TQPoint dragStartPos; + QDesignerIndicatorWidget *indicator; + bool widgetInserting; + FormWindow *formWindow; + +}; + +#endif diff --git a/kdevdesigner/designer/actioneditor.ui b/kdevdesigner/designer/actioneditor.ui new file mode 100644 index 00000000..13a56a04 --- /dev/null +++ b/kdevdesigner/designer/actioneditor.ui @@ -0,0 +1,227 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>ActionEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQWidget"> + <property name="name"> + <cstring>ActionEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>206</width> + <height>227</height> + </rect> + </property> + <property name="caption"> + <string>Edit Actions</string> + </property> + <property name="layoutMargin" stdset="0"> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>4</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQToolButton"> + <property name="name"> + <cstring>buttonNewAction</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_filenew.png"</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Create new Action</string> + </property> + </widget> + <widget class="TQToolButton"> + <property name="name"> + <cstring>buttonDeleteAction</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Delete current Action</string> + </property> + </widget> + <widget class="TQToolButton"> + <property name="name"> + <cstring>buttonConnect</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_connecttool.png"</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Connect current Action</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="ActionListView"> + <property name="name"> + <cstring>listActions</cstring> + </property> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>ActionListView</class> + <header location="local">actionlistview.h</header> + <sizehint> + <width>200</width> + <height>200</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>"image0"</pixmap> + <signal>selectionChanged( TQListViewItem * )</signal> + <signal>currentChanged( TQListViewItem * )</signal> + <signal>clicked( TQListViewItem * )</signal> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </image> +</images> +<connections> + <connection> + <sender>listActions</sender> + <signal>currentChanged( TQListViewItem * )</signal> + <receiver>ActionEditorBase</receiver> + <slot>currentActionChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>listActions</sender> + <signal>clicked( TQListViewItem * )</signal> + <receiver>ActionEditorBase</receiver> + <slot>currentActionChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>listActions</sender> + <signal>selectionChanged( TQListViewItem * )</signal> + <receiver>ActionEditorBase</receiver> + <slot>currentActionChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>buttonNewAction</sender> + <signal>clicked()</signal> + <receiver>ActionEditorBase</receiver> + <slot>newAction()</slot> + </connection> + <connection> + <sender>buttonConnect</sender> + <signal>clicked()</signal> + <receiver>ActionEditorBase</receiver> + <slot>connectionsClicked()</slot> + </connection> + <connection> + <sender>buttonDeleteAction</sender> + <signal>clicked()</signal> + <receiver>ActionEditorBase</receiver> + <slot>deleteAction()</slot> + </connection> +</connections> +<forwards> + <forward>class TQListViewItem;</forward> +</forwards> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">connectionsClicked()</slot> + <slot access="protected">currentActionChanged( TQListViewItem * )</slot> + <slot access="protected">deleteAction()</slot> + <slot access="protected">newAction()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/actioneditorimpl.cpp b/kdevdesigner/designer/actioneditorimpl.cpp new file mode 100644 index 00000000..294507a9 --- /dev/null +++ b/kdevdesigner/designer/actioneditorimpl.cpp @@ -0,0 +1,321 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "actioneditorimpl.h" +#include "formwindow.h" +#include "metadatabase.h" +#include "actionlistview.h" +#include "connectiondialog.h" +#include "mainwindow.h" +#include "hierarchyview.h" +#include "formfile.h" + +#include <tqaction.h> +#include <tqlineedit.h> +#include <tqlabel.h> +#include <tqtoolbutton.h> +#include <tqlistview.h> +#include <tqcheckbox.h> +#include <tqpushbutton.h> +#include <tqpopupmenu.h> +#include <tqobjectlist.h> + +#include <tdelocale.h> + +ActionEditor::ActionEditor( TQWidget* parent, const char* name, WFlags fl ) + : ActionEditorBase( parent, name, fl ), currentAction( 0 ), formWindow( 0 ), + explicitlyClosed(false) +{ + listActions->addColumn( i18n( "Actions" ) ); + setEnabled( FALSE ); + buttonConnect->setEnabled( FALSE ); + + TQPopupMenu *popup = new TQPopupMenu( this ); + popup->insertItem( i18n( "New &Action" ), this, TQT_SLOT( newAction() ) ); + popup->insertItem( i18n( "New Action &Group" ), this, TQT_SLOT( newActionGroup() ) ); + popup->insertItem( i18n( "New &Dropdown Action Group" ), this, TQT_SLOT( newDropDownActionGroup() ) ); + buttonNewAction->setPopup( popup ); + buttonNewAction->setPopupDelay( 0 ); + + connect( listActions, TQT_SIGNAL( insertAction() ), this, TQT_SLOT( newAction() ) ); + connect( listActions, TQT_SIGNAL( insertActionGroup() ), this, TQT_SLOT( newActionGroup() ) ); + connect( listActions, TQT_SIGNAL( insertDropDownActionGroup() ), this, TQT_SLOT( newDropDownActionGroup() ) ); + connect( listActions, TQT_SIGNAL( deleteAction() ), this, TQT_SLOT( deleteAction() ) ); + connect( listActions, TQT_SIGNAL( connectAction() ), this, TQT_SLOT( connectionsClicked() ) ); +} + +void ActionEditor::closeEvent( TQCloseEvent *e ) +{ + emit hidden(); + e->accept(); +} + +void ActionEditor::currentActionChanged( TQListViewItem *i ) +{ + buttonConnect->setEnabled( i != 0 ); + if ( !i ) + return; + currentAction = ( (ActionItem*)i )->action(); + if ( !currentAction ) + currentAction = ( (ActionItem*)i )->actionGroup(); + if ( formWindow && currentAction ) + formWindow->setActiveObject( currentAction ); + MainWindow::self->objectHierarchy()->hierarchyList()->setCurrent( currentAction ); +} + +void ActionEditor::setCurrentAction( TQAction *a ) +{ + TQListViewItemIterator it( listActions ); + while ( it.current() ) { + if ( ( (ActionItem*)it.current() )->action() == a || ( (ActionItem*)it.current() )->actionGroup() == a ) { + listActions->setCurrentItem( it.current() ); + listActions->ensureItemVisible( it.current() ); + break; + } + ++it; + } +} + +TQAction *ActionEditor::newActionEx() +{ + ActionItem *i = new ActionItem( listActions, (bool)FALSE ); + TQAction *a = i->action(); + TQObject::connect( a, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject* ) ) ); + MetaDataBase::addEntry( i->action() ); + TQString n = "Action"; + formWindow->unify( i->action(), n, TRUE ); + i->setText( 0, n ); + i->action()->setName( n ); + i->action()->setText( i->action()->name() ); + MetaDataBase::setPropertyChanged( i->action(), "text", TRUE ); + MetaDataBase::setPropertyChanged( i->action(), "name", TRUE ); + formWindow->actionList().append( i->action() ); + if ( formWindow->formFile() ) + formWindow->formFile()->setModified( TRUE ); + return i->action(); +} + +void ActionEditor::deleteAction() +{ + if ( !currentAction ) + return; + + TQListViewItemIterator it( listActions ); + ActionItem *ai = 0; + while ( it.current() ) { + ai = (ActionItem*)it.current(); + if ( ai->action() == currentAction || ai->actionGroup() == currentAction ) { + emit removing( currentAction ); + formWindow->actionList().removeRef( currentAction ); + delete currentAction; + currentAction = 0; + delete it.current(); + break; + } + ++it; + } + if ( formWindow ) { + formWindow->setActiveObject( TQT_TQOBJECT(formWindow->mainContainer()) ); + if ( formWindow->formFile() ) + formWindow->formFile()->setModified( TRUE ); + } +} + +void ActionEditor::newAction() +{ + ActionItem *actionParent = (ActionItem*)listActions->selectedItem(); + if ( actionParent ) { + if ( !::tqqt_cast<TQActionGroup*>(actionParent->actionGroup()) ) + actionParent = (ActionItem*)actionParent->parent(); + } + + ActionItem *i = 0; + if ( actionParent ) + i = new ActionItem( actionParent ); + else + i = new ActionItem( listActions, (bool)FALSE ); + TQAction *a = i->action(); + TQObject::connect( a, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject* ) ) ); + MetaDataBase::addEntry( i->action() ); + TQString n = "Action"; + formWindow->unify( i->action(), n, TRUE ); + i->setText( 0, n ); + i->action()->setName( n ); + i->action()->setText( i->action()->name() ); + if ( actionParent && actionParent->actionGroup() && + actionParent->actionGroup()->usesDropDown() ) { + i->action()->setToggleAction( TRUE ); + MetaDataBase::setPropertyChanged( i->action(), "toggleAction", TRUE ); + } + MetaDataBase::setPropertyChanged( i->action(), "text", TRUE ); + MetaDataBase::setPropertyChanged( i->action(), "name", TRUE ); + listActions->setCurrentItem( i ); + if ( !actionParent ) + formWindow->actionList().append( i->action() ); + if ( formWindow->formFile() ) + formWindow->formFile()->setModified( TRUE ); +} + +void ActionEditor::newActionGroup() +{ + ActionItem *actionParent = (ActionItem*)listActions->selectedItem(); + if ( actionParent ) { + if ( !::tqqt_cast<TQActionGroup*>(actionParent->actionGroup()) ) + actionParent = (ActionItem*)actionParent->parent(); + } + + ActionItem *i = 0; + if ( actionParent ) + i = new ActionItem( actionParent, TRUE ); + else + i = new ActionItem( listActions, TRUE ); + TQAction *ag = i->actionGroup(); + TQObject::connect( ag, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject* ) ) ); + MetaDataBase::addEntry( i->actionGroup() ); + MetaDataBase::setPropertyChanged( i->actionGroup(), "usesDropDown", TRUE ); + TQString n = "ActionGroup"; + formWindow->unify( i->action(), n, TRUE ); + i->setText( 0, n ); + i->actionGroup()->setName( n ); + i->actionGroup()->setText( i->actionGroup()->name() ); + MetaDataBase::setPropertyChanged( i->actionGroup(), "text", TRUE ); + MetaDataBase::setPropertyChanged( i->actionGroup(), "name", TRUE ); + listActions->setCurrentItem( i ); + i->setOpen( TRUE ); + if ( !actionParent ) + formWindow->actionList().append( i->actionGroup() ); + if ( formWindow->formFile() ) + formWindow->formFile()->setModified( TRUE ); +} + +void ActionEditor::newDropDownActionGroup() +{ + newActionGroup(); + ( (ActionItem*)listActions->currentItem() )->actionGroup()->setUsesDropDown( TRUE ); +} + +void ActionEditor::setFormWindow( FormWindow *fw ) +{ + listActions->clear(); + formWindow = fw; + if ( !formWindow || + !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) { + setEnabled( FALSE ); + } else { + setEnabled( TRUE ); + for ( TQAction *a = formWindow->actionList().first(); a; a = formWindow->actionList().next() ) { + ActionItem *i = 0; + if ( ::tqqt_cast<TQAction*>(a->parent()) ) + continue; + i = new ActionItem( listActions, a ); + i->setText( 0, a->name() ); + i->setPixmap( 0, a->iconSet().pixmap() ); + // make sure we don't duplicate the connection + TQObject::disconnect( a, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject * ) ) ); + TQObject::connect( a, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject* ) ) ); + if ( ::tqqt_cast<TQActionGroup*>(a) ) { + insertChildActions( i ); + } + } + if ( listActions->firstChild() ) { + listActions->setCurrentItem( listActions->firstChild() ); + listActions->setSelected( listActions->firstChild(), TRUE ); + } + } +} + +void ActionEditor::insertChildActions( ActionItem *i ) +{ + TQObjectList clo = i->actionGroup()->childrenListObject(); + if ( !i->actionGroup() || clo.isEmpty() ) + return; + TQObjectListIt it( clo ); + while ( it.current() ) { + TQObject *o = it.current(); + ++it; + if ( !::tqqt_cast<TQAction*>(o) ) + continue; + TQAction *a = (TQAction*)o; + ActionItem *i2 = new ActionItem( (TQListViewItem*)i, a ); + i->setOpen( TRUE ); + i2->setText( 0, a->name() ); + i2->setPixmap( 0, a->iconSet().pixmap() ); + // make sure we don't duplicate the connection + TQObject::disconnect( o, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject * ) ) ); + TQObject::connect( o, TQT_SIGNAL( destroyed( TQObject * ) ), + this, TQT_SLOT( removeConnections( TQObject * ) ) ); + if ( ::tqqt_cast<TQActionGroup*>(a) ) + insertChildActions( i2 ); + } +} + +void ActionEditor::updateActionName( TQAction *a ) +{ + TQListViewItemIterator it( listActions ); + while ( it.current() ) { + if ( ( (ActionItem*)it.current() )->action() == a ) + ( (ActionItem*)it.current() )->setText( 0, a->name() ); + else if ( ( (ActionItem*)it.current() )->actionGroup() == a ) + ( (ActionItem*)it.current() )->setText( 0, a->name() ); + ++it; + } +} + +void ActionEditor::updateActionIcon( TQAction *a ) +{ + TQListViewItemIterator it( listActions ); + while ( it.current() ) { + if ( ( (ActionItem*)it.current() )->action() == a ) + ( (ActionItem*)it.current() )->setPixmap( 0, a->iconSet().pixmap() ); + else if ( ( (ActionItem*)it.current() )->actionGroup() == a ) + ( (ActionItem*)it.current() )->setPixmap( 0, a->iconSet().pixmap() ); + ++it; + } +} + +void ActionEditor::connectionsClicked() +{ + ConnectionDialog dlg( formWindow->mainWindow() ); + dlg.setDefault( TQT_TQOBJECT(currentAction), TQT_TQOBJECT(formWindow) ); + dlg.addConnection(); + dlg.exec(); +} + +void ActionEditor::removeConnections( TQObject *o ) +{ + TQValueList<MetaDataBase::Connection> conns = + MetaDataBase::connections( TQT_TQOBJECT(formWindow), o ); + for ( TQValueList<MetaDataBase::Connection>::Iterator it2 = conns.begin(); + it2 != conns.end(); ++it2 ) + MetaDataBase::removeConnection( TQT_TQOBJECT(formWindow), (*it2).sender, (*it2).signal, + (*it2).receiver, (*it2).slot ); +} diff --git a/kdevdesigner/designer/actioneditorimpl.h b/kdevdesigner/designer/actioneditorimpl.h new file mode 100644 index 00000000..9e67ed9a --- /dev/null +++ b/kdevdesigner/designer/actioneditorimpl.h @@ -0,0 +1,82 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACTIONEDITORIMPL_H +#define ACTIONEDITORIMPL_H + +#include <tqlistview.h> + +#include "actioneditor.h" + +class TQAction; +class FormWindow; +class ActionItem; + +class ActionEditor : public ActionEditorBase +{ + Q_OBJECT + + +public: + ActionEditor( TQWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + void setFormWindow( FormWindow *fw ); + void updateActionName( TQAction *a ); + void updateActionIcon( TQAction *a ); + FormWindow *form() const { return formWindow; } + + bool wantToBeShown() const { return !explicitlyClosed; } + void setWantToBeShown( bool b ) { explicitlyClosed = !b; } + + void setCurrentAction( TQAction *a ); + TQAction *newActionEx(); + +protected: + void closeEvent( TQCloseEvent *e ); + +protected slots: + void currentActionChanged( TQListViewItem * ); + void deleteAction(); + void newAction(); + void newActionGroup(); + void newDropDownActionGroup(); + void connectionsClicked(); + void removeConnections( TQObject *o ); + +signals: + void hidden(); + void removing( TQAction * ); + +private: + void insertChildActions( ActionItem *i ); + +private: + TQAction *currentAction; + FormWindow *formWindow; + bool explicitlyClosed; + +}; + +#endif // ACTIONEDITORIMPL_H diff --git a/kdevdesigner/designer/actionlistview.cpp b/kdevdesigner/designer/actionlistview.cpp new file mode 100644 index 00000000..3e8c95c2 --- /dev/null +++ b/kdevdesigner/designer/actionlistview.cpp @@ -0,0 +1,110 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "actiondnd.h" +#include "actionlistview.h" +#include <tqheader.h> + +#include <tdelocale.h> + +ActionListView::ActionListView( TQWidget *parent, const char *name ) + : TQListView( parent, name ) +{ + setShowSortIndicator( TRUE ); + setResizeMode( LastColumn ); + setRootIsDecorated( TRUE ); + connect( this, TQT_SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint &, int ) ), + this, TQT_SLOT( rmbMenu( TQListViewItem *, const TQPoint & ) ) ); +} + +ActionItem::ActionItem( TQListView *lv, TQAction *ac ) + : TQListViewItem( lv ), a( 0 ), g( 0 ) +{ + g = ::tqqt_cast<QDesignerActionGroup*>(ac); + if ( !g ) + a = ::tqqt_cast<QDesignerAction*>(ac); + setDragEnabled( TRUE ); +} + +ActionItem::ActionItem( TQListViewItem *i, TQAction *ac ) + : TQListViewItem( i ), a( 0 ), g( 0 ) +{ + g = ::tqqt_cast<QDesignerActionGroup*>(ac); + if ( !g ) + a = ::tqqt_cast<QDesignerAction*>(ac); + setDragEnabled( TRUE ); + moveToEnd(); +} + +void ActionItem::moveToEnd() +{ + TQListViewItem *i = this; + while ( i->nextSibling() ) + i = i->nextSibling(); + if ( i != this ) + moveItem( i ); +} + +TQDragObject *ActionListView::dragObject() +{ + ActionItem *i = (ActionItem*)currentItem(); + if ( !i ) + return 0; + TQStoredDrag *drag = 0; + if ( i->action() ) { + drag = new ActionDrag( i->action(), viewport() ); + drag->setPixmap( i->action()->iconSet().pixmap() ); + } else { + drag = new ActionDrag( i->actionGroup(), viewport() ); + drag->setPixmap( i->actionGroup()->iconSet().pixmap() ); + } + return drag; +} + +void ActionListView::rmbMenu( TQListViewItem *i, const TQPoint &p ) +{ + TQPopupMenu *popup = new TQPopupMenu( this ); + popup->insertItem( i18n( "New &Action" ), 0 ); + popup->insertItem( i18n( "New Action &Group" ), 1 ); + popup->insertItem( i18n( "New &Dropdown Action Group" ), 2 ); + if ( i ) { + popup->insertSeparator(); + popup->insertItem( i18n( "&Connect Action..." ), 3 ); + popup->insertSeparator(); + popup->insertItem( i18n( "Delete Action" ), 4 ); + } + int res = popup->exec( p ); + if ( res == 0 ) + emit insertAction(); + else if ( res == 1 ) + emit insertActionGroup(); + else if ( res == 2 ) + emit insertDropDownActionGroup(); + else if ( res == 3 ) + emit connectAction(); + else if ( res == 4 ) + emit deleteAction(); +} diff --git a/kdevdesigner/designer/actionlistview.h b/kdevdesigner/designer/actionlistview.h new file mode 100644 index 00000000..047b21bd --- /dev/null +++ b/kdevdesigner/designer/actionlistview.h @@ -0,0 +1,82 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ACTIONLISTVIEW_H +#define ACTIONLISTVIEW_H + +#include <tqlistview.h> +#include "actiondnd.h" + +class ActionItem : public TQListViewItem +{ +public: + ActionItem( TQListView *lv, bool group ) + : TQListViewItem( lv ), + a( group ? 0 : new QDesignerAction( 0 ) ), + g( group ? new QDesignerActionGroup( 0 ) : 0 ) { setDragEnabled( TRUE ); } + ActionItem( TQListView *lv, TQAction *ac ); + ActionItem( TQListViewItem *i, TQAction *ac ); + ActionItem( ActionItem *parent, bool group = FALSE ) + : TQListViewItem( parent ), + a( group ? 0 : new QDesignerAction( parent->actionGroup() ) ), + g( group ? new QDesignerActionGroup( parent->actionGroup() ) : 0 ) { setDragEnabled( TRUE ); moveToEnd(); } + + QDesignerAction *action() const { return a; } + QDesignerActionGroup *actionGroup() const { return g; } + +private: + void moveToEnd(); + +private: + QDesignerAction *a; + QDesignerActionGroup *g; + +}; + +class ActionListView : public TQListView +{ + Q_OBJECT + + +public: + ActionListView( TQWidget *parent = 0, const char *name = 0 ); + +protected: + TQDragObject *dragObject(); + +private slots: + void rmbMenu( TQListViewItem *i, const TQPoint &p ); + +signals: + void insertAction(); + void insertActionGroup(); + void insertDropDownActionGroup(); + void deleteAction(); + void connectAction(); + +}; + +#endif diff --git a/kdevdesigner/designer/asciivalidator.cpp b/kdevdesigner/designer/asciivalidator.cpp new file mode 100644 index 00000000..667b0a61 --- /dev/null +++ b/kdevdesigner/designer/asciivalidator.cpp @@ -0,0 +1,94 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "asciivalidator.h" + +#include <tqstring.h> + +AsciiValidator::AsciiValidator( TQObject * parent, const char *name ) + : TQValidator( parent, name ), functionName( FALSE ) +{ +} + +AsciiValidator::AsciiValidator( bool funcName, TQObject * parent, const char *name ) + : TQValidator( parent, name ), functionName( funcName ) +{ +} + +AsciiValidator::AsciiValidator( const TQString &allow, TQObject * parent, const char *name ) + : TQValidator( parent, name ), functionName( FALSE ), allowedChars( allow ) +{ +} + +AsciiValidator::~AsciiValidator() +{ +} + +TQValidator::State AsciiValidator::validate( TQString &s, int & ) const +{ + bool inParen = FALSE; + bool outParen = FALSE; + if ( !s.isEmpty() && s[0].row() == 0 && s[0].cell() >= '0' && s[0].cell() <= '9' ) + s[0] = '_'; + for ( int i = 0, j = 0; i < (int) s.length(); i++ ) { + uchar r = s[i].row(); + uchar c = s[i].cell(); + + if ( outParen ) { // check if we have 'const' or 'volatile' + static const TQString con = " const"; + static const TQString vol = " volatile"; + TQString mid = s.mid( j ); + if ( !( con.startsWith( mid ) || vol.startsWith( mid ) ) ) + return TQValidator::Invalid; + } + + if ( inParen && c != ')' ) + continue; + + if ( r == 0 && ( ( c >= '0' && c <= '9' ) || + ( c >= 'a' && c <= 'z' ) || + ( c >= 'A' && c <= 'Z' ) ) ) + continue; + + if ( functionName ) { + if ( c == '(' ) { + inParen = TRUE; + continue; + } + if ( c == ')' ) { + outParen = TRUE; + j = i + 1; + continue; + } + } + + if ( allowedChars.find( s[ i ] ) != -1 ) + continue; + + s[i] = '_'; + } + return TQValidator::Acceptable; +} diff --git a/kdevdesigner/designer/asciivalidator.h b/kdevdesigner/designer/asciivalidator.h new file mode 100644 index 00000000..a284f6ab --- /dev/null +++ b/kdevdesigner/designer/asciivalidator.h @@ -0,0 +1,53 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ASCIIVALIDATOR_H +#define ASCIIVALIDATOR_H + + +#include <tqvalidator.h> + + +class AsciiValidator: public TQValidator +{ + Q_OBJECT + +public: + AsciiValidator( TQObject * parent, const char *name = 0 ); + AsciiValidator( bool funcName, TQObject * parent, const char *name = 0 ); + AsciiValidator( const TQString &allow, TQObject * parent, const char *name = 0 ); + ~AsciiValidator(); + + TQValidator::State validate( TQString &, int & ) const; + +private: + bool functionName; + TQString allowedChars; + +}; + + +#endif diff --git a/kdevdesigner/designer/command.cpp b/kdevdesigner/designer/command.cpp new file mode 100644 index 00000000..b9b97827 --- /dev/null +++ b/kdevdesigner/designer/command.cpp @@ -0,0 +1,2475 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "command.h" +#include "formwindow.h" +#include "widgetfactory.h" +#include "propertyeditor.h" +#include "metadatabase.h" +#include <widgetdatabase.h> +#include "mainwindow.h" +#include "hierarchyview.h" +#include "workspace.h" +#include "actioneditorimpl.h" +#include "actiondnd.h" +#include "formfile.h" +#include "../interfaces/languageinterface.h" +#include "menubareditor.h" +#include "popupmenueditor.h" + +#include <tqfeatures.h> +#include <tqwidget.h> +#include <tqmetaobject.h> +#include <tqapplication.h> +#include <tqlayout.h> +#include <tqmessagebox.h> +#include <tqlistbox.h> +#include <tqiconview.h> +#include <tqtextedit.h> +#include <tqptrstack.h> +#include <tqheader.h> +#include <tqsplitter.h> +#ifndef TQT_NO_TABLE +#include <tqtable.h> +#endif +#include <tqaction.h> + +#include "kdevdesigner_part.h" + +#include <tdelocale.h> + +CommandHistory::CommandHistory( int s ) + : current( -1 ), steps( s ), savedAt( -1 ) +{ + history.setAutoDelete( TRUE ); + modified = FALSE; + compressedCommand = 0; +} + +void CommandHistory::addCommand( Command *cmd, bool tryCompress ) +{ + if ( tryCompress ) { + if ( !compressedCommand || + compressedCommand->type() != cmd->type() || + !compressedCommand->canMerge( cmd ) ) { + checkCompressedCommand(); + compressedCommand = 0; + } + + if ( compressedCommand ) { + compressedCommand->merge( cmd ); + modified = TRUE; + modificationChanged( modified ); + return; + } + compressedCommand = cmd; + } else { + checkCompressedCommand(); + } + + if ( current < (int)history.count() - 1 ) { + if ( current < savedAt ) + savedAt = -2; + + TQPtrList<Command> commands; + commands.setAutoDelete( FALSE ); + + for( int i = 0; i <= current; ++i ) { + commands.insert( i, history.at( 0 ) ); + history.take( 0 ); + } + + commands.append( cmd ); + history.clear(); + history = commands; + history.setAutoDelete( TRUE ); + } else { + history.append( cmd ); + } + + if ( (int)history.count() > steps ) { + savedAt--; + history.removeFirst(); + } else { + ++current; + } + + emitUndoRedo(); + modified = TRUE; + modificationChanged( modified ); +} + +void CommandHistory::undo() +{ + checkCompressedCommand(); + compressedCommand = 0; + if ( current > -1 ) { + history.at( current )->unexecute(); + --current; + } + emitUndoRedo(); + modified = savedAt != current; + modificationChanged( modified ); +} + +void CommandHistory::redo() +{ + checkCompressedCommand(); + compressedCommand = 0; + if ( current > -1 ) { + if ( current < (int)history.count() - 1 ) { + ++current; + history.at( current )->execute(); + } + } else { + if ( history.count() > 0 ) { + ++current; + history.at( current )->execute(); + } + } + emitUndoRedo(); + modified = savedAt != current; + modificationChanged( modified ); +} + +void CommandHistory::emitUndoRedo() +{ + Command *undoCmd = 0; + Command *redoCmd = 0; + + if ( current >= 0 && current < (int)history.count() ) + undoCmd = history.at( current ); + if ( current + 1 >= 0 && current + 1 < (int)history.count() ) + redoCmd = history.at( current + 1 ); + + bool ua = (undoCmd != 0); + TQString uc; + if ( ua ) + uc = undoCmd->name(); + bool ra = (redoCmd != 0); + TQString rc; + if ( ra ) + rc = redoCmd->name(); + emit undoRedoChanged( ua, ra, uc, rc ); +} + +void CommandHistory::setModified( bool m ) +{ + modified = m; + if ( !modified ) + savedAt = current; + modificationChanged( modified ); +} + +bool CommandHistory::isModified() const +{ + return modified; +} + +void CommandHistory::checkCompressedCommand() +{ + if ( compressedCommand && compressedCommand->type() == Command::SetProperty ) { + Command *c = compressedCommand; + compressedCommand = 0; + if ( !( (SetPropertyCommand*)c )->checkProperty() ) { + history.remove( current ); + --current; + emitUndoRedo(); + } + } +} + +// ------------------------------------------------------------ + +Command::Command( const TQString &n, FormWindow *fw ) + : cmdName( n ), formWin( fw ) +{ +} + +Command::~Command() +{ +} + +TQString Command::name() const +{ + return cmdName; +} + +FormWindow *Command::formWindow() const +{ + return formWin; +} + +void Command::merge( Command * ) +{ +} + +bool Command::canMerge( Command * ) +{ + return FALSE; +} + +// ------------------------------------------------------------ + +ResizeCommand::ResizeCommand( const TQString &n, FormWindow *fw, + TQWidget *w, const TQRect &oldr, const TQRect &nr ) + : Command( n, fw ), widget( w ), oldRect( oldr ), newRect( nr ) +{ +} + +void ResizeCommand::execute() +{ + widget->setGeometry( newRect ); + formWindow()->updateSelection( widget ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(widget) ); + if ( WidgetFactory::layoutType( widget ) != WidgetFactory::NoLayout ) + formWindow()->updateChildSelections( widget ); +} + +void ResizeCommand::unexecute() +{ + widget->setGeometry( oldRect ); + formWindow()->updateSelection( widget ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(widget) ); + if ( WidgetFactory::layoutType( widget ) != WidgetFactory::NoLayout ) + formWindow()->updateChildSelections( widget ); +} + +// ------------------------------------------------------------ + +InsertCommand::InsertCommand( const TQString &n, FormWindow *fw, + TQWidget *w, const TQRect &g ) + : Command( n, fw ), widget( w ), geometry( g ) +{ +} + +void InsertCommand::execute() +{ + if ( geometry.size() == TQSize( 0, 0 ) ) { + widget->move( geometry.topLeft() ); + widget->adjustSize(); + } else { + TQSize s = geometry.size().expandedTo( widget->minimumSize() ); + s = s.expandedTo( widget->minimumSizeHint() ); + TQRect r( geometry.topLeft(), s ); + widget->setGeometry( r ); + } + widget->show(); + formWindow()->widgets()->insert( widget, widget ); + formWindow()->clearSelection( FALSE ); + formWindow()->selectWidget( TQT_TQOBJECT(widget) ); + formWindow()->mainWindow()->objectHierarchy()->widgetInserted( widget ); +} + +void InsertCommand::unexecute() +{ + widget->hide(); + formWindow()->selectWidget( TQT_TQOBJECT(widget), FALSE ); + formWindow()->widgets()->remove( TQT_TQOBJECT(widget) ); + formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( widget ); + } + +// ------------------------------------------------------------ + +MoveCommand::MoveCommand( const TQString &n, FormWindow *fw, + const TQWidgetList &w, + const TQValueList<TQPoint> op, + const TQValueList<TQPoint> np, + TQWidget *opr, TQWidget *npr ) + : Command( n, fw ), widgets( w ), oldPos( op ), newPos( np ), + oldParent( opr ), newParent( npr ) +{ + widgets.setAutoDelete( FALSE ); +} + +void MoveCommand::merge( Command *c ) +{ + MoveCommand *cmd = (MoveCommand*)c; + newPos = cmd->newPos; +} + +bool MoveCommand::canMerge( Command *c ) +{ + MoveCommand *cmd = (MoveCommand*)c; + return widgets == cmd->widgets; +} + + +void MoveCommand::execute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) { + if ( newParent && oldParent && newParent != oldParent ) { + TQPoint pos = newParent->mapFromGlobal( w->mapToGlobal( TQPoint( 0,0 ) ) ); + w->reparent( newParent, pos, TRUE ); + formWindow()->raiseSelection( w ); + formWindow()->raiseChildSelections( w ); + formWindow()->widgetChanged( TQT_TQOBJECT(w) ); + formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( w ); + formWindow()->mainWindow()->objectHierarchy()->widgetInserted( w ); + } + w->move( newPos[ widgets.at() ] ); + } + formWindow()->updateSelection( w ); + formWindow()->updateChildSelections( w ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(w) ); + } +} + +void MoveCommand::unexecute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) { + if ( newParent && oldParent && newParent != oldParent ) { + TQPoint pos = oldParent->mapFromGlobal( w->mapToGlobal( TQPoint( 0,0 ) ) ); + w->reparent( oldParent, pos, TRUE ); + formWindow()->raiseSelection( w ); + formWindow()->raiseChildSelections( w ); + formWindow()->widgetChanged( TQT_TQOBJECT(w) ); + formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( w ); + formWindow()->mainWindow()->objectHierarchy()->widgetInserted( w ); + } + w->move( oldPos[ widgets.at() ] ); + } + formWindow()->updateSelection( w ); + formWindow()->updateChildSelections( w ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(w) ); + } +} + +// ------------------------------------------------------------ + +DeleteCommand::DeleteCommand( const TQString &n, FormWindow *fw, + const TQWidgetList &wl ) + : Command( n, fw ), widgets( wl ) +{ + widgets.setAutoDelete( FALSE ); + TQWidgetList copyOfWidgets = widgets; + copyOfWidgets.setAutoDelete(FALSE); + + // Include the children of the selected items when deleting + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + TQObjectList *children = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + for ( TQWidget *c = (TQWidget *)children->first(); c; c = (TQWidget *)children->next() ) { + if ( copyOfWidgets.find( c ) == -1 && formWindow()->widgets()->find( c ) ) { + widgets.insert(widgets.at() + 1, c); + widgets.prev(); + copyOfWidgets.append(c); + } + } + delete children; + } +} + +void DeleteCommand::execute() +{ + formWindow()->setPropertyShowingBlocked( TRUE ); + connections.clear(); + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->hide(); + TQString s = w->name(); + s.prepend( "qt_dead_widget_" ); + w->setName( s ); + formWindow()->selectWidget( TQT_TQOBJECT(w), FALSE ); + formWindow()->widgets()->remove( w ); + TQValueList<MetaDataBase::Connection> conns = MetaDataBase::connections( TQT_TQOBJECT(formWindow()), TQT_TQOBJECT(w) ); + connections.insert( w, conns ); + TQValueList<MetaDataBase::Connection>::Iterator it = conns.begin(); + for ( ; it != conns.end(); ++it ) { + MetaDataBase::removeConnection( TQT_TQOBJECT(formWindow()), (*it).sender, + (*it).signal, (*it).receiver, (*it).slot ); + } + } + formWindow()->setPropertyShowingBlocked( FALSE ); + formWindow()->emitShowProperties(); + formWindow()->mainWindow()->objectHierarchy()->widgetsRemoved( widgets ); + +} + +void DeleteCommand::unexecute() +{ + formWindow()->setPropertyShowingBlocked( TRUE ); + formWindow()->clearSelection( FALSE ); + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->show(); + TQString s = w->name(); + s.remove( 0, TQString( "qt_dead_widget_" ).length() ); + w->setName( s ); + formWindow()->widgets()->insert( w, w ); + formWindow()->selectWidget( TQT_TQOBJECT(w) ); + TQValueList<MetaDataBase::Connection> conns = *connections.find( w ); + TQValueList<MetaDataBase::Connection>::Iterator it = conns.begin(); + for ( ; it != conns.end(); ++it ) { + MetaDataBase::addConnection( TQT_TQOBJECT(formWindow()), (*it).sender, + (*it).signal, (*it).receiver, (*it).slot ); + } + } + formWindow()->setPropertyShowingBlocked( FALSE ); + formWindow()->emitShowProperties(); + formWindow()->mainWindow()->objectHierarchy()->widgetsInserted( widgets ); +} + +// ------------------------------------------------------------ + +SetPropertyCommand::SetPropertyCommand( const TQString &n, FormWindow *fw, + TQObject *w, PropertyEditor *e, + const TQString &pn, const TQVariant &ov, + const TQVariant &nv, const TQString &ncut, + const TQString &ocut, bool reset ) + : Command( n, fw ), widget( w ), editor( e ), propName( pn ), + oldValue( ov ), newValue( nv ), oldCurrentItemText( ocut ), newCurrentItemText( ncut ), + wasChanged( TRUE ), isResetCommand( reset ) +{ + wasChanged = MetaDataBase::isPropertyChanged( w, propName ); + if ( oldCurrentItemText.isNull() ) + oldCurrentItemText = ""; + if ( newCurrentItemText.isNull() ) + newCurrentItemText = ""; +} + + +void SetPropertyCommand::execute() +{ + if ( !wasChanged ) + MetaDataBase::setPropertyChanged( widget, propName, TRUE ); + if ( isResetCommand ) { + MetaDataBase::setPropertyChanged( widget, propName, FALSE ); + if ( WidgetFactory::resetProperty( widget, propName ) ) { + if ( !formWindow()->isWidgetSelected( widget ) && TQT_TQOBJECT(formWindow()) != TQT_TQOBJECT(widget) ) + formWindow()->selectWidget( TQT_TQOBJECT(widget) ); + if ( editor->widget() != widget ) + editor->setWidget( widget, formWindow() ); + editor->propertyList()->setCurrentProperty( propName ); + PropertyItem *i = (PropertyItem*)editor->propertyList()->currentItem(); + if ( !i ) + return; + i->setValue( widget->property( propName ) ); + i->setChanged( FALSE ); + editor->refetchData(); + editor->emitWidgetChanged(); + return; + } + } + setProperty( newValue, newCurrentItemText ); +} + +void SetPropertyCommand::unexecute() +{ + if ( !wasChanged ) + MetaDataBase::setPropertyChanged( widget, propName, FALSE ); + if ( isResetCommand ) + MetaDataBase::setPropertyChanged( widget, propName, TRUE ); + setProperty( oldValue, oldCurrentItemText ); +} + +bool SetPropertyCommand::canMerge( Command *c ) +{ + SetPropertyCommand *cmd = (SetPropertyCommand*)c; + if ( !widget ) + return FALSE; + const TQMetaProperty *p = + widget->metaObject()->property( widget->metaObject()->findProperty( propName, TRUE ), TRUE ); + if ( !p ) { + if ( propName == "toolTip" || propName == "whatsThis" ) + return TRUE; + if ( ::tqqt_cast<CustomWidget*>((TQObject *)widget) ) { + MetaDataBase::CustomWidget *cw = ((CustomWidget*)(TQObject*)widget)->customWidget(); + if ( !cw ) + return FALSE; + for ( TQValueList<MetaDataBase::Property>::Iterator it = cw->lstProperties.begin(); it != cw->lstProperties.end(); ++it ) { + if ( TQString( (*it ).property ) == propName ) { + if ( (*it).type == "String" || (*it).type == "CString" || (*it).type == "Int" || (*it).type == "UInt" ) + return TRUE; + } + } + } + return FALSE; + } + TQVariant::Type t = TQVariant::nameToType( p->type() ); + return ( cmd->propName == propName && + t == TQVariant::String || t == TQVariant::CString || t == TQVariant::Int || t == TQVariant::UInt ); +} + +void SetPropertyCommand::merge( Command *c ) +{ + SetPropertyCommand *cmd = (SetPropertyCommand*)c; + newValue = cmd->newValue; + newCurrentItemText = cmd->newCurrentItemText; +} + +bool SetPropertyCommand::checkProperty() +{ + if ( propName == "name" /*|| propName == "itemName"*/ ) { // ### fix that + TQString s = newValue.toString(); + if ( !formWindow()->unify( widget, s, FALSE ) ) { + TQMessageBox::information( formWindow()->mainWindow(), + i18n( "Set 'name' Property" ), + i18n( "The name of a widget must be unique.\n" + "'%1' is already used in form '%2',\n" + "so the name has been reverted to '%3'." ). + arg( newValue.toString() ). + arg( formWindow()->name() ). + arg( oldValue.toString() )); + setProperty( oldValue, oldCurrentItemText, FALSE ); + return FALSE; + } + if ( s.isEmpty() ) { + TQMessageBox::information( formWindow()->mainWindow(), + i18n( "Set 'name' Property" ), + i18n( "The name of a widget must not be null.\n" + "The name has been reverted to '%1'." ). + arg( oldValue.toString() )); + setProperty( oldValue, oldCurrentItemText, FALSE ); + return FALSE; + } + + if ( ::tqqt_cast<FormWindow*>(widget->parent()) ) + formWindow()->mainWindow()->formNameChanged( (FormWindow*)((TQWidget*)(TQObject*)widget)->parentWidget() ); + } + return TRUE; +} + +void SetPropertyCommand::setProperty( const TQVariant &v, const TQString ¤tItemText, bool select ) +{ + if ( !widget ) + return; + + if ( !formWindow()->isWidgetSelected( widget ) && !formWindow()->isMainContainer( widget ) && select ) + formWindow()->selectWidget( TQT_TQOBJECT(widget) ); + if ( editor->widget() != widget && select ) + editor->setWidget( widget, formWindow() ); + if ( select ) + editor->propertyList()->setCurrentProperty( propName ); + const TQMetaProperty *p = + widget->metaObject()->property( widget->metaObject()->findProperty( propName, TRUE ), TRUE ); + if ( !p ) { + if ( propName == "hAlign" ) { + p = widget->metaObject()->property( widget->metaObject()->findProperty( "alignment", TRUE ), TRUE ); + int align = widget->property( "alignment" ).toInt(); + align &= ~( AlignHorizontal_Mask ); + align |= p->keyToValue( currentItemText ); + widget->setProperty( "alignment", TQVariant( align ) ); + } else if ( propName == "vAlign" ) { + p = widget->metaObject()->property( widget->metaObject()->findProperty( "alignment", TRUE ), TRUE ); + int align = widget->property( "alignment" ).toInt(); + align &= ~( AlignVertical_Mask ); + align |= p->keyToValue( currentItemText ); + widget->setProperty( "alignment", TQVariant( align ) ); + } else if ( propName == "wordwrap" ) { + int align = widget->property( "alignment" ).toInt(); + align &= ~WordBreak; + if ( v.toBool() ) + align |= WordBreak; + widget->setProperty( "alignment", TQVariant( align ) ); + } else if ( propName == "layoutSpacing" ) { + TQVariant val = v; + if ( val.toString() == "default" ) + val = -1; + MetaDataBase::setSpacing( TQT_TQOBJECT(WidgetFactory::containerOfWidget( TQT_TQWIDGET(editor->widget()) )), val.toInt() ); + } else if ( propName == "layoutMargin" ) { + TQVariant val = v; + if ( val.toString() == "default" ) + val = -1; + MetaDataBase::setMargin( TQT_TQOBJECT(WidgetFactory::containerOfWidget( TQT_TQWIDGET(editor->widget()) )), val.toInt() ); + } else if ( propName == "resizeMode" ) { + MetaDataBase::setResizeMode( TQT_TQOBJECT(WidgetFactory::containerOfWidget( TQT_TQWIDGET(editor->widget()) )), currentItemText ); + } else if ( propName == "toolTip" || propName == "whatsThis" || propName == "database" || propName == "frameworkCode" ) { + MetaDataBase::setFakeProperty( editor->widget(), propName, v ); + } else if ( ::tqqt_cast<CustomWidget*>(editor->widget()) ) { + MetaDataBase::CustomWidget *cw = ((CustomWidget *)(TQObject *)widget)->customWidget(); + if ( cw ) { + MetaDataBase::setFakeProperty( editor->widget(), propName, v ); + } + } + editor->refetchData(); + editor->emitWidgetChanged(); + ( ( PropertyItem* )editor->propertyList()->currentItem() )->setChanged( MetaDataBase::isPropertyChanged( widget, propName ) ); +#ifndef TQT_NO_SQL + if ( propName == "database" ) { + formWindow()->mainWindow()->objectHierarchy()->databasePropertyChanged( (TQWidget*)((TQObject *)widget), MetaDataBase::fakeProperty( widget, "database" ).toStringList() ); + } +#endif + return; + } + + if ( p->isSetType() ) { + TQStrList strlst; + TQStringList lst = TQStringList::split( "|", currentItemText ); + TQValueListConstIterator<TQString> it = lst.begin(); + for ( ; it != lst.end(); ++it ) + strlst.append( (*it).latin1() ); + widget->setProperty( propName, p->keysToValue( strlst ) ); + } else if ( p->isEnumType() ) { + widget->setProperty( propName, p->keyToValue( currentItemText ) ); + } else if ( qstrcmp( p->name(), "buddy" ) == 0 ) { + widget->setProperty( propName, currentItemText ); + } else { + TQVariant ov; + if ( propName == "name" || propName == "itemName" ) + ov = widget->property( propName ); + int oldSerNum = -1; + if ( v.type() == TQVariant::Pixmap ) + oldSerNum = v.toPixmap().serialNumber(); + widget->setProperty( propName, v ); + if ( oldSerNum != -1 && oldSerNum != widget->property( propName ).toPixmap().serialNumber() ) + MetaDataBase::setPixmapKey( TQT_TQOBJECT(formWindow()), + widget->property( propName ).toPixmap().serialNumber(), + MetaDataBase::pixmapKey( TQT_TQOBJECT(formWindow()), oldSerNum ) ); + if ( propName == "cursor" ) { + MetaDataBase::setCursor( (TQWidget*)((TQObject *)widget), v.toCursor() ); + } + if ( propName == "name" && widget->isWidgetType() ) { + formWindow()->mainWindow()->objectHierarchy()->namePropertyChanged( ((TQWidget*)(TQObject *)widget), ov ); + if ( formWindow()->isMainContainer( widget ) ) + formWindow()->setName( v.toCString() ); + } + if ( propName == "name" && ::tqqt_cast<TQAction*>((TQObject *)widget) && ::tqqt_cast<TQMainWindow*>(formWindow()->mainContainer()) ) { + formWindow()->mainWindow()->actioneditor()->updateActionName( (TQAction*)(TQObject *)widget ); + } + if ( propName == "iconSet" && ::tqqt_cast<TQAction*>((TQObject *)widget) && ::tqqt_cast<TQMainWindow*>(formWindow()->mainContainer()) ) { + formWindow()->mainWindow()->actioneditor()->updateActionIcon( (TQAction*)(TQObject *)widget ); + } + if ( propName == "caption" ) { + if ( formWindow()->isMainContainer( widget ) ) + formWindow()->setCaption( v.toString() ); + } + if ( propName == "icon" ) { + if ( formWindow()->isMainContainer( widget ) ) + formWindow()->setIcon( v.toPixmap() ); + } + } + editor->refetchData(); + if ( editor->propertyList()->currentItem() && select ) { + ( ( PropertyItem* )editor->propertyList()->currentItem() )->showEditor(); + ( ( PropertyItem* )editor->propertyList()->currentItem() )->setChanged( MetaDataBase::isPropertyChanged( widget, propName ) ); + } + editor->emitWidgetChanged(); + formWindow()->killAccels( TQT_TQOBJECT(widget) ); +} + +// ------------------------------------------------------------ + +LayoutHorizontalCommand::LayoutHorizontalCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ) + : Command( n, fw ), layout( wl, parent, fw, layoutBase ) +{ +} + +void LayoutHorizontalCommand::execute() +{ + formWindow()->clearSelection( FALSE ); + layout.doLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void LayoutHorizontalCommand::unexecute() +{ + formWindow()->clearSelection( FALSE ); + layout.undoLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +LayoutHorizontalSplitCommand::LayoutHorizontalSplitCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ) + : Command( n, fw ), layout( wl, parent, fw, layoutBase, TRUE, TRUE ) +{ +} + +void LayoutHorizontalSplitCommand::execute() +{ + formWindow()->clearSelection( FALSE ); + layout.doLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void LayoutHorizontalSplitCommand::unexecute() +{ + formWindow()->clearSelection( FALSE ); + layout.undoLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +LayoutVerticalCommand::LayoutVerticalCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ) + : Command( n, fw ), layout( wl, parent, fw, layoutBase ) +{ +} + +void LayoutVerticalCommand::execute() +{ + formWindow()->clearSelection( FALSE ); + layout.doLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void LayoutVerticalCommand::unexecute() +{ + formWindow()->clearSelection( FALSE ); + layout.undoLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +LayoutVerticalSplitCommand::LayoutVerticalSplitCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ) + : Command( n, fw ), layout( wl, parent, fw, layoutBase, TRUE, TRUE ) +{ +} + +void LayoutVerticalSplitCommand::execute() +{ + formWindow()->clearSelection( FALSE ); + layout.doLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void LayoutVerticalSplitCommand::unexecute() +{ + formWindow()->clearSelection( FALSE ); + layout.undoLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +LayoutGridCommand::LayoutGridCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl, int xres, int yres ) + : Command( n, fw ), layout( wl, parent, fw, layoutBase, TQSize( TQMAX(5,xres), TQMAX(5,yres) ) ) +{ +} + +void LayoutGridCommand::execute() +{ + formWindow()->clearSelection( FALSE ); + layout.doLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void LayoutGridCommand::unexecute() +{ + formWindow()->clearSelection( FALSE ); + layout.undoLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +BreakLayoutCommand::BreakLayoutCommand( const TQString &n, FormWindow *fw, + TQWidget *layoutBase, const TQWidgetList &wl ) + : Command( n, fw ), lb( layoutBase ), widgets( wl ) +{ + WidgetFactory::LayoutType lay = WidgetFactory::layoutType( layoutBase ); + spacing = MetaDataBase::spacing( TQT_TQOBJECT(layoutBase) ); + margin = MetaDataBase::margin( TQT_TQOBJECT(layoutBase) ); + layout = 0; + if ( lay == WidgetFactory::HBox ) + layout = new HorizontalLayout( wl, layoutBase, fw, layoutBase, FALSE, ::tqqt_cast<TQSplitter*>(layoutBase) != 0 ); + else if ( lay == WidgetFactory::VBox ) + layout = new VerticalLayout( wl, layoutBase, fw, layoutBase, FALSE, ::tqqt_cast<TQSplitter*>(layoutBase) != 0 ); + else if ( lay == WidgetFactory::Grid ) + layout = new GridLayout( wl, layoutBase, fw, layoutBase, TQSize( TQMAX( 5, fw->grid().x()), TQMAX( 5, fw->grid().y()) ), FALSE ); +} + +void BreakLayoutCommand::execute() +{ + if ( !layout ) + return; + formWindow()->clearSelection( FALSE ); + layout->breakLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) + w->resize( TQMAX( 16, w->width() ), TQMAX( 16, w->height() ) ); +} + +void BreakLayoutCommand::unexecute() +{ + if ( !layout ) + return; + formWindow()->clearSelection( FALSE ); + layout->doLayout(); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); + MetaDataBase::setSpacing( TQT_TQOBJECT(WidgetFactory::containerOfWidget( lb )), spacing ); + MetaDataBase::setMargin( TQT_TQOBJECT(WidgetFactory::containerOfWidget( lb )), margin ); +} + +// ------------------------------------------------------------ + +MacroCommand::MacroCommand( const TQString &n, FormWindow *fw, + const TQPtrList<Command> &cmds ) + : Command( n, fw ), commands( cmds ) +{ +} + +void MacroCommand::execute() +{ + for ( Command *c = commands.first(); c; c = commands.next() ) + c->execute(); +} + +void MacroCommand::unexecute() +{ + for ( Command *c = commands.last(); c; c = commands.prev() ) + c->unexecute(); +} + +// ------------------------------------------------------------ + +AddTabPageCommand::AddTabPageCommand( const TQString &n, FormWindow *fw, + TQTabWidget *tw, const TQString &label ) + : Command( n, fw ), tabWidget( tw ), tabLabel( label ) +{ + tabPage = new QDesignerWidget( formWindow(), tabWidget, "TabPage" ); + tabPage->hide(); + index = -1; + MetaDataBase::addEntry( TQT_TQOBJECT(tabPage) ); +} + +void AddTabPageCommand::execute() +{ + if ( index == -1 ) + index = ( (QDesignerTabWidget*)tabWidget )->count(); + tabWidget->insertTab( tabPage, tabLabel, index ); + tabWidget->showPage( tabPage ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget ); +} + +void AddTabPageCommand::unexecute() +{ + tabWidget->removePage( tabPage ); + tabPage->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget ); +} + +// ------------------------------------------------------------ + +MoveTabPageCommand::MoveTabPageCommand( const TQString &n, FormWindow *fw, + TQTabWidget *tw, TQWidget* page, const TQString& label, int nIndex, int oIndex ) + : Command( n, fw ), tabWidget( tw ), tabPage( page ), tabLabel( label ) +{ + newIndex = nIndex; + oldIndex = oIndex; +} + +void MoveTabPageCommand::execute() +{ + ((QDesignerTabWidget*)tabWidget )->removePage( tabPage ); + ((QDesignerTabWidget*)tabWidget )->insertTab( tabPage, tabLabel, newIndex ); + ((QDesignerTabWidget*)tabWidget )->showPage( tabPage ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget ); +} + +void MoveTabPageCommand::unexecute() +{ + ((QDesignerTabWidget*)tabWidget )->removePage( tabPage ); + ((QDesignerTabWidget*)tabWidget )->insertTab( tabPage, tabLabel, oldIndex ); + ((QDesignerTabWidget*)tabWidget )->showPage( tabPage ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget ); +} + +// ------------------------------------------------------------ + +DeleteTabPageCommand::DeleteTabPageCommand( const TQString &n, FormWindow *fw, + TQTabWidget *tw, TQWidget *page ) + : Command( n, fw ), tabWidget( tw ), tabPage( page ) +{ + tabLabel = ( (QDesignerTabWidget*)tabWidget )->pageTitle(); + index = ( (QDesignerTabWidget*)tabWidget )->currentPage(); +} + +void DeleteTabPageCommand::execute() +{ + tabWidget->removePage( tabPage ); + tabPage->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget ); +} + +void DeleteTabPageCommand::unexecute() +{ + tabWidget->insertTab( tabPage, tabLabel, index ); + tabWidget->showPage( tabPage ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget ); +} + +// ------------------------------------------------------------ + +AddWidgetStackPageCommand::AddWidgetStackPageCommand( const TQString &n, FormWindow *fw, + QDesignerWidgetStack *ws ) + : Command( n, fw ), widgetStack( ws ) +{ + stackPage = new QDesignerWidget( formWindow(), widgetStack, "WStackPage" ); + stackPage->hide(); + index = -1; + MetaDataBase::addEntry( TQT_TQOBJECT(stackPage) ); +} + +void AddWidgetStackPageCommand::execute() +{ + index = widgetStack->insertPage( stackPage, index ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( 0 ); +} + +void AddWidgetStackPageCommand::unexecute() +{ + index = widgetStack->removePage( stackPage ); + stackPage->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->tabsChanged( 0 ); +} + +DeleteWidgetStackPageCommand::DeleteWidgetStackPageCommand( const TQString &n, FormWindow *fw, + QDesignerWidgetStack *ws, TQWidget *page ) + : Command( n, fw), widgetStack( ws ), stackPage( page ) +{ + index = -1; +} + +void DeleteWidgetStackPageCommand::execute() +{ + index = widgetStack->removePage( stackPage ); + stackPage->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( stackPage ); +} + +void DeleteWidgetStackPageCommand::unexecute() +{ + index = widgetStack->insertPage( stackPage, index ); + widgetStack->raiseWidget( stackPage ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->widgetInserted( stackPage ); +} + +// ------------------------------------------------------------ + +AddWizardPageCommand::AddWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, const TQString &label, int i, bool s ) + : Command( n, fw ), wizard( w ), pageLabel( label ) +{ + page = new QDesignerWidget( formWindow(), wizard, "WizardPage" ); + page->hide(); + index = i; + show = s; + MetaDataBase::addEntry( TQT_TQOBJECT(page) ); +} + +void AddWizardPageCommand::execute() +{ + if ( index == -1 ) + index = wizard->pageCount(); + wizard->insertPage( page, pageLabel, index ); + if ( show ) + ( (QDesignerWizard*)wizard )->setCurrentPage( ( (QDesignerWizard*)wizard )->pageNum( page ) ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +void AddWizardPageCommand::unexecute() +{ + wizard->removePage( page ); + page->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +// ------------------------------------------------------------ + +DeleteWizardPageCommand::DeleteWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, int i, bool s ) + : Command( n, fw ), wizard( w ), index( i ) +{ + show = s; +} + +void DeleteWizardPageCommand::execute() +{ + page = wizard->page( index ); + pageLabel = wizard->title( page ); + wizard->removePage( page ); + page->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +void DeleteWizardPageCommand::unexecute() +{ + wizard->insertPage( page, pageLabel, index ); + if ( show ) + ( (QDesignerWizard*)wizard )->setCurrentPage( ( (QDesignerWizard*)wizard )->pageNum( page ) ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +// ------------------------------------------------------------ + +RenameWizardPageCommand::RenameWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, int i, const TQString& name ) + : Command( n, fw ), wizard( w ), index( i ), label( name ) +{ + +} + +void RenameWizardPageCommand::execute() +{ + page = wizard->page( index ); + TQString oldLabel = wizard->title( page ); + + wizard->setTitle( page, label ); + label = oldLabel; + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); +} + +void RenameWizardPageCommand::unexecute() +{ + execute(); +} + +// ------------------------------------------------------------ + +SwapWizardPagesCommand::SwapWizardPagesCommand( const TQString &n, FormWindow *fw, TQWizard *w, int i1, int i2 ) + : Command( n, fw ), wizard( w ), index1( i1 ), index2( i2 ) +{ +} + +void SwapWizardPagesCommand::execute() +{ + TQWidget *page1 = wizard->page( index1 ); + TQWidget *page2 = wizard->page( index2 ); + TQString page1Label = wizard->title( page1 ); + TQString page2Label = wizard->title( page2 ); + wizard->removePage( page1 ); + wizard->removePage( page2 ); + wizard->insertPage( page1, page1Label, index2 ); + wizard->insertPage( page2, page2Label, index1 ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +void SwapWizardPagesCommand::unexecute() +{ + execute(); +} + +// ------------------------------------------------------------ + +MoveWizardPageCommand::MoveWizardPageCommand( const TQString &n, FormWindow *fw, TQWizard *w, int i1, int i2 ) + : Command( n, fw ), wizard( w ), index1( i1 ), index2( i2 ) +{ +} + +void MoveWizardPageCommand::execute() +{ + TQWidget *page = wizard->page( index1 ); + TQString pageLabel = wizard->title( page ); + wizard->removePage( page ); + wizard->insertPage( page, pageLabel, index2 ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +void MoveWizardPageCommand::unexecute() +{ + // ###FIX: index1 may be the wrong place + TQWidget *page = wizard->page( index2 ); + TQString pageLabel = wizard->title( page ); + wizard->removePage( page ); + wizard->insertPage( page, pageLabel, index1 ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard ); +} + +// ------------------------------------------------------------ + +AddConnectionCommand::AddConnectionCommand( const TQString &name, FormWindow *fw, + MetaDataBase::Connection c ) + : Command( name, fw ), connection( c ) +{ +} + +void AddConnectionCommand::execute() +{ + MetaDataBase::addConnection( TQT_TQOBJECT(formWindow()), connection.sender, + connection.signal, connection.receiver, connection.slot ); + if ( TQT_BASE_OBJECT(connection.receiver) == TQT_BASE_OBJECT(formWindow()->mainContainer()) ) + formWindow()->mainWindow()->propertyeditor()->eventList()->setup(); +} + +void AddConnectionCommand::unexecute() +{ + MetaDataBase::removeConnection( TQT_TQOBJECT(formWindow()), connection.sender, + connection.signal, connection.receiver, connection.slot ); + if ( TQT_BASE_OBJECT(connection.receiver) == TQT_BASE_OBJECT(formWindow()->mainContainer()) ) + formWindow()->mainWindow()->propertyeditor()->eventList()->setup(); +} + +// ------------------------------------------------------------ + +RemoveConnectionCommand::RemoveConnectionCommand( const TQString &name, FormWindow *fw, + MetaDataBase::Connection c ) + : Command( name, fw ), connection( c ) +{ +} + +void RemoveConnectionCommand::execute() +{ + MetaDataBase::removeConnection( TQT_TQOBJECT(formWindow()), connection.sender, + connection.signal, connection.receiver, connection.slot ); + if ( TQT_BASE_OBJECT(connection.receiver) == TQT_BASE_OBJECT(formWindow()->mainContainer()) ) + formWindow()->mainWindow()->propertyeditor()->eventList()->setup(); +} + +void RemoveConnectionCommand::unexecute() +{ + MetaDataBase::addConnection( TQT_TQOBJECT(formWindow()), connection.sender, + connection.signal, connection.receiver, connection.slot ); + if ( TQT_BASE_OBJECT(connection.receiver) == TQT_BASE_OBJECT(formWindow()->mainContainer()) ) + formWindow()->mainWindow()->propertyeditor()->eventList()->setup(); +} + +// ------------------------------------------------------------ + +AddFunctionCommand::AddFunctionCommand( const TQString &name, FormWindow *fw, const TQCString &f, + const TQString& spec, const TQString &a, const TQString &t, + const TQString &l, const TQString &rt ) + : Command( name, fw ), function( f ), specifier( spec ), access( a ), functionType( t ), language( l ), + returnType( rt ) +{ +} + +void AddFunctionCommand::execute() +{ + MetaDataBase::addFunction( TQT_TQOBJECT(formWindow()), function, specifier, access, functionType, language, returnType ); + formWindow()->mainWindow()->functionsChanged(); + + //integration (add - execute) + KInterfaceDesigner::Function f; + f.returnType = returnType; + f.function = function; + f.specifier = specifier; + f.access = access; + f.type = (functionType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + formWindow()->clearSelection(false); + formWindow()->mainWindow()->part()->emitAddedFunction(formWindow()->fileName(), f); + + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void AddFunctionCommand::unexecute() +{ + MetaDataBase::removeFunction( TQT_TQOBJECT(formWindow()), function, specifier, access, functionType, language, returnType ); + formWindow()->mainWindow()->functionsChanged(); + + //integration (add - unexecute) + KInterfaceDesigner::Function f; + f.returnType = returnType; + f.function = function; + f.specifier = specifier; + f.access = access; + f.type = (functionType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + formWindow()->mainWindow()->part()->emitRemovedFunction(formWindow()->fileName(), f); + + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +ChangeFunctionAttribCommand::ChangeFunctionAttribCommand( const TQString &name, FormWindow *fw, MetaDataBase::Function f, + const TQString &on, const TQString &os, + const TQString &oa, const TQString &ot, const TQString &ol, + const TQString &ort ) + : Command( name, fw ), oldName( on ), oldSpec( os ), oldAccess( oa ), + oldType( ot ), oldLang( ol ), oldReturnType( ort ) +{ + newName = f.function; + newSpec = f.specifier; + newAccess = f.access; + newType = f.type; + newLang = f.language; + newReturnType = f.returnType; +} + +void ChangeFunctionAttribCommand::execute() +{ + MetaDataBase::changeFunctionAttributes( TQT_TQOBJECT(formWindow()), oldName, newName, newSpec, newAccess, + newType, newLang, newReturnType ); + formWindow()->formFile()->functionNameChanged( oldName, newName ); + formWindow()->formFile()->functionRetTypeChanged( newName, oldReturnType, newReturnType ); + formWindow()->mainWindow()->functionsChanged(); + + //integration (edit - execute) + KInterfaceDesigner::Function f; + f.returnType = newReturnType; + f.function = newName; + f.specifier = newSpec; + f.access = newAccess; + f.type = (newType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + KInterfaceDesigner::Function of; + f.returnType = oldReturnType; + f.function = oldName; + f.specifier = oldSpec; + f.access = oldAccess; + f.type = (oldType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + formWindow()->mainWindow()->part()->emitEditedFunction(formWindow()->fileName(), of, f); + + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void ChangeFunctionAttribCommand::unexecute() +{ + MetaDataBase::changeFunctionAttributes( TQT_TQOBJECT(formWindow()), newName, oldName, oldSpec, oldAccess, + oldType, oldLang, oldReturnType ); + formWindow()->formFile()->functionNameChanged( newName, oldName ); + formWindow()->formFile()->functionRetTypeChanged( oldName, newReturnType, oldReturnType ); + formWindow()->mainWindow()->functionsChanged(); + + //integration (edit - execute) + KInterfaceDesigner::Function f; + f.returnType = newReturnType; + f.function = newName; + f.specifier = newSpec; + f.access = newAccess; + f.type = (newType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + KInterfaceDesigner::Function of; + f.returnType = oldReturnType; + f.function = oldName; + f.specifier = oldSpec; + f.access = oldAccess; + f.type = (oldType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + formWindow()->mainWindow()->part()->emitEditedFunction(formWindow()->fileName(), f, of); + + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +RemoveFunctionCommand::RemoveFunctionCommand( const TQString &name, FormWindow *fw, const TQCString &f, + const TQString& spec, const TQString &a, const TQString &t, + const TQString &l, const TQString &rt ) + : Command( name, fw ), function( f ), specifier( spec ), access( a ), functionType( t ), language( l ), + returnType( rt ) +{ + if ( spec.isNull() ) { + TQValueList<MetaDataBase::Function> lst = MetaDataBase::functionList( TQT_TQOBJECT(fw) ); + for ( TQValueList<MetaDataBase::Function>::Iterator it = lst.begin(); it != lst.end(); ++it ) { + if ( MetaDataBase::normalizeFunction( (*it).function ) == + MetaDataBase::normalizeFunction( function ) ) { + specifier = (*it).specifier; + access = (*it).access; + functionType = (*it).type; + returnType = (*it).returnType; + language = (*it).language; + break; + } + } + } +} + +void RemoveFunctionCommand::execute() +{ + MetaDataBase::removeFunction( TQT_TQOBJECT(formWindow()), function, specifier, access, functionType, language, returnType ); + formWindow()->mainWindow()->functionsChanged(); + + //integration (remove - execute) + KInterfaceDesigner::Function f; + f.returnType = returnType; + f.function = function; + f.specifier = specifier; + f.access = access; + f.type = (functionType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + formWindow()->mainWindow()->part()->emitRemovedFunction(formWindow()->fileName(), f); + + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void RemoveFunctionCommand::unexecute() +{ + if ( MetaDataBase::hasFunction( TQT_TQOBJECT(formWindow()), function ) ) + return; + MetaDataBase::addFunction( TQT_TQOBJECT(formWindow()), function, specifier, access, functionType, language, returnType ); + formWindow()->mainWindow()->functionsChanged(); + + //integration (remove - unexecute) + KInterfaceDesigner::Function f; + f.returnType = returnType; + f.function = function; + f.specifier = specifier; + f.access = access; + f.type = (functionType == "slot") ? KInterfaceDesigner::ftTQtSlot : KInterfaceDesigner::ftFunction ; + formWindow()->clearSelection(false); + formWindow()->mainWindow()->part()->emitAddedFunction(formWindow()->fileName(), f); + + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +AddVariableCommand::AddVariableCommand( const TQString &name, FormWindow *fw, const TQString &vn, const TQString &a ) + : Command( name, fw ), varName( vn ), access( a ) +{ +} + +void AddVariableCommand::execute() +{ + MetaDataBase::addVariable( TQT_TQOBJECT(formWindow()), varName, access ); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void AddVariableCommand::unexecute() +{ + MetaDataBase::removeVariable( TQT_TQOBJECT(formWindow()), varName ); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +SetVariablesCommand::SetVariablesCommand( const TQString &name, FormWindow *fw, + TQValueList<MetaDataBase::Variable> lst ) + : Command( name, fw ), newList( lst ) +{ + oldList = MetaDataBase::variables( TQT_TQOBJECT(formWindow()) ); +} + +void SetVariablesCommand::execute() +{ + MetaDataBase::setVariables( TQT_TQOBJECT(formWindow()), newList ); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void SetVariablesCommand::unexecute() +{ + MetaDataBase::setVariables( TQT_TQOBJECT(formWindow()), oldList ); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +RemoveVariableCommand::RemoveVariableCommand( const TQString &name, FormWindow *fw, const TQString &vn ) + : Command( name, fw ), varName( vn ) +{ + TQValueList<MetaDataBase::Variable> lst = MetaDataBase::variables( TQT_TQOBJECT(fw) ); + for ( TQValueList<MetaDataBase::Variable>::Iterator it = lst.begin(); it != lst.end(); ++it ) { + if ( (*it).varName == varName ) { + access = (*it).varAccess; + break; + } + } +} + +void RemoveVariableCommand::execute() +{ + MetaDataBase::removeVariable( TQT_TQOBJECT(formWindow()), varName ); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void RemoveVariableCommand::unexecute() +{ + MetaDataBase::addVariable( TQT_TQOBJECT(formWindow()), varName, access ); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +EditDefinitionsCommand::EditDefinitionsCommand( const TQString &name, FormWindow *fw, LanguageInterface *lf, + const TQString &n, const TQStringList &nl ) + : Command( name, fw ), lIface( lf ), defName( n ), newList( nl ) +{ + oldList = lIface->definitionEntries( defName, formWindow()->mainWindow()->designerInterface() ); +} + +void EditDefinitionsCommand::execute() +{ + lIface->setDefinitionEntries( defName, newList, formWindow()->mainWindow()->designerInterface() ); + lIface->release(); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +void EditDefinitionsCommand::unexecute() +{ + lIface->setDefinitionEntries( defName, oldList, formWindow()->mainWindow()->designerInterface() ); + lIface->release(); + formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + if ( formWindow()->formFile() ) + formWindow()->formFile()->setModified( TRUE ); +} + +// ------------------------------------------------------------ + +LowerCommand::LowerCommand( const TQString &name, FormWindow *fw, const TQWidgetList &w ) + : Command( name, fw ), widgets( w ) +{ +} + +void LowerCommand::execute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->lower(); + formWindow()->raiseSelection( w ); + } + +} + +void LowerCommand::unexecute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->raise(); + formWindow()->raiseSelection( w ); + } +} + +// ------------------------------------------------------------ + +RaiseCommand::RaiseCommand( const TQString &name, FormWindow *fw, const TQWidgetList &w ) + : Command( name, fw ), widgets( w ) +{ +} + +void RaiseCommand::execute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->raise(); + formWindow()->raiseSelection( w ); + } + +} + +void RaiseCommand::unexecute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->lower(); + formWindow()->raiseSelection( w ); + } +} + +// ------------------------------------------------------------ + +PasteCommand::PasteCommand( const TQString &n, FormWindow *fw, + const TQWidgetList &w ) + : Command( n, fw ), widgets( w ) +{ +} + +void PasteCommand::execute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->show(); + formWindow()->selectWidget( TQT_TQOBJECT(w) ); + formWindow()->widgets()->insert( w, w ); + formWindow()->mainWindow()->objectHierarchy()->widgetInserted( w ); + } +} + +void PasteCommand::unexecute() +{ + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + w->hide(); + formWindow()->selectWidget( TQT_TQOBJECT(w), FALSE ); + formWindow()->widgets()->remove( w ); + formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( w ); + } + } + +// ------------------------------------------------------------ + +TabOrderCommand::TabOrderCommand( const TQString &n, FormWindow *fw, + const TQWidgetList &ol, const TQWidgetList &nl ) + : Command( n, fw ), oldOrder( ol ), newOrder( nl ) +{ +} + +void TabOrderCommand::merge( Command *c ) +{ + TabOrderCommand *cmd = (TabOrderCommand*)c; + newOrder = cmd->newOrder; +} + +bool TabOrderCommand::canMerge( Command * ) +{ + return TRUE; +} + +void TabOrderCommand::execute() +{ + MetaDataBase::setTabOrder( formWindow(), newOrder ); +} + +void TabOrderCommand::unexecute() +{ + MetaDataBase::setTabOrder( formWindow(), oldOrder ); +} + +// ------------------------------------------------------------ + +PopulateListBoxCommand::PopulateListBoxCommand( const TQString &n, FormWindow *fw, + TQListBox *lb, const TQValueList<Item> &items ) + : Command( n, fw ), newItems( items ), listbox( lb ) +{ + TQListBoxItem *i = 0; + for ( i = listbox->firstItem(); i; i = i->next() ) { + Item item; + if ( i->pixmap() ) + item.pix = *i->pixmap(); + item.text = i->text(); + oldItems.append( item ); + } +} + +void PopulateListBoxCommand::execute() +{ + listbox->clear(); + for ( TQValueList<Item>::Iterator it = newItems.begin(); it != newItems.end(); ++it ) { + Item i = *it; + if ( !i.pix.isNull() ) + (void)new TQListBoxPixmap( listbox, i.pix, i.text ); + else + (void)new TQListBoxText( listbox, i.text ); + } + formWindow()->mainWindow()->propertyeditor()->refetchData(); +} + +void PopulateListBoxCommand::unexecute() +{ + listbox->clear(); + for ( TQValueList<Item>::Iterator it = oldItems.begin(); it != oldItems.end(); ++it ) { + Item i = *it; + if ( !i.pix.isNull() ) + (void)new TQListBoxPixmap( listbox, i.pix, i.text ); + else + (void)new TQListBoxText( listbox, i.text ); + } + formWindow()->mainWindow()->propertyeditor()->refetchData(); +} + +// ------------------------------------------------------------ + +PopulateIconViewCommand::PopulateIconViewCommand( const TQString &n, FormWindow *fw, + TQIconView *iv, const TQValueList<Item> &items ) + : Command( n, fw ), newItems( items ), iconview( iv ) +{ +#ifndef TQT_NO_ICONVIEW + TQIconViewItem *i = 0; + for ( i = iconview->firstItem(); i; i = i->nextItem() ) { + Item item; + if ( i->pixmap() ) + item.pix = *i->pixmap(); + item.text = i->text(); + oldItems.append( item ); + } +#endif +} + +void PopulateIconViewCommand::execute() +{ +#ifndef TQT_NO_ICONVIEW + iconview->clear(); + for ( TQValueList<Item>::Iterator it = newItems.begin(); it != newItems.end(); ++it ) { + Item i = *it; + (void)new TQIconViewItem( iconview, i.text, i.pix ); + } +#endif +} + +void PopulateIconViewCommand::unexecute() +{ +#ifndef TQT_NO_ICONVIEW + iconview->clear(); + for ( TQValueList<Item>::Iterator it = oldItems.begin(); it != oldItems.end(); ++it ) { + Item i = *it; + (void)new TQIconViewItem( iconview, i.text, i.pix ); + } +#endif +} + +// ------------------------------------------------------------ + +PopulateListViewCommand::PopulateListViewCommand( const TQString &n, FormWindow *fw, + TQListView *lv, TQListView *from ) + : Command( n, fw ), listview( lv ) +{ + newItems = new TQListView(); + newItems->hide(); + transferItems( from, newItems ); + oldItems = new TQListView(); + oldItems->hide(); + transferItems( listview, oldItems ); +} + +void PopulateListViewCommand::execute() +{ + listview->clear(); + transferItems( newItems, listview ); +} + +void PopulateListViewCommand::unexecute() +{ + listview->clear(); + transferItems( oldItems, listview ); +} + +void PopulateListViewCommand::transferItems( TQListView *from, TQListView *to ) +{ + TQHeader *header = to->header(); + while ( header->count() ) + to->removeColumn( 0 ); + TQHeader *h2 = from->header(); + for ( int i = 0; i < h2->count(); ++i ) { + to->addColumn( h2->label( i ) ); + if ( h2->iconSet( i ) && !h2->iconSet( i )->pixmap().isNull() ) + header->setLabel( i, *h2->iconSet( i ), h2->label( i ) ); + header->setResizeEnabled( h2->isResizeEnabled( i ), i ); + header->setClickEnabled( h2->isClickEnabled( i ), i ); + } + + TQListViewItemIterator it( from ); + TQPtrStack<TQListViewItem> fromParents, toParents; + fromParents.push( 0 ); + toParents.push( 0 ); + TQPtrStack<TQListViewItem> toLasts; + TQListViewItem *fromLast = 0; + toLasts.push( 0 ); + int cols = from->columns(); + to->setSorting( -1 ); + from->setSorting( -1 ); + for ( ; it.current(); ++it ) { + TQListViewItem *i = it.current(); + if ( i->parent() == fromParents.top() ) { + TQListViewItem *pi = toParents.top(); + TQListViewItem *ni = 0; + if ( pi ) + ni = new TQListViewItem( pi, toLasts.top() ); + else + ni = new TQListViewItem( to, toLasts.top() ); + for ( int c = 0; c < cols; ++c ) { + ni->setText( c, i->text( c ) ); + if ( i->pixmap( c ) ) + ni->setPixmap( c, *i->pixmap( c ) ); + } + toLasts.pop(); + toLasts.push( ni ); + if ( pi ) + pi->setOpen( TRUE ); + } else { + if ( i->parent() == fromLast ) { + fromParents.push( fromLast ); + toParents.push( toLasts.top() ); + toLasts.push( 0 ); + TQListViewItem *pi = toParents.top(); + TQListViewItem *ni = 0; + if ( pi ) + ni = new TQListViewItem( pi ); + else + ni = new TQListViewItem( to ); + for ( int c = 0; c < cols; ++c ) { + ni->setText( c, i->text( c ) ); + if ( i->pixmap( c ) ) + ni->setPixmap( c, *i->pixmap( c ) ); + } + toLasts.pop(); + toLasts.push( ni ); + if ( pi ) + pi->setOpen( TRUE ); + } else { + while ( fromParents.top() != i->parent() ) { + fromParents.pop(); + toParents.pop(); + toLasts.pop(); + } + + TQListViewItem *pi = toParents.top(); + TQListViewItem *ni = 0; + if ( pi ) + ni = new TQListViewItem( pi, toLasts.top() ); + else + ni = new TQListViewItem( to, toLasts.top() ); + for ( int c = 0; c < cols; ++c ) { + ni->setText( c, i->text( c ) ); + if ( i->pixmap( c ) ) + ni->setPixmap( c, *i->pixmap( c ) ); + } + if ( pi ) + pi->setOpen( TRUE ); + toLasts.pop(); + toLasts.push( ni ); + } + } + fromLast = i; + } +} + + + +// ------------------------------------------------------------ + +PopulateMultiLineEditCommand::PopulateMultiLineEditCommand( const TQString &n, FormWindow *fw, + TQTextEdit *mle, const TQString &txt ) + : Command( n, fw ), newText( txt ), mlined( mle ) +{ + oldText = mlined->text(); + wasChanged = MetaDataBase::isPropertyChanged( TQT_TQOBJECT(mlined), "text" ); +} + +void PopulateMultiLineEditCommand::execute() +{ + mlined->setText( newText ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(mlined), "text", TRUE ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(mlined) ); +} + +void PopulateMultiLineEditCommand::unexecute() +{ + mlined->setText( oldText ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(mlined), "text", wasChanged ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(mlined) ); +} + +// ------------------------------------------------------------ + +PopulateTableCommand::PopulateTableCommand( const TQString &n, FormWindow *fw, TQTable *t, + const TQValueList<Row> &rows, + const TQValueList<Column> &columns ) + : Command( n, fw ), newRows( rows ), newColumns( columns ), table( t ) +{ +#ifndef TQT_NO_TABLE + int i = 0; + TQMap<TQString, TQString> columnFields = MetaDataBase::columnFields( TQT_TQOBJECT(table) ); + for ( i = 0; i < table->horizontalHeader()->count(); ++i ) { + PopulateTableCommand::Column col; + col.text = table->horizontalHeader()->label( i ); + if ( table->horizontalHeader()->iconSet( i ) ) + col.pix = table->horizontalHeader()->iconSet( i )->pixmap(); + col.field = *columnFields.find( col.text ); + oldColumns.append( col ); + } + for ( i = 0; i < table->verticalHeader()->count(); ++i ) { + PopulateTableCommand::Row row; + row.text = table->verticalHeader()->label( i ); + if ( table->verticalHeader()->iconSet( i ) ) + row.pix = table->verticalHeader()->iconSet( i )->pixmap(); + oldRows.append( row ); + } +#endif +} + +void PopulateTableCommand::execute() +{ +#ifndef TQT_NO_TABLE + TQMap<TQString, TQString> columnFields; + table->setNumCols( newColumns.count() ); + int i = 0; + for ( TQValueList<Column>::Iterator cit = newColumns.begin(); cit != newColumns.end(); ++cit, ++i ) { + table->horizontalHeader()->setLabel( i, (*cit).pix, (*cit).text ); + if ( !(*cit).field.isEmpty() ) + columnFields.insert( (*cit).text, (*cit).field ); + } + MetaDataBase::setColumnFields( TQT_TQOBJECT(table), columnFields ); + table->setNumRows( newRows.count() ); + i = 0; + for ( TQValueList<Row>::Iterator rit = newRows.begin(); rit != newRows.end(); ++rit, ++i ) + table->verticalHeader()->setLabel( i, (*rit).pix, (*rit).text ); +#endif +} + +void PopulateTableCommand::unexecute() +{ +#ifndef TQT_NO_TABLE + TQMap<TQString, TQString> columnFields; + table->setNumCols( oldColumns.count() ); + int i = 0; + for ( TQValueList<Column>::Iterator cit = oldColumns.begin(); cit != oldColumns.end(); ++cit, ++i ) { + table->horizontalHeader()->setLabel( i, (*cit).pix, (*cit).text ); + if ( !(*cit).field.isEmpty() ) + columnFields.insert( (*cit).text, (*cit).field ); + } + MetaDataBase::setColumnFields( TQT_TQOBJECT(table), columnFields ); + table->setNumRows( oldRows.count() ); + i = 0; + for ( TQValueList<Row>::Iterator rit = oldRows.begin(); rit != oldRows.end(); ++rit, ++i ) + table->verticalHeader()->setLabel( i, (*rit).pix, (*rit).text ); +#endif +} + +// ------------------------------------------------------------ + +AddActionToToolBarCommand::AddActionToToolBarCommand( const TQString &n, FormWindow *fw, + TQAction *a, QDesignerToolBar *tb, int idx ) + : Command( n, fw ), action( a ), toolBar( tb ), index( idx ) +{ +} + +void AddActionToToolBarCommand::execute() +{ + action->addTo( toolBar ); + + if ( ::tqqt_cast<QDesignerAction*>(action) ) { + TQString s = ( (QDesignerAction*)action )->widget()->name(); + if ( s.startsWith( "qt_dead_widget_" ) ) { + s.remove( 0, TQString( "qt_dead_widget_" ).length() ); + ( (QDesignerAction*)action )->widget()->setName( s ); + } + toolBar->insertAction( ( (QDesignerAction*)action )->widget(), action ); + ( (QDesignerAction*)action )->widget()->installEventFilter( toolBar ); + } else if ( ::tqqt_cast<QDesignerActionGroup*>(action) ) { + if ( ( (QDesignerActionGroup*)action )->usesDropDown() ) { + toolBar->insertAction( ( (QDesignerActionGroup*)action )->widget(), action ); + ( (QDesignerActionGroup*)action )->widget()->installEventFilter( toolBar ); + } + } else if ( ::tqqt_cast<QSeparatorAction*>(action) ) { + toolBar->insertAction( ( (QSeparatorAction*)action )->widget(), action ); + ( (QSeparatorAction*)action )->widget()->installEventFilter( toolBar ); + } + if ( !::tqqt_cast<TQActionGroup*>(action) || ( (TQActionGroup*)action )->usesDropDown()) { + if ( index == -1 ) + toolBar->appendAction( action ); + else + toolBar->insertAction( index, action ); + toolBar->reInsert(); + TQObject::connect( action, TQT_SIGNAL( destroyed() ), toolBar, TQT_SLOT( actionRemoved() ) ); + } else { + TQObjectList clo = action->childrenListObject(); + if ( !clo.isEmpty() ) { + TQObjectListIt it( clo ); + int i = 0; + while ( it.current() ) { + TQObject *o = it.current(); + ++it; + if ( !::tqqt_cast<TQAction*>(o) ) + continue; + // ### fix it for nested actiongroups + if ( ::tqqt_cast<QDesignerAction*>(o) ) { + QDesignerAction *ac = (QDesignerAction*)o; + toolBar->insertAction( ac->widget(), ac ); + ac->widget()->installEventFilter( toolBar ); + if ( index == -1 ) + toolBar->appendAction( ac ); + else + toolBar->insertAction( index + (i++), ac ); + } + TQObject::connect( o, TQT_SIGNAL( destroyed() ), toolBar, TQT_SLOT( actionRemoved() ) ); + } + } + toolBar->reInsert(); + TQObject::connect( action, TQT_SIGNAL( destroyed() ), toolBar, TQT_SLOT( actionRemoved() ) ); + } + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void AddActionToToolBarCommand::unexecute() +{ + if ( ::tqqt_cast<QDesignerAction*>(action) ) { + TQString s = ( (QDesignerAction*)action )->widget()->name(); + s.prepend( "qt_dead_widget_" ); + ( (QDesignerAction*)action )->widget()->setName( s ); + } + + toolBar->removeAction( action ); + action->removeFrom( toolBar ); + TQObject::disconnect( action, TQT_SIGNAL( destroyed() ), toolBar, TQT_SLOT( actionRemoved() ) ); + if ( !::tqqt_cast<TQActionGroup*>(action) || ( (TQActionGroup*)action )->usesDropDown()) { + action->removeEventFilter( toolBar ); + } else { + TQObjectList clo = action->childrenListObject(); + if ( !clo.isEmpty() ) { + TQObjectListIt it( clo ); + while ( it.current() ) { + TQObject *o = it.current(); + ++it; + if ( !::tqqt_cast<TQAction*>(o) ) + continue; + if ( ::tqqt_cast<QDesignerAction*>(o) ) { + o->removeEventFilter( toolBar ); + toolBar->removeAction( (TQAction*)o ); + } + TQObject::disconnect( o, TQT_SIGNAL( destroyed() ), toolBar, TQT_SLOT( actionRemoved() ) ); + } + } + } + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +AddToolBarCommand::AddToolBarCommand( const TQString &n, FormWindow *fw, TQMainWindow *mw ) + : Command( n, fw ), toolBar( 0 ), mainWindow( mw ) +{ +} + +void AddToolBarCommand::execute() +{ + if ( !toolBar ) { + toolBar = new QDesignerToolBar( mainWindow ); + TQString n = "Toolbar"; + formWindow()->unify( TQT_TQOBJECT(toolBar), n, TRUE ); + toolBar->setName( n ); + mainWindow->addToolBar( toolBar, n ); + } else { + toolBar->show(); + TQString s = toolBar->name(); + s.remove( 0, TQString( "qt_dead_widget_" ).length() ); + toolBar->setName( s ); + } + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void AddToolBarCommand::unexecute() +{ + toolBar->hide(); + TQString s = toolBar->name(); + s.prepend( "qt_dead_widget_" ); + toolBar->setName( s ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +AddContainerPageCommand::AddContainerPageCommand( const TQString &n, FormWindow *fw, + TQWidget *c, const TQString &label ) + : Command( n, fw ), container( c ), index( -1 ), pageLabel( label ), page( 0 ) +{ + WidgetInterface *iface = 0; + widgetManager()->queryInterface( WidgetFactory::classNameOf( container ), &iface ); + if ( !iface ) + return; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&wiface ); + if ( !wiface ) + return; + wClassName = WidgetFactory::classNameOf( container ); +} + +AddContainerPageCommand::~AddContainerPageCommand() +{ + if ( wiface ) + wiface->release(); +} + +void AddContainerPageCommand::execute() +{ + if ( !wiface || !wiface->supportsPages( wClassName ) ) + return; + if ( index == -1 ) + index = wiface->count( wClassName, container ); + if ( !page ) + page = wiface->addPage( wClassName, container, pageLabel, index ); + else + wiface->insertPage( wClassName, container, pageLabel, index, page ); + + MetaDataBase::addEntry( page ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + // #### show and update pages in object hierarchy view +} + +void AddContainerPageCommand::unexecute() +{ + if ( !wiface || !wiface->supportsPages( wClassName ) ) + return; + wiface->removePage( wClassName, container, index ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + // #### show and update pages in object hierarchy view +} + +// ------------------------------------------------------------ + +DeleteContainerPageCommand::DeleteContainerPageCommand( const TQString &n, FormWindow *fw, + TQWidget *c, int idx ) + : Command( n, fw ), container( c ), index( idx ) +{ + WidgetInterface *iface = 0; + widgetManager()->queryInterface( WidgetFactory::classNameOf( container ), &iface ); + if ( !iface ) + return; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&wiface ); + if ( !wiface ) + return; + wClassName = WidgetFactory::classNameOf( container ); + page = wiface->page( wClassName, container, index ); + pageLabel = wiface->pageLabel( wClassName, container, index ); +} + +DeleteContainerPageCommand::~DeleteContainerPageCommand() +{ + if ( wiface ) + wiface->release(); +} + +void DeleteContainerPageCommand::execute() +{ + if ( !wiface || !wiface->supportsPages( wClassName ) ) + return; + + wiface->removePage( wClassName, container, index ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + // #### show and update pages in object hierarchy view +} + +void DeleteContainerPageCommand::unexecute() +{ + if ( !wiface || !wiface->supportsPages( wClassName ) ) + return; + if ( index == -1 ) + index = wiface->count( wClassName, container ); + + wiface->insertPage( wClassName, container, pageLabel, index, page ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + // #### show and update pages in object hierarchy view +} + +// ------------------------------------------------------------ + +RenameContainerPageCommand::RenameContainerPageCommand( const TQString &n, FormWindow *fw, + TQWidget *c, int idx, + const TQString &label ) + : Command( n, fw ), container( c ), index( idx ), newLabel( label ) +{ + WidgetInterface *iface = 0; + widgetManager()->queryInterface( WidgetFactory::classNameOf( container ), &iface ); + if ( !iface ) + return; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&wiface ); + if ( !wiface ) + return; + wClassName = WidgetFactory::classNameOf( container ); + oldLabel = wiface->pageLabel( wClassName, container, index ); +} + +RenameContainerPageCommand::~RenameContainerPageCommand() +{ + if ( wiface ) + wiface->release(); +} + +void RenameContainerPageCommand::execute() +{ + if ( !wiface || !wiface->supportsPages( wClassName ) ) + return; + wiface->renamePage( wClassName, container, index, newLabel ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + // #### show and update pages in object hierarchy view +} + +void RenameContainerPageCommand::unexecute() +{ + if ( !wiface || !wiface->supportsPages( wClassName ) ) + return; + wiface->renamePage( wClassName, container, index, oldLabel ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + // #### show and update pages in object hierarchy view +} +#endif // TQT_CONTAINER_CUSTOM_WIDGETS +// ------------------------------------------------------------ + +AddActionToPopupCommand::AddActionToPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + PopupMenuEditorItem *i, + int idx ) + : Command( n, fw ), menu( m ), item( i ), index( idx ) +{ } + +void AddActionToPopupCommand::execute() +{ + menu->insert( item, index ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void AddActionToPopupCommand::unexecute() +{ + item->hideMenu(); + int i = menu->find( item->action() ); + menu->remove( i ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +RemoveActionFromPopupCommand::RemoveActionFromPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + int idx ) + : AddActionToPopupCommand( n, fw, m, 0, idx ) +{ + item = menu->at( index ); +} + +void RemoveActionFromPopupCommand::execute() +{ + AddActionToPopupCommand::unexecute(); +} + +void RemoveActionFromPopupCommand::unexecute() +{ + AddActionToPopupCommand::execute(); +} + +// ------------------------------------------------------------ + +ExchangeActionInPopupCommand::ExchangeActionInPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + int a, + int b ) + : Command( n, fw ), menu( m ), c( a ), d( b ) +{ } + +void ExchangeActionInPopupCommand::execute() +{ + menu->exchange( c, d ); +} + +void ExchangeActionInPopupCommand::unexecute() +{ + execute(); +} + +// ------------------------------------------------------------ + +ActionEditor *ActionCommand::actionEditor() +{ + // FIXME: handle multiple action editors + return (ActionEditor *) formWindow()->mainWindow()->child( 0, "ActionEditor" ); +} + +// ------------------------------------------------------------ + +RenameActionCommand::RenameActionCommand( const TQString &n, + FormWindow *fw, + TQAction *a, + PopupMenuEditor *m, + TQString nm ) + : ActionCommand( n, fw, a ), menu( m ), newName( nm ) +{ + oldName = action->menuText(); +} + +void RenameActionCommand::execute() +{ + TQString actionText = newName; + actionText.replace("&&", "&"); + TQString menuText = newName; + action->setText( actionText ); + action->setMenuText( menuText ); + + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void RenameActionCommand::unexecute() +{ + action->setMenuText( oldName ); + action->setText( oldName ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +SetActionIconsCommand::SetActionIconsCommand( const TQString &n, + FormWindow *fw, + TQAction *a, + PopupMenuEditor *m, + TQIconSet &icons ) + : ActionCommand( n, fw, a ), menu( m ), newIcons( icons ) +{ + oldIcons = a->iconSet(); +} + +void SetActionIconsCommand::execute() +{ + action->setIconSet( newIcons ); + ActionEditor *ae = actionEditor(); + if ( ae ) + ae->updateActionIcon( action ); + MetaDataBase::setPropertyChanged( action, "iconSet", TRUE ); +} + +void SetActionIconsCommand::unexecute() +{ + action->setIconSet( oldIcons ); + ActionEditor *ae = actionEditor(); + if ( ae ) + ae->updateActionIcon( action ); + MetaDataBase::setPropertyChanged( action, "iconSet", TRUE ); +} + +// ------------------------------------------------------------ + +AddMenuCommand::AddMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + MenuBarEditorItem *i, + int idx ) + : Command( n, fw ), mb( b ), item( i ), name( 0 ), index( idx ) +{ } + +AddMenuCommand::AddMenuCommand( const TQString &n, + FormWindow *fw, + TQMainWindow *mw, + const TQString &nm ) + : Command( n, fw ), mb( 0 ), item( 0 ), name( nm ), index( -1 ) +{ + if ( mw ) + mb = (MenuBarEditor *)mw->child( 0, "MenuBarEditor" ); +} + +void AddMenuCommand::execute() +{ + TQString n; + TQMainWindow *mw = (TQMainWindow*)formWindow()->mainContainer(); + if ( !mb ) { + mb = new MenuBarEditor( formWindow(), mw ); + mb->setName( "MenuBarEditor" ); + formWindow()->insertWidget( mb, TRUE ); + } + if ( !item ) { + PopupMenuEditor *popup = new PopupMenuEditor( formWindow(), mw ); + popup->setName( "PopupMenuEditor" ); + formWindow()->insertWidget( popup, TRUE ); + mb->insertItem( name, popup, index ); + index = mb->findItem( popup ); + item = mb->item( index ); + } else { + PopupMenuEditor *popup = item->menu(); + popup->setName( item->menuText() ); + formWindow()->insertWidget( popup, TRUE ); + mb->insertItem( item, index ); + } + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void AddMenuCommand::unexecute() +{ + if ( !item ) { + tqWarning( "The AddMenuCommand was created without a menu item." ); + return; + } + item->menu()->hide(); + int i = mb->findItem( item ); + formWindow()->removeWidget( item->menu() ); + mb->removeItemAt( i ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +RemoveMenuCommand::RemoveMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + int idx ) + : AddMenuCommand( n, fw, b, 0, idx ) +{ + item = mb->item( index ); +} + +void RemoveMenuCommand::execute() +{ + mb->hideItem( index ); + AddMenuCommand::unexecute(); +} + +void RemoveMenuCommand::unexecute() +{ + AddMenuCommand::execute(); +} + +// ------------------------------------------------------------ + +ExchangeMenuCommand::ExchangeMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + int i, + int j ) + : Command( n, fw ), bar( b ), k( i ), l( j ) +{ } + +void ExchangeMenuCommand::execute() +{ + bar->exchange( k, l ); +} + +void ExchangeMenuCommand::unexecute() +{ + execute(); +} + +// ------------------------------------------------------------ + +MoveMenuCommand::MoveMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + int i, + int j ) + : Command( n, fw ), bar( b ), from( i ), to( j ) +{ } + +void MoveMenuCommand::execute() +{ + bar->hideItem( from ); + MenuBarEditorItem * i = bar->item( from ); + bar->removeItemAt( from ); + int t = ( from > to ? to : to - 1 ); + bar->insertItem( i, t ); +} + +void MoveMenuCommand::unexecute() +{ + bar->hideItem( to ); + int t = ( from > to ? to : to - 1 ); + MenuBarEditorItem * i = bar->item( t ); + bar->removeItemAt( t ); + bar->insertItem( i, from ); +} + +// ------------------------------------------------------------ + +RenameMenuCommand::RenameMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + TQString nm, + MenuBarEditorItem *i ) + : Command( n, fw ), bar( b ), item( i ), newName( nm ) +{ + oldName = item->menu()->name(); +} + +TQString RenameMenuCommand::makeLegal( const TQString &str ) +{ + // remove illegal characters + TQString d; + char c = 0, i = 0; + while ( !str.at(i).isNull() ) { + c = str.at(i).latin1(); + if ( c == '-' || c == ' ' ) + d += '_'; + else if ( ( c >= '0' && c <= '9') || ( c >= 'A' && c <= 'Z' ) + || c == '_' || ( c >= 'a' && c <= 'z' ) ) + d += c; + ++i; + } + return d; +} + +void RenameMenuCommand::execute() +{ + PopupMenuEditor *popup = item->menu(); + item->setMenuText( newName ); + TQString legal = makeLegal( newName ); + formWindow()->unify( TQT_TQOBJECT(popup), legal, TRUE ); + popup->setName( legal ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void RenameMenuCommand::unexecute() +{ + PopupMenuEditor *popup = item->menu(); + item->setMenuText( oldName ); + popup->setName( oldName ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +AddToolBoxPageCommand::AddToolBoxPageCommand( const TQString &n, FormWindow *fw, + TQToolBox *tw, const TQString &label ) + : Command( n, fw ), toolBox( tw ), toolBoxLabel( label ) +{ + toolBoxPage = new QDesignerWidget( formWindow(), toolBox, "page" ); + toolBoxPage->hide(); + index = -1; + MetaDataBase::addEntry( TQT_TQOBJECT(toolBoxPage) ); +} + +void AddToolBoxPageCommand::execute() +{ + index = toolBox->insertItem( index, toolBoxPage, toolBoxLabel); + toolBox->setCurrentIndex( index ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void AddToolBoxPageCommand::unexecute() +{ + toolBox->removeItem( toolBoxPage ); + toolBoxPage->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +// ------------------------------------------------------------ + +DeleteToolBoxPageCommand::DeleteToolBoxPageCommand( const TQString &n, FormWindow *fw, + TQToolBox *tw, TQWidget *page ) + : Command( n, fw ), toolBox( tw ), toolBoxPage( page ) +{ + toolBoxLabel = toolBox->itemLabel( toolBox->currentIndex() ); + index = toolBox->currentIndex(); +} + +void DeleteToolBoxPageCommand::execute() +{ + toolBox->removeItem( toolBoxPage ); + toolBoxPage->hide(); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} + +void DeleteToolBoxPageCommand::unexecute() +{ + index = toolBox->insertItem( index, toolBoxPage, toolBoxLabel ); + toolBox->setCurrentIndex( index ); + formWindow()->emitUpdateProperties( TQT_TQOBJECT(formWindow()->currentWidget()) ); + formWindow()->mainWindow()->objectHierarchy()->rebuild(); +} diff --git a/kdevdesigner/designer/command.h b/kdevdesigner/designer/command.h new file mode 100644 index 00000000..b1c7a2a5 --- /dev/null +++ b/kdevdesigner/designer/command.h @@ -0,0 +1,1260 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef COMMAND_H +#define COMMAND_H + +#include "metadatabase.h" +#include "layout.h" + +#include <tqstring.h> +#include <tqrect.h> +#include <tqvaluelist.h> +#include <tqvariant.h> +#include <tqobject.h> +#include <tqlistview.h> +#include <tqptrlist.h> +#include <tqmap.h> +#include <tqiconset.h> + +class TQWizard; +class TQTabWidget; +class Command; +class TQWidget; +class FormWindow; +class PropertyEditor; +class TQListBox; +class TQIconView; +class TQTable; +class TQAction; +class QDesignerToolBar; +class TQMainWindow; +class TQTextEdit; +struct LanguageInterface; +class TQToolBox; + +class MenuBarEditor; +class MenuBarEditorItem; +class PopupMenuEditor; +class PopupMenuEditorItem; +class ActionEditor; + +class Command : public TQt +{ +public: + Command( const TQString &n, FormWindow *fw ); + virtual ~Command(); + + enum Type { + Resize, + Insert, + Move, + Delete, + SetProperty, + LayoutHorizontal, + LayoutVertical, + LayoutHorizontalSplitter, + LayoutVerticalSplitter, + LayoutGrid, + BreakLayout, + Macro, + AddTabPage, + DeleteTabPage, + MoveTabPage, + AddWidgetStackPage, + DeleteWidgetStackPage, + AddWizardPage, + DeleteWizardPage, + SwapWizardPages, + MoveWizardPage, + RenameWizardPage, + AddConnection, + RemoveConnection, + Lower, + Raise, + Paste, + TabOrder, + PopulateListBox, + PopulateIconView, + PopulateListView, + PopulateMultiLineEdit, + PopulateTable, + AddActionToToolBar, + RemoveActionFromToolBar, + AddToolBar, + RemoveToolBar, + AddFunction, + ChangeFunctionAttrib, + RemoveFunction, + AddVariable, + SetVariables, + RemoveVariable, + EditDefinitions, + AddContainerPage, + DeleteContainerPage, + RenameContainerPage, + AddActionToPopup, + RemoveActionFromPopup, + ExchangeActionInPopup, + //MoveActionInPopup, + RenameAction, + SetActionIcons, + AddMenu, + RemoveMenu, + ExchangeMenu, + MoveMenu, + RenameMenu, + AddToolBoxPage, + DeleteToolBoxPage + }; + + TQString name() const; + + virtual void execute() = 0; + virtual void unexecute() = 0; + virtual Type type() const = 0; + virtual void merge( Command *c ); + virtual bool canMerge( Command *c ); + + FormWindow *formWindow() const; + +private: + TQString cmdName; + FormWindow *formWin; + +}; + +class CommandHistory : public TQObject +{ + Q_OBJECT + + +public: + CommandHistory( int s ); + + void addCommand( Command *cmd, bool tryCompress = FALSE ); + void undo(); + void redo(); + + void emitUndoRedo(); + + void setModified( bool m ); + bool isModified() const; + +public slots: + void checkCompressedCommand(); + +signals: + void undoRedoChanged( bool undoAvailable, bool redoAvailable, + const TQString &undoCmd, const TQString &redoCmd ); + void modificationChanged( bool m ); + +private: + TQPtrList<Command> history; + int current, steps; + bool modified; + int savedAt; + Command *compressedCommand; + +}; + +class ResizeCommand : public Command +{ +public: + ResizeCommand( const TQString &n, FormWindow *fw, + TQWidget *w, const TQRect &oldr, const TQRect &nr ); + + void execute(); + void unexecute(); + Type type() const { return Resize; } + +private: + TQWidget *widget; + TQRect oldRect, newRect; + +}; + +class InsertCommand : public Command +{ +public: + InsertCommand( const TQString &n, FormWindow *fw, TQWidget *w, const TQRect &g ); + + void execute(); + void unexecute(); + Type type() const { return Insert; } + +private: + TQWidget *widget; + TQRect geometry; + +}; + +class MoveCommand : public Command +{ +public: + MoveCommand( const TQString &n, FormWindow *fw, + const TQWidgetList &w, + const TQValueList<TQPoint> op, + const TQValueList<TQPoint> np, + TQWidget *opr, TQWidget *npr ); + void execute(); + void unexecute(); + Type type() const { return Move; } + void merge( Command *c ); + bool canMerge( Command *c ); + +private: + TQWidgetList widgets; + TQValueList<TQPoint> oldPos, newPos; + TQWidget *oldParent, *newParent; + +}; + +class DeleteCommand : public Command +{ +public: + DeleteCommand( const TQString &n, FormWindow *fw, + const TQWidgetList &w ); + void execute(); + void unexecute(); + Type type() const { return Delete; } + +private: + TQWidgetList widgets; + TQMap< TQWidget*, TQValueList<MetaDataBase::Connection> > connections; + +}; + +class SetPropertyCommand : public Command +{ +public: + SetPropertyCommand( const TQString &n, FormWindow *fw, + TQObject *w, PropertyEditor *e, + const TQString &pn, const TQVariant &ov, + const TQVariant &nv, const TQString &ncut, + const TQString &ocut, + bool reset = FALSE ); + + void execute(); + void unexecute(); + Type type() const { return SetProperty; } + void merge( Command *c ); + bool canMerge( Command *c ); + bool checkProperty(); + +private: + void setProperty( const TQVariant &v, const TQString ¤tItemText, bool select = TRUE ); + + TQGuardedPtr<TQObject> widget; + PropertyEditor *editor; + TQString propName; + TQVariant oldValue, newValue; + TQString oldCurrentItemText, newCurrentItemText; + bool wasChanged; + bool isResetCommand; + +}; + +class LayoutHorizontalCommand : public Command +{ +public: + LayoutHorizontalCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ); + + void execute(); + void unexecute(); + Type type() const { return LayoutHorizontal; } + +private: + HorizontalLayout layout; + +}; + +class LayoutHorizontalSplitCommand : public Command +{ +public: + LayoutHorizontalSplitCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ); + + void execute(); + void unexecute(); + Type type() const { return LayoutHorizontalSplitter; } + +private: + HorizontalLayout layout; + +}; + +class LayoutVerticalCommand : public Command +{ +public: + LayoutVerticalCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ); + + void execute(); + void unexecute(); + Type type() const { return LayoutVertical; } + +private: + VerticalLayout layout; + +}; + +class LayoutVerticalSplitCommand : public Command +{ +public: + LayoutVerticalSplitCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl ); + + void execute(); + void unexecute(); + Type type() const { return LayoutVerticalSplitter; } + +private: + VerticalLayout layout; + +}; + +class LayoutGridCommand : public Command +{ +public: + LayoutGridCommand( const TQString &n, FormWindow *fw, + TQWidget *parent, TQWidget *layoutBase, + const TQWidgetList &wl, int xres, int yres ); + + void execute(); + void unexecute(); + Type type() const { return LayoutGrid; } + +private: + GridLayout layout; + +}; + +class BreakLayoutCommand : public Command +{ +public: + BreakLayoutCommand( const TQString &n, FormWindow *fw, + TQWidget *layoutBase, const TQWidgetList &wl ); + + void execute(); + void unexecute(); + Type type() const { return BreakLayout; } + +private: + Layout *layout; + int spacing; + int margin; + TQWidget *lb; + TQWidgetList widgets; + +}; + +class MacroCommand : public Command +{ +public: + MacroCommand( const TQString &n, FormWindow *fw, + const TQPtrList<Command> &cmds ); + + void execute(); + void unexecute(); + Type type() const { return Macro; } + +private: + TQPtrList<Command> commands; + +}; + +class AddTabPageCommand : public Command +{ +public: + AddTabPageCommand( const TQString &n, FormWindow *fw, + TQTabWidget *tw, const TQString &label ); + + void execute(); + void unexecute(); + Type type() const { return AddTabPage; } + +private: + TQTabWidget *tabWidget; + int index; + TQWidget *tabPage; + TQString tabLabel; + +}; + +class DeleteTabPageCommand : public Command +{ +public: + DeleteTabPageCommand( const TQString &n, FormWindow *fw, + TQTabWidget *tw, TQWidget *page ); + + void execute(); + void unexecute(); + Type type() const { return DeleteTabPage; } + +private: + TQTabWidget *tabWidget; + int index; + TQWidget *tabPage; + TQString tabLabel; + +}; + +class MoveTabPageCommand : public Command +{ +public: + MoveTabPageCommand(const TQString &n, FormWindow *fw, + TQTabWidget *tw, TQWidget *page, const TQString& label, int nIndex, int oIndex ); + + void execute(); + void unexecute(); + Type type() const { return MoveTabPage; } + +private: + TQTabWidget *tabWidget; + int newIndex, oldIndex; + TQWidget *tabPage; + TQString tabLabel; + +}; +class QDesignerWidgetStack; +class AddWidgetStackPageCommand : public Command +{ +public: + AddWidgetStackPageCommand( const TQString &n, FormWindow *fw, + QDesignerWidgetStack *ws ); + + void execute(); + void unexecute(); + Type type() const { return AddWidgetStackPage; } + +private: + QDesignerWidgetStack *widgetStack; + int index; + TQWidget *stackPage; +}; + +class DeleteWidgetStackPageCommand : public Command +{ +public: + DeleteWidgetStackPageCommand( const TQString &n, FormWindow *fw, + QDesignerWidgetStack *ws, TQWidget *page ); + + void execute(); + void unexecute(); + Type type() const { return DeleteWidgetStackPage; } + +private: + QDesignerWidgetStack *widgetStack; + int index; + TQWidget *stackPage; +}; + + + +class AddWizardPageCommand : public Command +{ +public: + AddWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, const TQString &label, int index = -1, bool show = TRUE ); + + void execute(); + void unexecute(); + Type type() const { return AddWizardPage; } + +private: + TQWizard *wizard; + int index; + bool show; + TQWidget *page; + TQString pageLabel; + +}; + +class DeleteWizardPageCommand : public Command +{ +public: + DeleteWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, int index, bool show = TRUE ); + + void execute(); + void unexecute(); + Type type() const { return DeleteWizardPage; } + +private: + TQWizard *wizard; + int index; + bool show; + TQWidget *page; + TQString pageLabel; + +}; + +class RenameWizardPageCommand : public Command +{ +public: + RenameWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, int index, const TQString& name ); + + void execute(); + void unexecute(); + Type type() const { return RenameWizardPage; } + +private: + TQWizard *wizard; + int index; + TQWidget *page; + TQString label; + +}; + +class SwapWizardPagesCommand : public Command +{ +public: + SwapWizardPagesCommand( const TQString &n, FormWindow *fw, + TQWizard *w, int index1, int index2 ); + + void execute(); + void unexecute(); + Type type() const { return SwapWizardPages; } + +private: + TQWizard *wizard; + int index1, index2; + +}; + +class MoveWizardPageCommand : public Command +{ +public: + MoveWizardPageCommand( const TQString &n, FormWindow *fw, + TQWizard *w, int index1, int index2 ); + + void execute(); + void unexecute(); + Type type() const { return MoveWizardPage; } + +private: + TQWizard *wizard; + int index1, index2; + +}; + +class AddConnectionCommand : public Command +{ +public: + AddConnectionCommand( const TQString &name, FormWindow *fw, + MetaDataBase::Connection c ); + + void execute(); + void unexecute(); + Type type() const { return AddConnection; } + +private: + MetaDataBase::Connection connection; + +}; + +class RemoveConnectionCommand : public Command +{ +public: + RemoveConnectionCommand( const TQString &name, FormWindow *fw, + MetaDataBase::Connection c ); + + void execute(); + void unexecute(); + Type type() const { return RemoveConnection; } + +private: + MetaDataBase::Connection connection; + +}; + + +class AddFunctionCommand : public Command +{ +public: + AddFunctionCommand( const TQString &name, FormWindow *fw, const TQCString &f, const TQString& spec, + const TQString &a, const TQString &t, const TQString &l, const TQString &rt ); + + void execute(); + void unexecute(); + Type type() const { return AddFunction; } + +private: + TQCString function; + TQString specifier; + TQString access; + TQString functionType; + TQString language; + TQString returnType; +}; + +class ChangeFunctionAttribCommand : public Command +{ +public: + ChangeFunctionAttribCommand( const TQString &name, FormWindow *fw, MetaDataBase::Function f, + const TQString &on, const TQString &os, const TQString &oa, + const TQString &ot, const TQString &ol, const TQString &ort ); + + void execute(); + void unexecute(); + Type type() const { return ChangeFunctionAttrib; } + +private: + TQString oldName, newName; + TQString oldSpec, newSpec; + TQString oldAccess, newAccess; + TQString oldType, newType; + TQString oldLang, newLang; + TQString oldReturnType, newReturnType; +}; + +class RemoveFunctionCommand : public Command +{ +public: + RemoveFunctionCommand( const TQString &name, FormWindow *fw, const TQCString &f, const TQString& spec, + const TQString &a, const TQString &t, const TQString &l, const TQString &rt ); + + void execute(); + void unexecute(); + Type type() const { return RemoveFunction; } + +private: + TQCString function; + TQString specifier; + TQString access; + TQString functionType; + TQString language; + TQString returnType; +}; + +class AddVariableCommand : public Command +{ +public: + AddVariableCommand( const TQString &name, FormWindow *fw, const TQString &vn, const TQString &a ); + void execute(); + void unexecute(); + Type type() const { return AddVariable; } + +private: + TQString varName; + TQString access; +}; + +class SetVariablesCommand : public Command +{ +public: + SetVariablesCommand( const TQString &name, FormWindow *fw, TQValueList<MetaDataBase::Variable> lst ); + void execute(); + void unexecute(); + Type type() const { return SetVariables; } + +private: + TQValueList<MetaDataBase::Variable> oldList, newList; +}; + +class RemoveVariableCommand : public Command +{ +public: + RemoveVariableCommand( const TQString &name, FormWindow *fw, const TQString &vn ); + void execute(); + void unexecute(); + Type type() const { return RemoveVariable; } + +private: + TQString varName; + TQString access; +}; + +class EditDefinitionsCommand : public Command +{ +public: + EditDefinitionsCommand( const TQString &name, FormWindow *fw, LanguageInterface *lf, + const TQString &n, const TQStringList &l ); + void execute(); + void unexecute(); + Type type() const { return EditDefinitions; } + +private: + LanguageInterface *lIface; + TQString defName; + TQStringList newList, oldList; +}; + +class LowerCommand : public Command +{ +public: + LowerCommand( const TQString &name, FormWindow *fw, const TQWidgetList &w ); + + void execute(); + void unexecute(); + Type type() const { return Lower; } + +private: + TQWidgetList widgets; + +}; + +class RaiseCommand : public Command +{ +public: + RaiseCommand( const TQString &name, FormWindow *fw, const TQWidgetList &w ); + + void execute(); + void unexecute(); + Type type() const { return Raise; } + +private: + TQWidgetList widgets; + +}; + +class PasteCommand : public Command +{ +public: + PasteCommand( const TQString &n, FormWindow *fw, const TQWidgetList &w ); + + void execute(); + void unexecute(); + Type type() const { return Paste; } + +private: + TQWidgetList widgets; + +}; + +class TabOrderCommand : public Command +{ +public: + TabOrderCommand( const TQString &n, FormWindow *fw, const TQWidgetList &ol, const TQWidgetList &nl ); + + void execute(); + void unexecute(); + Type type() const { return TabOrder; } + void merge( Command *c ); + bool canMerge( Command *c ); + +private: + TQWidgetList oldOrder, newOrder; + +}; + +class PopulateListBoxCommand : public Command +{ +public: + struct Item + { + TQString text; + TQPixmap pix; + TQ_DUMMY_COMPARISON_OPERATOR( Item ) + }; + + PopulateListBoxCommand( const TQString &n, FormWindow *fw, + TQListBox *lb, const TQValueList<Item> &items ); + void execute(); + void unexecute(); + Type type() const { return PopulateListBox; } + + bool operator==( const PopulateListBoxCommand & ) const; + +private: + TQValueList<Item> oldItems, newItems; + TQListBox *listbox; + +}; + +class PopulateIconViewCommand : public Command +{ +public: + struct Item + { + TQString text; + TQPixmap pix; + TQ_DUMMY_COMPARISON_OPERATOR( Item ) + }; + + PopulateIconViewCommand( const TQString &n, FormWindow *fw, + TQIconView *iv, const TQValueList<Item> &items ); + void execute(); + void unexecute(); + Type type() const { return PopulateIconView; } + + bool operator==( const PopulateIconViewCommand & ) const; + +private: + TQValueList<Item> oldItems, newItems; + TQIconView *iconview; + +}; + +class PopulateListViewCommand : public Command +{ +public: + PopulateListViewCommand( const TQString &n, FormWindow *fw, + TQListView *lv, TQListView *from ); + void execute(); + void unexecute(); + Type type() const { return PopulateListView; } + static void transferItems( TQListView *from, TQListView *to ); + + bool operator==( const PopulateListViewCommand & ) const; + +private: + TQListView *oldItems, *newItems; + TQListView *listview; + +}; + +class PopulateMultiLineEditCommand : public Command +{ +public: + PopulateMultiLineEditCommand( const TQString &n, FormWindow *fw, + TQTextEdit *mle, const TQString &txt ); + void execute(); + void unexecute(); + Type type() const { return PopulateMultiLineEdit; } + +private: + TQString newText, oldText; + TQTextEdit *mlined; + bool wasChanged; + +}; + +class PopulateTableCommand : public Command +{ +public: + struct Row + { + TQString text; + TQPixmap pix; + TQ_DUMMY_COMPARISON_OPERATOR( Row ) + }; + + struct Column + { + TQString text; + TQPixmap pix; + TQString field; + TQ_DUMMY_COMPARISON_OPERATOR( Column ) + }; + + PopulateTableCommand( const TQString &n, FormWindow *fw, TQTable *t, + const TQValueList<Row> &rows, + const TQValueList<Column> &columns ); + + void execute(); + void unexecute(); + Type type() const { return PopulateTable; } + +private: + TQValueList<Row> oldRows, newRows; + TQValueList<Column> oldColumns, newColumns; + TQTable *table; + +}; + +class AddActionToToolBarCommand : public Command +{ +public: + AddActionToToolBarCommand( const TQString &n, FormWindow *fw, + TQAction *a, QDesignerToolBar *tb, int idx ); + + void execute(); + void unexecute(); + Type type() const { return AddActionToToolBar; } + +private: + TQAction *action; + QDesignerToolBar *toolBar; + int index; + +}; + +class RemoveActionFromToolBarCommand : public AddActionToToolBarCommand +{ +public: + RemoveActionFromToolBarCommand( const TQString &n, FormWindow *fw, + TQAction *a, QDesignerToolBar *tb, int idx ) + : AddActionToToolBarCommand( n, fw, a, tb, idx ) {} + + void execute() { AddActionToToolBarCommand::unexecute(); } + void unexecute() { AddActionToToolBarCommand::execute(); } + Type type() const { return RemoveActionFromToolBar; } + +}; + +// MenuCommands + +class AddToolBarCommand : public Command +{ +public: + AddToolBarCommand( const TQString &n, FormWindow *fw, TQMainWindow *mw ); + + void execute(); + void unexecute(); + Type type() const { return AddToolBar; } + +protected: + QDesignerToolBar *toolBar; + TQMainWindow *mainWindow; + +}; + +class RemoveToolBarCommand : public AddToolBarCommand +{ +public: + RemoveToolBarCommand( const TQString &n, FormWindow *fw, TQMainWindow *mw, QDesignerToolBar *tb ) + : AddToolBarCommand( n, fw, mw ) { toolBar = tb; } + + void execute() { AddToolBarCommand::unexecute(); } + void unexecute() { AddToolBarCommand::execute(); } + Type type() const { return RemoveToolBar; } + +}; + +struct TQWidgetContainerInterfacePrivate; + +class AddContainerPageCommand : public Command +{ +public: + AddContainerPageCommand( const TQString &n, FormWindow *fw, + TQWidget *c, const TQString &label ); + + ~AddContainerPageCommand(); + + void execute(); + void unexecute(); + Type type() const { return AddContainerPage; } + +private: + TQString wClassName; + TQWidget *container; + int index; + TQString pageLabel; + TQWidget *page; + TQWidgetContainerInterfacePrivate *wiface; + +}; + +class DeleteContainerPageCommand : public Command +{ +public: + DeleteContainerPageCommand( const TQString &n, FormWindow *fw, + TQWidget *container, int index ); + ~DeleteContainerPageCommand(); + + void execute(); + void unexecute(); + Type type() const { return DeleteContainerPage; } + +private: + TQString wClassName; + TQWidget *container; + int index; + TQString pageLabel; + TQWidget *page; + TQWidgetContainerInterfacePrivate *wiface; + +}; + +class RenameContainerPageCommand : public Command +{ +public: + RenameContainerPageCommand( const TQString &n, FormWindow *fw, + TQWidget *container, int index, + const TQString &label ); + ~RenameContainerPageCommand(); + + void execute(); + void unexecute(); + Type type() const { return RenameContainerPage; } + +private: + TQString wClassName; + TQWidget *container; + int index; + TQString oldLabel, newLabel; + TQWidgetContainerInterfacePrivate *wiface; + +}; + +class AddActionToPopupCommand : public Command +{ +public: + AddActionToPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + PopupMenuEditorItem *i, + int idx = -1 ); + void execute(); + void unexecute(); + Type type() const { return AddActionToPopup; } +protected: + TQString constructName() const; + PopupMenuEditor *menu; + PopupMenuEditorItem *item; + int index; +private: +}; + +class RemoveActionFromPopupCommand : public AddActionToPopupCommand +{ +public: + RemoveActionFromPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + int idx ); + void execute(); + void unexecute(); + Type type() const { return RemoveActionFromPopup; } +protected: +private: +}; + +class ExchangeActionInPopupCommand : public Command +{ +public: + ExchangeActionInPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + int a, + int b ); + void execute(); + void unexecute(); + Type type() const { return ExchangeActionInPopup; } +protected: +private: + PopupMenuEditor *menu; + int c; + int d; +}; +/* +class MoveActionInPopupCommand : public Command +{ +public: + MoveActionInPopupCommand( const TQString &n, + FormWindow *fw, + PopupMenuEditor *m, + int a, + int b ); + void execute(); + void unexecute(); + Type type() const { return MoveActionInPopup; } +protected: +private: + PopupMenuEditor *menu; + int from; + int to; +}; +*/ +class ActionCommand : public Command +{ +public: + ActionCommand( const TQString &n, + FormWindow *fw, + TQAction *a ) + : Command( n, fw ), action( a ) { } + virtual Type type() const = 0; +protected: + ActionEditor *actionEditor(); + TQAction *action; +}; + +class RenameActionCommand : public ActionCommand +{ +public: + RenameActionCommand( const TQString &n, + FormWindow *fw, + TQAction *a, + PopupMenuEditor *m, + TQString nm ); + void execute(); + void unexecute(); + Type type() const { return RenameAction; } +private: + PopupMenuEditor *menu; + TQString newName; + TQString oldName; +}; + +class SetActionIconsCommand : public ActionCommand +{ +public: + SetActionIconsCommand( const TQString &n, + FormWindow *fw, + TQAction *a, + PopupMenuEditor *m, + TQIconSet &icons ); + void execute(); + void unexecute(); + Type type() const { return SetActionIcons; } +protected: + void updateActionEditorItem(); +private: + PopupMenuEditor *menu; + TQIconSet newIcons; + TQIconSet oldIcons; +}; + +class AddMenuCommand : public Command +{ +public: + AddMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + MenuBarEditorItem *i, + int idx = -1 ); + + AddMenuCommand( const TQString &n, + FormWindow *fw, + TQMainWindow *mw, + const TQString &nm = "Menu" ); + + void execute(); + void unexecute(); + Type type() const { return AddMenu; } +protected: + MenuBarEditor *mb; + MenuBarEditorItem *item; + TQString name; + int index; +private: +}; + +class RemoveMenuCommand : public AddMenuCommand +{ +public: + RemoveMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + int idx ); + void execute(); + void unexecute(); + Type type() const { return RemoveMenu; } +protected: +private: +}; + +class ExchangeMenuCommand : public Command +{ +public: + ExchangeMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + int i, + int j ); + void execute(); + void unexecute(); + Type type() const { return ExchangeMenu; } +protected: +private: + MenuBarEditor *bar; + int k; + int l; +}; + + +class MoveMenuCommand : public Command +{ +public: + MoveMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *b, + int i, + int j ); + void execute(); + void unexecute(); + Type type() const { return MoveMenu; } +protected: +private: + MenuBarEditor *bar; + int from; + int to; +}; + +class RenameMenuCommand : public Command +{ +public: + RenameMenuCommand( const TQString &n, + FormWindow *fw, + MenuBarEditor *m, + TQString nm, + MenuBarEditorItem *i ); + void execute(); + void unexecute(); + Type type() const { return RenameMenu; } + static TQString makeLegal( const TQString &str ); +private: + MenuBarEditor *bar; + MenuBarEditorItem *item; + TQString newName; + TQString oldName; +}; + +class AddToolBoxPageCommand : public Command +{ +public: + AddToolBoxPageCommand( const TQString &n, FormWindow *fw, + TQToolBox *tw, const TQString &label ); + + void execute(); + void unexecute(); + Type type() const { return AddToolBoxPage; } + +private: + TQToolBox *toolBox; + int index; + TQWidget *toolBoxPage; + TQString toolBoxLabel; + +}; + +class DeleteToolBoxPageCommand : public Command +{ +public: + DeleteToolBoxPageCommand( const TQString &n, FormWindow *fw, + TQToolBox *tw, TQWidget *page ); + + void execute(); + void unexecute(); + Type type() const { return DeleteToolBoxPage; } + +private: + TQToolBox *toolBox; + int index; + TQWidget *toolBoxPage; + TQString toolBoxLabel; + +}; + +#endif diff --git a/kdevdesigner/designer/configtoolboxdialog.ui b/kdevdesigner/designer/configtoolboxdialog.ui new file mode 100644 index 00000000..226cdd35 --- /dev/null +++ b/kdevdesigner/designer/configtoolboxdialog.ui @@ -0,0 +1,326 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>ConfigToolboxDialog</class> +<comment>********************************************************************* +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ConfigToolboxDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>403</width> + <height>467</height> + </rect> + </property> + <property name="caption"> + <string>Configure Toolbox</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>342</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton4</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>buttonAdd</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Add</string> + </property> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>111</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="TQListView" row="0" column="0" rowspan="1" colspan="2"> + <column> + <property name="text"> + <string>Available Tools</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>listViewTools</cstring> + </property> + <property name="selectionMode"> + <enum>Extended</enum> + </property> + <property name="resizeMode"> + <enum>LastColumn</enum> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQPushButton" row="1" column="0"> + <property name="name"> + <cstring>buttonRemove</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + <widget class="TQListView" row="0" column="0" rowspan="1" colspan="4"> + <column> + <property name="text"> + <string>Common Widgets Page</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>listViewCommon</cstring> + </property> + <property name="selectionMode"> + <enum>Extended</enum> + </property> + <property name="resizeMode"> + <enum>LastColumn</enum> + </property> + </widget> + <widget class="TQToolButton" row="1" column="3"> + <property name="name"> + <cstring>buttonDown</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + </widget> + <spacer row="1" column="1"> + <property name="name"> + <cstring>Spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>41</width> + <height>0</height> + </size> + </property> + </spacer> + <widget class="TQToolButton" row="1" column="2"> + <property name="name"> + <cstring>buttonUp</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + </widget> + </grid> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonAdd</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>addTool()</slot> + </connection> + <connection> + <sender>buttonRemove</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>removeTool()</slot> + </connection> + <connection> + <sender>buttonUp</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>moveToolUp()</slot> + </connection> + <connection> + <sender>buttonDown</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>moveToolDown()</slot> + </connection> + <connection> + <sender>listViewTools</sender> + <signal>clicked(TQListViewItem*)</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>currentToolChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>listViewCommon</sender> + <signal>clicked(TQListViewItem*)</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>currentCommonToolChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>PushButton3</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>PushButton4</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>PushButton3</sender> + <signal>clicked()</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>ok()</slot> + </connection> + <connection> + <sender>listViewTools</sender> + <signal>doubleClicked(TQListViewItem*)</signal> + <receiver>ConfigToolboxDialog</receiver> + <slot>addTool()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">configtoolboxdialog.ui.h</include> +</includes> +<Q_SLOTS> + <slot>addTool()</slot> + <slot>removeTool()</slot> + <slot>moveToolUp()</slot> + <slot>moveToolDown()</slot> + <slot>currentToolChanged( TQListViewItem * i )</slot> + <slot>currentCommonToolChanged( TQListViewItem * i )</slot> + <slot>ok()</slot> +</Q_SLOTS> +<functions> + <function access="private">init()</function> +</functions> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/configtoolboxdialog.ui.h b/kdevdesigner/designer/configtoolboxdialog.ui.h new file mode 100644 index 00000000..7dcd6530 --- /dev/null +++ b/kdevdesigner/designer/configtoolboxdialog.ui.h @@ -0,0 +1,215 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "mainwindow.h" +#include "widgetaction.h" +#include "listviewdnd.h" +#include <tqlistview.h> + +void ConfigToolboxDialog::init() +{ + listViewTools->setSorting( -1 ); + listViewCommon->setSorting( -1 ); + + ListViewDnd *toolsDnd = new ListViewDnd( listViewTools ); + toolsDnd->setDragMode( ListViewDnd::External | ListViewDnd::NullDrop | ListViewDnd::Flat ); + + ListViewDnd *commonDnd = new ListViewDnd( listViewCommon ); + commonDnd->setDragMode( ListViewDnd::Both | ListViewDnd::Move | ListViewDnd::Flat ); + + TQObject::connect( toolsDnd, TQT_SIGNAL( dropped( TQListViewItem * ) ), + commonDnd, TQT_SLOT( confirmDrop( TQListViewItem * ) ) ); + TQObject::connect( commonDnd, TQT_SIGNAL( dropped( TQListViewItem * ) ), + commonDnd, TQT_SLOT( confirmDrop( TQListViewItem * ) ) ); + + TQDict<TQListViewItem> groups; + TQAction *a; + for ( a = MainWindow::self->toolActions.last(); + a; + a = MainWindow::self->toolActions.prev() ) { + TQString grp = ( (WidgetAction*)a )->group(); + TQListViewItem *parent = groups.find( grp ); + if ( !parent ) { + parent = new TQListViewItem( listViewTools ); + parent->setText( 0, grp ); + parent->setOpen( TRUE ); + groups.insert( grp, parent ); + } + TQListViewItem *i = new TQListViewItem( parent ); + i->setText( 0, a->text() ); + i->setPixmap( 0, a->iconSet().pixmap() ); + } + for ( a = MainWindow::self->commonWidgetsPage.last(); a; + a = MainWindow::self->commonWidgetsPage.prev() ) { + TQListViewItem *i = new TQListViewItem( listViewCommon ); + i->setText( 0, a->text() ); + i->setPixmap( 0, a->iconSet().pixmap() ); + } + +} + + +void ConfigToolboxDialog::addTool() +{ + TQListView *src = listViewTools; + + bool addKids = FALSE; + TQListViewItem *nextSibling = 0; + TQListViewItem *nextParent = 0; + TQListViewItemIterator it = src->firstChild(); + for ( ; *it; it++ ) { + // Hit the nextSibling, turn of child processing + if ( (*it) == nextSibling ) + addKids = FALSE; + + if ( (*it)->isSelected() ) { + if ( (*it)->childCount() == 0 ) { + // Selected, no children + TQListViewItem *i = new TQListViewItem( listViewCommon, listViewCommon->lastItem() ); + i->setText( 0, (*it)->text(0) ); + i->setPixmap( 0, *((*it)->pixmap(0)) ); + listViewCommon->setCurrentItem( i ); + listViewCommon->ensureItemVisible( i ); + } else if ( !addKids ) { + // Children processing not set, so set it + // Also find the item were we shall quit + // processing children...if any such item + addKids = TRUE; + nextSibling = (*it)->nextSibling(); + nextParent = (*it)->parent(); + while ( nextParent && !nextSibling ) { + nextSibling = nextParent->nextSibling(); + nextParent = nextParent->parent(); + } + } + } else if ( ((*it)->childCount() == 0) && addKids ) { + // Leaf node, and we _do_ process children + TQListViewItem *i = new TQListViewItem( listViewCommon, listViewCommon->lastItem() ); + i->setText( 0, (*it)->text(0) ); + i->setPixmap( 0, *((*it)->pixmap(0)) ); + listViewCommon->setCurrentItem( i ); + listViewCommon->ensureItemVisible( i ); + } + } +} + + +void ConfigToolboxDialog::removeTool() +{ + TQListViewItemIterator it = listViewCommon->firstChild(); + while ( *it ) { + if ( (*it)->isSelected() ) + delete (*it); + else + it++; + } +} + + +void ConfigToolboxDialog::moveToolUp() +{ + TQListViewItem *next = 0; + TQListViewItem *item = listViewCommon->firstChild(); + for ( int i = 0; i < listViewCommon->childCount(); ++i ) { + next = item->itemBelow(); + if ( item->isSelected() && (i > 0) && !item->itemAbove()->isSelected() ) + item->itemAbove()->moveItem( item ); + item = next; + } +} + + +void ConfigToolboxDialog::moveToolDown() +{ + int count = listViewCommon->childCount(); + TQListViewItem *next = 0; + TQListViewItem *item = listViewCommon->lastItem(); + for ( int i = 0; i < count; ++i ) { + next = item->itemAbove(); + if ( item->isSelected() && (i > 0) && !item->itemBelow()->isSelected() ) + item->moveItem( item->itemBelow() ); + item = next; + } + + // TQListViewItem *item = listViewCommon->firstChild(); + // for ( int i = 0; i < listViewCommon->childCount(); ++i ) { + //if ( item == listViewCommon->currentItem() ) { + // item->moveItem( item->itemBelow() ); + // currentCommonToolChanged( item ); + // break; + //} + //item = item->itemBelow(); + // } +} + + +void ConfigToolboxDialog::currentToolChanged( TQListViewItem *i ) +{ + bool canAdd = FALSE; + TQListViewItemIterator it = listViewTools->firstChild(); + for ( ; *it; it++ ) { + if ( (*it)->isSelected() ) { + canAdd = TRUE; + break; + } + } + buttonAdd->setEnabled( canAdd || ( i && i->isSelected() ) ); +} + + +void ConfigToolboxDialog::currentCommonToolChanged( TQListViewItem *i ) +{ + buttonUp->setEnabled( (bool) (i && i->itemAbove()) ); + buttonDown->setEnabled( (bool) (i && i->itemBelow()) ); + + bool canRemove = FALSE; + TQListViewItemIterator it = listViewCommon->firstChild(); + for ( ; *it; it++ ) { + if ( (*it)->isSelected() ) { + canRemove = TRUE; + break; + } + } + buttonRemove->setEnabled( canRemove || ( i && i->isSelected() ) ); +} + + +void ConfigToolboxDialog::ok() +{ + MainWindow::self->commonWidgetsPage.clear(); + TQListViewItem *item = listViewCommon->firstChild(); + for ( int j = 0; j < listViewCommon->childCount(); item = item->itemBelow(), ++j ) { + TQAction *a = 0; + for ( a = MainWindow::self->toolActions.last(); + a; + a = MainWindow::self->toolActions.prev() ) { + if ( a->text() == item->text( 0 ) ) + break; + } + if ( a ) + MainWindow::self->commonWidgetsPage.insert( j, a ); + } +} diff --git a/kdevdesigner/designer/connectiondialog.ui b/kdevdesigner/designer/connectiondialog.ui new file mode 100644 index 00000000..51995633 --- /dev/null +++ b/kdevdesigner/designer/connectiondialog.ui @@ -0,0 +1,219 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>ConnectionDialog</class> +<comment>********************************************************************* +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ConnectionDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>365</height> + </rect> + </property> + <property name="caption"> + <string>View & Edit Connections</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&New</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>4</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Connections:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>connectionsTable</cstring> + </property> + </widget> + <widget class="TQPushButton" row="2" column="1"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Delete</string> + </property> + </widget> + <widget class="TQPushButton" row="6" column="1"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="TQPushButton" row="5" column="1"> + <property name="name"> + <cstring>PushButton7</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <spacer row="4" column="1"> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="3" column="1"> + <property name="name"> + <cstring>buttonEditSlots</cstring> + </property> + <property name="text"> + <string>&Edit Slots...</string> + </property> + </widget> + <widget class="ConnectionTable" row="1" column="0" rowspan="6" colspan="1"> + <property name="name"> + <cstring>connectionsTable</cstring> + </property> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>ConnectionTable</class> + <header location="local">connectiontable.h</header> + <sizehint> + <width>50</width> + <height>50</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>"image0"</pixmap> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4830">789c9597c972e3480e40eff5158ec2ada203cd3549c6c41cbcc9b6bccabbddd1078014bdcb9b6449ee987f9f240072caac9e4357d6c1cf5812890490f4ef3f562e8ff6577efcfeed7d4ad3bb72a5bca5b7951fd5ece969f9c79ffffeebdbf7285a69fec7f14af4fdb76fdf47d39572e5e079326e00c10304f24ff8b9c7d463ee71d9e3aac7e31ed70d67dc2ce1cb9e7cd0e3c957863eaff778d4b3bfe8c97be781a71eaff5f8e82bf37ecfff4dc314364b58fdb966096ff6ecf77af6b70d1771b3841f1b8ef366099ff7ec17bdf8faf7970847cd12f9b2e344f8b563890f5e3a96fda0ea98c45fdc71299c765c354c67c249bb1fcd3a56ff271d8b3d9d1b271a0f1d742c725874acfe9d70eef3a9f65bc2e47fa3f16a7d55411d6a3e4e1b0e03bf349e8171144a7e49ceeb295239cb79c3384ccdff76c7b23f14c269e8ccdfa9716ef6b5b18f407857d88585e57bbf65b39f18971a0fc8fd7b6fc624f723e524f9e3d2b8d4f391d49ba74ae5bed585a3c8e49b1d6b7c929f701ca5e65feac10b9dd967c2519485a9dcaf33ce952110cea3caec23e53830f9863045b5ca79ae1c8741263cec58eb59ed390ecd3e378e8d651e44651c85527f20f51cd55eae5c1b27a1f823b9bf388c0b65b831a6b090fd24be384bc24098a6d65fb5ca29ed58fd5f35eccbaf34ff320f922819ab3e487e93d4b3d6eb9b711d4abda0f44352a685d5f39d709db2ca296c380dd2c238366ee5605c1acb3c96f2d3feff148ed25aeb0d1e955d60fd22f94a63178632df79d5d8fa95971d8b9cee5b8e647ec1d038567b40e1a4d567a9d73475b1f14ecb5a7f2cf94a9d4b343eba304e357e3814ce5c6afd22f33b2d5c6ee7295bb6fc4abda4e40af3f7d972a4f52df79bb223ebff79cb2a2736e650ce470fc2652b67b9cfb4726dff5d195776bead96adbf1e3bd67a9779928ebbfdc898357f34346ee7c3a0658d07359eba5922d7fbaebd3fdd6f6e3c567d96f9e4c22cb4780a63eb7f90f7c525596cf11c1a2791ce9bd8d869bd93e4dba55eaeefc781b1dd17ee1b9b3e4b3e9dcbfcc4107f9fc671a4ef9dcc139765763fa4f6943965947a7355b3c45eceebc65965fb851deb79655e662ecfcddf93716172999759966791f67f689ceb79e9a363951f1b9b3d1e76acf36fcf98544e529fdebc954b3f67d42ce1eb86f3465df3fb2e5c14a5d53b2b53a0f316773ad6f922f32c2fa9cd9fdc6f5e79d6f8768d13ebc79d96559fe47dcd6b8a63cdcfbb71126bfcd21f45e0f5f57dbb357691c63f342e2cbea063d597f7b808c9e6151e1993c573d1b2de0fc8fd1711151a1fdf187324f393671debfe92df22a134d67e93fb2a1cd93c05630ef4fe48f25d641c683de2b171a8f399ef3a56f989b1bd273c6dd9f697f7bcc85b7dca8da348be4f41fabf2838b1f7e9cc38d5f715e4fd2888439b9f53639ba72cf55a701b3f0c8cad3ff9de38b57c4bfd15a5678d6f646cfd87857166ef95f46b51f9fdf57c609cda7b756edcbee7ceb850a671c7faf7809e7fccb9d63b6c1b93d5f7ac63d5d7fcd41c245a8fabc685e68f1f8c49ef93e5bda4c0fbd7f9b16b4c5a9ff060ccf63e4b3d52c889c6433bc685da33195bbfc2bd31dbfc947aa5982bf37fddb1c623f39c7cbbda7c94f889cac4ea4df24f55c9367fe43da47159da3c907ea39ac74ebfdfe5fe39e0dac9f71f4abed87fb02993d42b475562effb5dcb36ff243fec3f3f327d4fd1384db5ffd68c9db1bc579cb6faf8619cdafe321f39f39f33721fb46bec4cfe699c19cf3bd6f3ad1ae7c6f2de71ce2549fe71a9dcc917c685324b7eb8aac6767ff27dc763cf92afd1b4590848c8586285e3deaafc6fd94b61346df5b1c61bbcc53bbcff9bf5808ff884136ff5acfadef70dbee02bbee13b4e71861f38c7052ef1d3af555cc375dcc04d1c6069fae47dbfe2166ee30e0e7117f7701f0ff0108f7084c77882a77886e7788197a6cf3e922baf7d8d018618618c895f293acc30c702478000403831fdd247f90e8c019450610c63a8e1066efd4f15dcc13d3cc0a3d77f8256bff2fa531cc233bcc02bbcc13b4c61061f3087052ce11356c5ff1aac9bfed8ebcf701736bc741306b005dbb00343d8853def611f0ee0d0eb1fc1e827fd0f38861338f5becfe01c2ee0d26b5ec13504de4708d12ffa7388bd2481141c64907bed020f0909604944fc8bfe924a4ca8a231d5e2fb956ee896eee8deeb3fd0e32ffa0b7ac29426f041fed4f442afdee28dde694a33faa0f9aff1d0829618d327add21aadd3066dfafd06b445dbb443c3be3eedd21eed7bfd033aa4231ad1319dd0299dd1395dd0255dfd8dff6b0a28c4042af27fcc907fafc879ed73ff199053f145bfc207463c666062e6d2dfd9d2db2db9a20b1e73cd377cfbe5be4a5fb1eb7cc7f7fcc08ffcc4137ee6177ee5377ee729cff883e7bcf8a91ed8d7f7069ef1923f7995d7789d37789307bc4557bccd3b3ce45ddefba9defc4fbebecfe1fffce305eff1fe4ff50c3ea2015e00f93dd7fcb9beae35ff5bf2da5dbf788b676f71891398c03a8c7a6b1d267effcbfff5e33fe8f7fffcebdb7f01520e2ea3</data> + </image> +</images> +<connections> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>ConnectionDialog</receiver> + <slot>addConnection()</slot> + </connection> + <connection> + <sender>PushButton7</sender> + <signal>clicked()</signal> + <receiver>ConnectionDialog</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>PushButton3</sender> + <signal>clicked()</signal> + <receiver>ConnectionDialog</receiver> + <slot>cancelClicked()</slot> + </connection> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>ConnectionDialog</receiver> + <slot>deleteClicked()</slot> + </connection> + <connection> + <sender>buttonEditSlots</sender> + <signal>clicked()</signal> + <receiver>ConnectionDialog</receiver> + <slot>editSlots()</slot> + </connection> +</connections> +<includes> + <include location="global" impldecl="in declaration">tqptrlist.h</include> + <include location="local" impldecl="in declaration">connectionitems.h</include> + <include location="local" impldecl="in implementation">connectiondialog.ui.h</include> +</includes> +<variables> + <variable>TQPtrList<ConnectionContainer> connections;</variable> + <variable>TQObject *defaultSender;</variable> + <variable>TQObject *defaultReceiver;</variable> +</variables> +<Q_SLOTS> + <slot>init()</slot> + <slot>addConnection()</slot> + <slot returnType="ConnectionContainer *">addConnection( TQObject * sender, TQObject * receiver, const TQString & signal, const TQString & slot )</slot> + <slot>updateConnectionState( ConnectionContainer * c )</slot> + <slot>okClicked()</slot> + <slot>cancelClicked()</slot> + <slot>deleteClicked()</slot> + <slot>editSlots()</slot> + <slot>setDefault( TQObject * sender, TQObject * receiver )</slot> + <slot>updateEditSlotsButton()</slot> + <slot>updateConnectionContainers()</slot> + <slot>ensureConnectionVisible()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/connectiondialog.ui.h b/kdevdesigner/designer/connectiondialog.ui.h new file mode 100644 index 00000000..25a5d5f2 --- /dev/null +++ b/kdevdesigner/designer/connectiondialog.ui.h @@ -0,0 +1,318 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename slots use TQt Designer which will +** update this file, preserving your code. Create an init() slot in place of +** a constructor, and a destroy() slot in place of a destructor. +*****************************************************************************/ + +#include "mainwindow.h" +#include "formwindow.h" +#include "editfunctionsimpl.h" + +static const char *valid_connection[] = { + "16 14 7 1", + ". c none", + "# c #00c000", + "a c #008000", + "b c #004000", + "c c #000000", + "d c #c0fcc0", + "e c #400000", + "...............d", + "..............d#", + ".............d#a", + "............d#ab", + "...........d#abc", + "..da......d#abc.", + ".d##a....d#abe..", + "cba##a..d#abc...", + ".cba##ad#abe....", + "..eba###abe.....", + "...cba#abc......", + "....cbabc.......", + ".....cec........", + "................" +}; + +static const char * invalid_connection[] = { + "17 18 7 1", + " c None", + ". c #000000", + "+ c #C3C3C3", + "@ c #FFFFFF", + "# c #C00000", + "$ c #FFC0C0", + "% c #FF0000", + " ", + " . ", + " ... ", + " .+.. ", + " ...+@+.. ", + "..+@@@+#.. ", + ".@@@@$#%#.. ", + ".@@$$#%##.. ", + " .$%%%##.... ", + " .%%%##. .. ", + " .%#.. .. ", + " .. .. ", + " .. ", + " .. ", + " .. ", + " .. ", + " ", + " " +}; + +static TQPixmap *invalidConnection = 0; +static TQPixmap *validConnection = 0; + +void ConnectionDialog::init() +{ + connect( connectionsTable, TQT_SIGNAL( currentChanged( int, int ) ), + this, TQT_SLOT( updateEditSlotsButton() ) ); + connect( connectionsTable, TQT_SIGNAL( resorted() ), + this, TQT_SLOT( updateConnectionContainers() ) ); + buttonEditSlots->setEnabled( FALSE ); + + if ( !invalidConnection ) { + invalidConnection = new TQPixmap( invalid_connection ); + validConnection = new TQPixmap( valid_connection ); + } + + TQValueList<MetaDataBase::Connection> conns = + MetaDataBase::connections( TQT_TQOBJECT(MainWindow::self->formWindow()) ); + for ( TQValueList<MetaDataBase::Connection>::Iterator it = conns.begin(); + it != conns.end(); ++it ) { + ConnectionContainer *c = addConnection( (*it).sender, (*it).receiver, + (*it).signal, (*it).slot ); + c->setModified( FALSE ); + updateConnectionState( c ); + } + + defaultSender = defaultReceiver = 0; + connectionsTable->setCurrentCell( 0, 0 ); +} + +void ConnectionDialog::addConnection() +{ + addConnection( defaultSender, defaultReceiver, TQString(), TQString() ); + ensureConnectionVisible(); +} + +ConnectionContainer *ConnectionDialog::addConnection( TQObject *sender, TQObject *receiver, + const TQString &signal, + const TQString &slot ) +{ + connectionsTable->insertRows( connectionsTable->numRows() ); + + int row = connectionsTable->numRows() - 1; + SenderItem *se; + SignalItem *si; + ReceiverItem *re; + SlotItem *sl; + connectionsTable->setItem( row, 0, + ( se = new SenderItem( connectionsTable, + MainWindow::self->formWindow() ) ) ); + connectionsTable->setItem( row, 1, + ( si = new SignalItem( connectionsTable, + MainWindow::self->formWindow() ) ) ); + connectionsTable->setItem( row, 2, + ( re = new ReceiverItem( connectionsTable, + MainWindow::self->formWindow() ) ) ); + connectionsTable->setItem( row, 3, + ( sl = new SlotItem( connectionsTable, + MainWindow::self->formWindow() ) ) ); + + si->setSender( se ); + re->setSender( se ); + sl->setSender( se ); + se->setSender( se ); + + se->setSignal( si ); + re->setSignal( si ); + sl->setSignal( si ); + si->setSignal( si ); + + se->setReceiver( re ); + si->setReceiver( re ); + sl->setReceiver( re ); + re->setReceiver( re ); + + se->setSlot( sl ); + si->setSlot( sl ); + re->setSlot( sl ); + sl->setSlot( sl ); + + connect( re, TQT_SIGNAL( currentReceiverChanged( TQObject * ) ), + this, TQT_SLOT( updateEditSlotsButton() ) ); + + ConnectionContainer *c = new ConnectionContainer( TQT_TQOBJECT(this), se, si, re, sl, row ); + connections.append( c ); + connect( c, TQT_SIGNAL( changed( ConnectionContainer * ) ), + this, TQT_SLOT( updateConnectionState( ConnectionContainer * ) ) ); + + connectionsTable->setCurrentCell( row, 0 ); + + connectionsTable->verticalHeader()->setLabel( row, *invalidConnection, TQString() ); + + if ( sender ) + se->setSenderEx( sender ); + defaultSender = sender; + if ( receiver ) + re->setReceiverEx( receiver ); + defaultReceiver = receiver; + + if ( !signal.isEmpty() && !slot.isEmpty() ) { + si->setCurrentItem( signal ); + sl->signalChanged( signal ); + sl->setCurrentItem( slot ); + } + + c->setModified( TRUE ); + return c; +} + +void ConnectionDialog::updateConnectionState( ConnectionContainer *c ) +{ + c->repaint(); + if ( c->isValid() ) + connectionsTable->verticalHeader()->setLabel( c->row(), + *validConnection, TQString() ); + else + connectionsTable->verticalHeader()->setLabel( c->row(), + *invalidConnection, TQString() ); +} + + +void ConnectionDialog::okClicked() +{ + TQValueList<MetaDataBase::Connection> oldConnections = + MetaDataBase::connections( TQT_TQOBJECT(MainWindow::self->formWindow()) ); + TQPtrList<Command> newConnectionCmds; + TQPtrList<Command> oldConnectionCmds; + for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) { + MetaDataBase::Connection conn; + + // find sender widget + conn.sender = MainWindow::self->formWindow()->child( c->senderItem()->currentText() ); + if ( !conn.sender ) // if no sender widget, find sender action + conn.sender = MainWindow::self->formWindow()->findAction( c->senderItem()->currentText() ); + + // find receiver widget + conn.receiver = MainWindow::self->formWindow()->child( c->receiverItem()->currentText() ); + if ( !conn.receiver ) // if no receiver widget, find receiver action + conn.receiver = MainWindow::self->formWindow()->findAction( c->receiverItem()->currentText() ); + + conn.signal = c->signalItem()->currentText(); + conn.slot = c->slotItem()->currentText(); + AddConnectionCommand *cmd = new AddConnectionCommand( i18n( "Add Signal/Slot " + "Connection" ), + MainWindow::self->formWindow(), + conn ); + newConnectionCmds.append( cmd ); + } + + + TQValueList<MetaDataBase::Connection> conns = + MetaDataBase::connections( TQT_TQOBJECT(MainWindow::self->formWindow()) ); + for ( TQValueList<MetaDataBase::Connection>::Iterator it = conns.begin(); + it != conns.end(); ++it ) { + RemoveConnectionCommand *cmd = new RemoveConnectionCommand( i18n( "Remove Signal/Slot " + "Connection" ), + MainWindow::self-> + formWindow(), *it ); + oldConnectionCmds.append( cmd ); + } + + MacroCommand *cmd1 = new MacroCommand( i18n( "Add Signal/Slot Connections" ), + MainWindow::self->formWindow(), + newConnectionCmds ); + MacroCommand *cmd2 = new MacroCommand( i18n( "Remove Signal/Slot Connections" ), + MainWindow::self->formWindow(), + oldConnectionCmds ); + TQPtrList<Command> cmds; + cmds.append( cmd2 ); + cmds.append( cmd1 ); + MacroCommand *cmd = new MacroCommand( i18n( "Edit Signal/Slot Connections" ), + MainWindow::self->formWindow(), + cmds ); + MainWindow::self->formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + + accept(); +} + + +void ConnectionDialog::cancelClicked() +{ + reject(); +} + + +void ConnectionDialog::deleteClicked() +{ + int cr = connectionsTable->currentRow(); + connections.remove( cr ); + connectionsTable->removeRow( cr ); + int i = 0; + for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) + c->setRow( i++ ); +} + + +void ConnectionDialog::editSlots() +{ + EditFunctions dlg( this, MainWindow::self->formWindow(), TRUE ); + dlg.exec(); + int currentCol = connectionsTable->currentColumn(); + connectionsTable->setCurrentCell( connectionsTable->currentRow(), 0 ); + for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) { + if ( c->receiverItem()->currentText() != + TQString( MainWindow::self->formWindow()->mainContainer()->name() ) ) + continue; + c->slotItem()->customSlotsChanged(); + } + connectionsTable->setCurrentCell( connectionsTable->currentRow(), currentCol ); +} + +void ConnectionDialog::setDefault( TQObject *sender, TQObject *receiver ) +{ + defaultSender = sender; + defaultReceiver = receiver; +} + +void ConnectionDialog::updateEditSlotsButton() +{ + if ( connectionsTable->currentRow() < 0 || + connectionsTable->currentRow() > (int)connections.count() - 1 ) + return; + ConnectionContainer *c = connections.at( connectionsTable->currentRow() ); + if ( !c || !c->receiverItem() ) + return; + buttonEditSlots->setEnabled( c->receiverItem()->currentText() == + TQString( MainWindow::self->formWindow()-> + mainContainer()->name() ) ); +} + +void ConnectionDialog::updateConnectionContainers() +{ + TQPtrList<ConnectionContainer> newContainers; + for ( int i = 0; i < connectionsTable->numRows(); ++i ) { + for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) { + if ( c->senderItem() == connectionsTable->item( i, 0 ) ) { + newContainers.append( c ); + c->setRow( i ); + updateConnectionState(c); + break; + } + } + } + connections = newContainers; + updateEditSlotsButton(); +} + +void ConnectionDialog::ensureConnectionVisible() +{ + connectionsTable->ensureCellVisible( connectionsTable->numRows() - 1, 0 ); +} diff --git a/kdevdesigner/designer/connectionitems.cpp b/kdevdesigner/designer/connectionitems.cpp new file mode 100644 index 00000000..12b03a1d --- /dev/null +++ b/kdevdesigner/designer/connectionitems.cpp @@ -0,0 +1,517 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "connectionitems.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "metadatabase.h" +#include "widgetfactory.h" +#include "project.h" +#include <tqpainter.h> +#include <tqcombobox.h> +#include <tqmetaobject.h> +#include <tqcombobox.h> +#include <tqlistbox.h> +#include <tqaction.h> +#include <tqdatabrowser.h> + +static const char* const ignore_slots[] = { + "destroyed()", + "setCaption(const TQString&)", + "setIcon(const TQPixmap&)", + "setIconText(const TQString&)", + "setMouseTracking(bool)", + "clearFocus()", + "setUpdatesEnabled(bool)", + "update()", + "update(int,int,int,int)", + "update(const TQRect&)", + "repaint()", + "repaint(bool)", + "repaint(int,int,int,int,bool)", + "repaint(const TQRect&,bool)", + "repaint(const TQRegion&,bool)", + "show()", + "hide()", + "iconify()", + "showMinimized()", + "showMaximized()", + "showFullScreen()", + "showNormal()", + "polish()", + "constPolish()", + "raise()", + "lower()", + "stackUnder(TQWidget*)", + "move(int,int)", + "move(const TQPoint&)", + "resize(int,int)", + "resize(const TQSize&)", + "setGeometry(int,int,int,int)", + "setGeometry(const TQRect&)", + "focusProxyDestroyed()", + "showExtension(bool)", + "setUpLayout()", + "showDockMenu(const TQPoint&)", + "init()", + "destroy()", + "deleteLater()", + 0 +}; + +ConnectionItem::ConnectionItem( TQTable *table, FormWindow *fw ) + : TQComboTableItem( table, TQStringList(), FALSE ), formWindow( fw ), conn( 0 ) +{ + setReplaceable( FALSE ); +} + +void ConnectionItem::senderChanged( TQObject * ) +{ + emit changed(); + TQWidget *w = table()->cellWidget( row(), col() ); + if ( w ) + setContentFromEditor( w ); +} + +void ConnectionItem::receiverChanged( TQObject * ) +{ + emit changed(); + TQWidget *w = table()->cellWidget( row(), col() ); + if ( w ) + setContentFromEditor( w ); +} + +void ConnectionItem::signalChanged( const TQString & ) +{ + emit changed(); + TQWidget *w = table()->cellWidget( row(), col() ); + if ( w ) + setContentFromEditor( w ); +} + +void ConnectionItem::slotChanged( const TQString & ) +{ + emit changed(); + TQWidget *w = table()->cellWidget( row(), col() ); + if ( w ) + setContentFromEditor( w ); +} + +void ConnectionItem::setSender( SenderItem *i ) +{ + connect( i, TQT_SIGNAL( currentSenderChanged( TQObject * ) ), + this, TQT_SLOT( senderChanged( TQObject * ) ) ); +} + +void ConnectionItem::setReceiver( ReceiverItem *i ) +{ + connect( i, TQT_SIGNAL( currentReceiverChanged( TQObject * ) ), + this, TQT_SLOT( receiverChanged( TQObject * ) ) ); +} + +void ConnectionItem::setSignal( SignalItem *i ) +{ + connect( i, TQT_SIGNAL( currentSignalChanged( const TQString & ) ), + this, TQT_SLOT( signalChanged( const TQString & ) ) ); +} + +void ConnectionItem::setSlot( SlotItem *i ) +{ + connect( i, TQT_SIGNAL( currentSlotChanged( const TQString & ) ), + this, TQT_SLOT( slotChanged( const TQString & ) ) ); +} + +void ConnectionItem::paint( TQPainter *p, const TQColorGroup &cg, + const TQRect &cr, bool selected ) +{ + p->fillRect( 0, 0, cr.width(), cr.height(), + selected ? cg.brush( TQColorGroup::Highlight ) + : cg.brush( TQColorGroup::Base ) ); + + int w = cr.width(); + int h = cr.height(); + + int x = 0; + + if ( currentText()[0] == '<' ) + p->setPen( TQObject::red ); + else if ( selected ) + p->setPen( cg.highlightedText() ); + else + p->setPen( cg.text() ); + + TQFont f( p->font() ); + TQFont oldf( p->font() ); + if ( conn && conn->isModified() ) { + f.setBold( TRUE ); + p->setFont( f ); + } + + p->drawText( x + 2, 0, w - x - 4, h, alignment(), currentText() ); + p->setFont( oldf ); +} + +void ConnectionItem::setConnection( ConnectionContainer *c ) +{ + conn = c; +} + +// ------------------------------------------------------------------ + +static void appendChildActions( TQAction *action, TQStringList &lst ) +{ + TQObjectListIt it( action->childrenListObject() ); + while ( it.current() ) { + TQObject *o = it.current(); + ++it; + if ( !::tqqt_cast<TQAction*>(o) ) + continue; + lst << o->name(); + if ( !o->childrenListObject().isEmpty() && ::tqqt_cast<TQActionGroup*>(o) ) + appendChildActions( (TQAction*)o, lst ); + } +} + +static TQStringList flatActions( const TQPtrList<TQAction> &l ) +{ + TQStringList lst; + + TQPtrListIterator<TQAction> it( l ); + while ( it.current() ) { + TQAction *action = it.current(); + lst << action->name(); + if ( !action->childrenListObject().isEmpty() && ::tqqt_cast<TQActionGroup*>(action) ) + appendChildActions( action, lst ); + ++it; + } + + return lst; +} + +// ------------------------------------------------------------------ + +SenderItem::SenderItem( TQTable *table, FormWindow *fw ) + : ConnectionItem( table, fw ) +{ + TQStringList lst; + + TQPtrDictIterator<TQWidget> it( *formWindow->widgets() ); + while ( it.current() ) { + if ( lst.find( it.current()->name() ) != lst.end() ) { + ++it; + continue; + } + if ( !TQString( it.current()->name() ).startsWith( "qt_dead_widget_" ) && + !::tqqt_cast<TQLayoutWidget*>(it.current()) && + !::tqqt_cast<Spacer*>(it.current()) && + !::tqqt_cast<SizeHandle*>(it.current()) && + qstrcmp( it.current()->name(), "central widget" ) != 0 ) { + lst << it.current()->name(); + } + ++it; + } + + lst += flatActions( formWindow->actionList() ); + + lst.prepend( "<No Sender>" ); + lst.sort(); + setStringList( lst ); +} + +TQWidget *SenderItem::createEditor() const +{ + TQComboBox *cb = (TQComboBox*)ConnectionItem::createEditor(); + cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) ); + connect( cb, TQT_SIGNAL( activated( const TQString & ) ), + this, TQT_SLOT( senderChanged( const TQString & ) ) ); + return cb; +} + +void SenderItem::setSenderEx( TQObject *sender ) +{ + setCurrentItem( sender->name() ); + emit currentSenderChanged( sender ); +} + +void SenderItem::senderChanged( const TQString &sender ) +{ + TQObject *o = formWindow->child( sender, TQOBJECT_OBJECT_NAME_STRING ); + if ( !o ) + o = formWindow->findAction( sender ); + if ( !o ) + return; + emit currentSenderChanged( o ); +} + + + +// ------------------------------------------------------------------ + +ReceiverItem::ReceiverItem( TQTable *table, FormWindow *fw ) + : ConnectionItem( table, fw ) +{ + TQStringList lst; + + TQPtrDictIterator<TQWidget> it( *formWindow->widgets() ); + while ( it.current() ) { + if ( lst.find( it.current()->name() ) != lst.end() ) { + ++it; + continue; + } + if ( !TQString( it.current()->name() ).startsWith( "qt_dead_widget_" ) && + !::tqqt_cast<TQLayoutWidget*>(it.current()) && + !::tqqt_cast<Spacer*>(it.current()) && + !::tqqt_cast<SizeHandle*>(it.current()) && + qstrcmp( it.current()->name(), "central widget" ) != 0 ) { + lst << it.current()->name(); + } + ++it; + } + + lst += flatActions( formWindow->actionList() ); + + lst.prepend( "<No Receiver>" ); + lst.sort(); + setStringList( lst ); +} + +TQWidget *ReceiverItem::createEditor() const +{ + TQComboBox *cb = (TQComboBox*)ConnectionItem::createEditor(); + cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) ); + connect( cb, TQT_SIGNAL( activated( const TQString & ) ), + this, TQT_SLOT( receiverChanged( const TQString & ) ) ); + return cb; +} + +void ReceiverItem::setReceiverEx( TQObject *receiver ) +{ + setCurrentItem( receiver->name() ); + emit currentReceiverChanged( receiver ); +} + +void ReceiverItem::receiverChanged( const TQString &receiver ) +{ + TQObject *o = formWindow->child( receiver, TQOBJECT_OBJECT_NAME_STRING ); + if ( !o ) + o = formWindow->findAction( receiver ); + if ( !o ) + return; + emit currentReceiverChanged( o ); +} + + + +// ------------------------------------------------------------------ + +SignalItem::SignalItem( TQTable *table, FormWindow *fw ) + : ConnectionItem( table, fw ) +{ + TQStringList lst; + lst << "<No Signal>"; + lst.sort(); + setStringList( lst ); +} + +void SignalItem::senderChanged( TQObject *sender ) +{ + TQStrList sigs = sender->metaObject()->signalNames( TRUE ); + sigs.remove( "destroyed()" ); + sigs.remove( "destroyed(TQObject*)" ); + sigs.remove( "accessibilityChanged(int)" ); + sigs.remove( "accessibilityChanged(int,int)" ); + + TQStringList lst = TQStringList::fromStrList( sigs ); + + if ( ::tqqt_cast<CustomWidget*>(sender) ) { + MetaDataBase::CustomWidget *w = ( (CustomWidget*)sender )->customWidget(); + for ( TQValueList<TQCString>::Iterator it = w->lstSignals.begin(); + it != w->lstSignals.end(); ++it ) + lst << MetaDataBase::normalizeFunction( *it ); + } + + if ( TQT_BASE_OBJECT(sender) == TQT_BASE_OBJECT(formWindow->mainContainer()) ) { + TQStringList extra = MetaDataBase::signalList( TQT_TQOBJECT(formWindow) ); + if ( !extra.isEmpty() ) + lst += extra; + } + + lst.prepend( "<No Signal>" ); + + lst.sort(); + setStringList( lst ); + + ConnectionItem::senderChanged( sender ); +} + +TQWidget *SignalItem::createEditor() const +{ + TQComboBox *cb = (TQComboBox*)ConnectionItem::createEditor(); + cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) ); + connect( cb, TQT_SIGNAL( activated( const TQString & ) ), + this, TQT_SIGNAL( currentSignalChanged( const TQString & ) ) ); + return cb; +} + +// ------------------------------------------------------------------ + +SlotItem::SlotItem( TQTable *table, FormWindow *fw ) + : ConnectionItem( table, fw ) +{ + TQStringList lst; + lst << "<No Slot>"; + lst.sort(); + setStringList( lst ); + + lastReceiver = 0; + lastSignal = "<No Signal>"; +} + +void SlotItem::receiverChanged( TQObject *receiver ) +{ + lastReceiver = receiver; + updateSlotList(); + ConnectionItem::receiverChanged( receiver ); +} + +void SlotItem::signalChanged( const TQString &signal ) +{ + lastSignal = signal; + updateSlotList(); + ConnectionItem::signalChanged( signal ); +} + +bool SlotItem::ignoreSlot( const char* slot ) const +{ +#ifndef TQT_NO_SQL + if ( qstrcmp( slot, "update()" ) == 0 && + ::tqqt_cast<TQDataBrowser*>(lastReceiver) ) + return FALSE; +#endif + + for ( int i = 0; ignore_slots[i]; i++ ) { + if ( qstrcmp( slot, ignore_slots[i] ) == 0 ) + return TRUE; + } + + if ( !formWindow->isMainContainer( TQT_TQOBJECT(lastReceiver) ) ) { + if ( qstrcmp( slot, "close()" ) == 0 ) + return TRUE; + } + + if ( qstrcmp( slot, "setFocus()" ) == 0 ) + if ( lastReceiver->isWidgetType() && + ( (TQWidget*)lastReceiver )->focusPolicy() == TQ_NoFocus ) + return TRUE; + + return FALSE; +} + +void SlotItem::updateSlotList() +{ + TQStringList lst; + if ( !lastReceiver || lastSignal == "<No Signal>" ) { + lst << "<No Slot>"; + lst.sort(); + setStringList( lst ); + return; + } + + TQString signal = MetaDataBase::normalizeFunction( lastSignal ); + int n = lastReceiver->metaObject()->numSlots( TRUE ); + TQStringList slts; + + for( int i = 0; i < n; ++i ) { + // accept only public slots. For the form window, also accept protected slots + const TQMetaData* md = lastReceiver->metaObject()->slot( i, TRUE ); + if ( ( (lastReceiver->metaObject()->slot( i, TRUE )->tqt_mo_access == TQMetaData::Public) || + (formWindow->isMainContainer( TQT_TQOBJECT(lastReceiver) ) && + lastReceiver->metaObject()->slot(i, TRUE)->tqt_mo_access == + TQMetaData::Protected) ) && + !ignoreSlot( md->tqt_mo_ci_name ) && + checkConnectArgs( signal.latin1(), lastReceiver, md->tqt_mo_ci_name ) ) + if ( lst.find( md->tqt_mo_ci_name ) == lst.end() ) + lst << MetaDataBase::normalizeFunction( md->tqt_mo_ci_name ); + } + + LanguageInterface *iface = + MetaDataBase::languageInterface( formWindow->project()->language() ); + if ( !iface || iface->supports( LanguageInterface::ConnectionsToCustomSlots ) ) { + if ( formWindow->isMainContainer( TQT_TQOBJECT(lastReceiver) ) ) { + TQValueList<MetaDataBase::Function> moreSlots = MetaDataBase::slotList( TQT_TQOBJECT(formWindow) ); + if ( !moreSlots.isEmpty() ) { + for ( TQValueList<MetaDataBase::Function>::Iterator it = moreSlots.begin(); + it != moreSlots.end(); ++it ) { + TQCString s = (*it).function; + if ( !s.data() ) + continue; + s = MetaDataBase::normalizeFunction( s ); + if ( checkConnectArgs( signal.latin1(), lastReceiver, s ) ) { + if ( lst.find( (*it).function ) == lst.end() ) + lst << s; + } + } + } + } + } + + if ( ::tqqt_cast<CustomWidget*>(lastReceiver) ) { + MetaDataBase::CustomWidget *w = ( (CustomWidget*)lastReceiver )->customWidget(); + for ( TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); + it != w->lstSlots.end(); ++it ) { + TQCString s = (*it).function; + if ( !s.data() ) + continue; + s = MetaDataBase::normalizeFunction( s ); + if ( checkConnectArgs( signal.latin1(), lastReceiver, s ) ) { + if ( lst.find( (*it).function ) == lst.end() ) + lst << s; + } + } + } + + lst.prepend( "<No Slot>" ); + lst.sort(); + setStringList( lst ); +} + +TQWidget *SlotItem::createEditor() const +{ + TQComboBox *cb = (TQComboBox*)ConnectionItem::createEditor(); + cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) ); + connect( cb, TQT_SIGNAL( activated( const TQString & ) ), + this, TQT_SIGNAL( currentSlotChanged( const TQString & ) ) ); + return cb; +} + +void SlotItem::customSlotsChanged() +{ + TQString currSlot = currentText(); + updateSlotList(); + setCurrentItem( "<No Slot>" ); + setCurrentItem( currSlot ); + emit currentSlotChanged( currentText() ); +} diff --git a/kdevdesigner/designer/connectionitems.h b/kdevdesigner/designer/connectionitems.h new file mode 100644 index 00000000..fe5e276d --- /dev/null +++ b/kdevdesigner/designer/connectionitems.h @@ -0,0 +1,226 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef CONNECTIONITEMS_H +#define CONNECTIONITEMS_H + +class FormWindow; + +#include <tqtable.h> + +class SenderItem; +class ReceiverItem; +class SignalItem; +class SlotItem; +class ConnectionContainer; + + +class ConnectionItem : public TQObject, + public TQComboTableItem +{ + Q_OBJECT + + +public: + ConnectionItem( TQTable *table, FormWindow *fw ); + + void paint( TQPainter *p, const TQColorGroup &cg, + const TQRect &cr, bool selected ); + + void setSender( SenderItem *i ); + void setReceiver( ReceiverItem *i ); + void setSignal( SignalItem *i ); + void setSlot( SlotItem *i ); + void setConnection( ConnectionContainer *c ); + +public slots: + virtual void senderChanged( TQObject *sender ); + virtual void receiverChanged( TQObject *receiver ); + virtual void signalChanged( const TQString &sig ); + virtual void slotChanged( const TQString &slot ); + +signals: + void changed(); + +protected: + FormWindow *formWindow; + +private: + ConnectionContainer *conn; + +}; + +// ------------------------------------------------------------------ + +class SenderItem : public ConnectionItem +{ + Q_OBJECT + + +public: + SenderItem( TQTable *table, FormWindow *fw ); + TQWidget *createEditor() const; + void setSenderEx( TQObject *sender ); + +signals: + void currentSenderChanged( TQObject *sender ); + +private slots: + void senderChanged( const TQString &sender ); + +}; + +// ------------------------------------------------------------------ + +class ReceiverItem : public ConnectionItem +{ + Q_OBJECT + + +public: + ReceiverItem( TQTable *table, FormWindow *fw ); + TQWidget *createEditor() const; + void setReceiverEx( TQObject *receiver ); + +signals: + void currentReceiverChanged( TQObject *receiver ); + +private slots: + void receiverChanged( const TQString &receiver ); + +}; + +// ------------------------------------------------------------------ + +class SignalItem : public ConnectionItem +{ + Q_OBJECT + + +public: + SignalItem( TQTable *table, FormWindow *fw ); + + void senderChanged( TQObject *sender ); + TQWidget *createEditor() const; + +signals: + void currentSignalChanged( const TQString & ); + +}; + +// ------------------------------------------------------------------ + +class SlotItem : public ConnectionItem +{ + Q_OBJECT + + +public: + SlotItem( TQTable *table, FormWindow *fw ); + + void receiverChanged( TQObject *receiver ); + void signalChanged( const TQString &signal ); + TQWidget *createEditor() const; + + void customSlotsChanged(); + +signals: + void currentSlotChanged( const TQString & ); + +private: + void updateSlotList(); + bool ignoreSlot( const char* slot ) const; + +private: + TQObject *lastReceiver; + TQString lastSignal; + +}; + +// ------------------------------------------------------------------ + +class ConnectionContainer : public TQObject +{ + Q_OBJECT + + +public: + ConnectionContainer( TQObject *parent, SenderItem *i1, SignalItem *i2, + ReceiverItem *i3, SlotItem *i4, int r ) + : TQObject( parent ), mod( FALSE ), se( i1 ), si( i2 ), + re( i3 ), sl( i4 ), rw ( r ) { + i1->setConnection( this ); + i2->setConnection( this ); + i3->setConnection( this ); + i4->setConnection( this ); + connect( i1, TQT_SIGNAL( changed() ), this, TQT_SLOT( somethingChanged() ) ); + connect( i2, TQT_SIGNAL( changed() ), this, TQT_SLOT( somethingChanged() ) ); + connect( i3, TQT_SIGNAL( changed() ), this, TQT_SLOT( somethingChanged() ) ); + connect( i4, TQT_SIGNAL( changed() ), this, TQT_SLOT( somethingChanged() ) ); + } + + bool isModified() const { return mod; } + void setModified( bool b ) { mod = b; repaint(); } + bool isValid() const { + return se->currentText()[0] != '<' && + si->currentText()[0] != '<' && + re->currentText()[0] != '<' && + sl->currentText()[0] != '<'; + } + + void repaint() { + se->table()->updateCell( se->row(), se->col() ); + si->table()->updateCell( si->row(), si->col() ); + re->table()->updateCell( re->row(), re->col() ); + sl->table()->updateCell( sl->row(), sl->col() ); + } + + int row() const { return rw; } + void setRow( int r ) { rw = r; } + + SenderItem *senderItem() const { return se; } + SignalItem *signalItem() const { return si; } + ReceiverItem *receiverItem() const { return re; } + SlotItem *slotItem() const { return sl; } + +public slots: + void somethingChanged() { mod = TRUE; emit changed( this ); } + +signals: + void changed( ConnectionContainer *c ); + +private: + bool mod; + SenderItem *se; + SignalItem *si; + ReceiverItem *re; + SlotItem *sl; + int rw; + +}; + + +#endif diff --git a/kdevdesigner/designer/connectiontable.cpp b/kdevdesigner/designer/connectiontable.cpp new file mode 100644 index 00000000..834fdc96 --- /dev/null +++ b/kdevdesigner/designer/connectiontable.cpp @@ -0,0 +1,56 @@ + /********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "connectiontable.h" + +#include <tdelocale.h> + +ConnectionTable::ConnectionTable( TQWidget *parent, const char *name ) + : TQTable( 0, 4, parent, name ) +{ + setSorting( TRUE ); + setShowGrid( FALSE ); + setFocusStyle( FollowStyle ); + setSelectionMode( SingleRow ); + horizontalHeader()->setLabel( 0, i18n( "Sender" ) ); + horizontalHeader()->setLabel( 1, i18n( "Signal" ) ); + horizontalHeader()->setLabel( 2, i18n( "Receiver" ) ); + horizontalHeader()->setLabel( 3, i18n( "Slot" ) ); + setColumnStretchable( 0, TRUE ); + setColumnStretchable( 1, TRUE ); + setColumnStretchable( 2, TRUE ); + setColumnStretchable( 3, TRUE ); +} + +void ConnectionTable::sortColumn( int col, bool ascending, bool ) +{ + horizontalHeader()->setSortIndicator( col, ascending ); + if ( isEditing() ) + endEdit( currEditRow(), currEditCol(), FALSE, FALSE ); + TQTable::sortColumn( col, ascending, TRUE ); + setCurrentCell( 0, 0 ); + emit resorted(); +} diff --git a/kdevdesigner/designer/connectiontable.h b/kdevdesigner/designer/connectiontable.h new file mode 100644 index 00000000..60b84426 --- /dev/null +++ b/kdevdesigner/designer/connectiontable.h @@ -0,0 +1,47 @@ + /********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef CONNECTIONTABLE_H +#define CONNECTIONTABLE_H + +#include <tqtable.h> + +class ConnectionTable : public TQTable +{ + Q_OBJECT + + +public: + ConnectionTable( TQWidget *parent, const char *name ); + + void sortColumn( int col, bool ascending, bool wholeRows ); + +signals: + void resorted(); + +}; + +#endif diff --git a/kdevdesigner/designer/createtemplate.ui b/kdevdesigner/designer/createtemplate.ui new file mode 100644 index 00000000..e03340b1 --- /dev/null +++ b/kdevdesigner/designer/createtemplate.ui @@ -0,0 +1,195 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>CreateTemplate</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>CreateTemplate</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>347</width> + <height>248</height> + </rect> + </property> + <property name="caption"> + <string>Create Template</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>Template &name:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editName</cstring> + </property> + </widget> + <widget class="KLineEdit" row="0" column="1"> + <property name="name"> + <cstring>editName</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Name of the new template</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Enter the name of the new template</string> + </property> + </widget> + <widget class="TQListBox" row="1" column="1" rowspan="2" colspan="1"> + <property name="name"> + <cstring>listClass</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Class of the new template</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Enter the name of the class which should be used as the template's base class</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCreate</cstring> + </property> + <property name="text"> + <string>C&reate</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Creates the new template</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Closes the Dialog</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>&Baseclass for template:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>listClass</cstring> + </property> + </widget> + <spacer row="2" column="0"> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>buttonCreate</sender> + <signal>clicked()</signal> + <receiver>CreateTemplate</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>CreateTemplate</receiver> + <slot>reject()</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>klineedit.h</includehint> +</includehints> +</UI> diff --git a/kdevdesigner/designer/customwidgeteditor.ui b/kdevdesigner/designer/customwidgeteditor.ui new file mode 100644 index 00000000..db6860f0 --- /dev/null +++ b/kdevdesigner/designer/customwidgeteditor.ui @@ -0,0 +1,1378 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>CustomWidgetEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>CustomWidgetEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>712</width> + <height>386</height> + </rect> + </property> + <property name="caption"> + <string>Edit Custom Widgets</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Edit Custom Widgets</b><p>Add or delete custom widgets from <i>Qt Designer</i>'s database, and edit the properties of existing widgets.</p></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListBox" row="0" column="0" rowspan="5" colspan="1"> + <property name="name"> + <cstring>boxWidgets</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>The list of all custom widgets known to Qt Designer.</string> + </property> + </widget> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>buttonNewWidget</cstring> + </property> + <property name="text"> + <string>&New Widget</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add new custom widget.</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Create an empty custom widget and add it to the list.</b><p>New custom widgets have a default name and header file, which must both be changed to appropriate values.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>buttonDeleteWidget</cstring> + </property> + <property name="text"> + <string>&Delete Widget</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete custom widget</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the selected custom widget.</b><p>You can only delete widgets that are not used in any open form.</p></string> + </property> + </widget> + <widget class="TQLayoutWidget" row="5" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Closes the Dialog.</string> + </property> + </widget> + </hbox> + </widget> + <spacer row="2" column="1"> + <property name="name"> + <cstring>Vertical Spacing1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="3" column="1"> + <property name="name"> + <cstring>buttonLoad</cstring> + </property> + <property name="text"> + <string>&Load Descriptions...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Loads widget description file</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Load Descriptions</b><p>Loads a file which contains descriptions of custom widgets, so that these custom widgets can be used in the Qt Designer.</p> +<p>Since it is a lot of work to type in all the information for custom widgets, you should consider using the tqtcreatecw tool which is in $QTDIR/tools/designer/tools/tqtcreatecw. Using tqtcreatecw you can create custom widget description files for your custom widgets without the need to type in all the information manually. For more information about the README file in the tqtcreatecw directory</p></string> + </property> + </widget> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>buttonSave</cstring> + </property> + <property name="text"> + <string>&Save Descriptions...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Saves widget description file</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Save Descriptions</b><p>Saves all the descriptions of the shown custom widgets to a file which can then be used to import the custom widgets elsewhere.</string> + </property> + </widget> + <widget class="TQTabWidget" row="0" column="2" rowspan="5" colspan="1"> + <property name="name"> + <cstring>TabWidget1</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>Change the properties of the selected custom widget.</string> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget2</cstring> + </property> + <attribute name="title"> + <string>De&finition</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="2" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>previewPixmap</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonChoosePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a pixmap file.</b><p>The pixmap will be used to represent the widget in forms.</p></string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget" row="1" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="KLineEdit"> + <property name="name"> + <cstring>editHeader</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Enter filename</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the header file's name for the selected custom widget.</b><p>The header file will be included by forms using the widget.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonChooseHeader</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Choose headerfile</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Look for the header file using a file dialog.</string> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>Global</string> + </property> + </item> + <item> + <property name="text"> + <string>Local</string> + </property> + </item> + <property name="name"> + <cstring>localGlobalCombo</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Select access</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change how the include file will be included.</b><p>Global include files will be included using &lt;&gt;-brackets, while local files will included using quotation marks.</p></string> + </property> + </widget> + </hbox> + </widget> + <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>editClass</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change classname</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Enter the classname for the selected custom widget.</b><p>A class of that name must be defined in the header file.</p></string> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label11</cstring> + </property> + <property name="text"> + <string>Heade&rfile:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editHeader</cstring> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>Label10</cstring> + </property> + <property name="text"> + <string>Cl&ass:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editClass</cstring> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>Label2</cstring> + </property> + <property name="text"> + <string>Pixmap:</string> + </property> + </widget> + <widget class="TQLabel" row="3" column="0"> + <property name="name"> + <cstring>Label7</cstring> + </property> + <property name="text"> + <string>Si&ze hint:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>spinWidth</cstring> + </property> + </widget> + <widget class="TQLabel" row="4" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>Size p&olicy:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>sizeHor</cstring> + </property> + </widget> + <widget class="TQComboBox" row="4" column="2"> + <item> + <property name="text"> + <string>Fixed</string> + </property> + </item> + <item> + <property name="text"> + <string>Minimum</string> + </property> + </item> + <item> + <property name="text"> + <string>Maximum</string> + </property> + </item> + <item> + <property name="text"> + <string>Preferred</string> + </property> + </item> + <item> + <property name="text"> + <string>MinimumExpanding</string> + </property> + </item> + <item> + <property name="text"> + <string>Expanding</string> + </property> + </item> + <property name="name"> + <cstring>sizeVer</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Vertical Sizepolicy</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose theQt::Vertical size policy</string> + </property> + </widget> + <widget class="TQSpinBox" row="3" column="1"> + <property name="name"> + <cstring>spinWidth</cstring> + </property> + <property name="maxValue"> + <number>32767</number> + </property> + <property name="minValue"> + <number>-1</number> + </property> + <property name="value"> + <number>-1</number> + </property> + <property name="toolTip" stdset="0"> + <string>Size hint width</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Set the size hint for the selected widget.</b><p>The size hint provides the recommended size for the widget. Enter a sizehint of -1/-1 if no size is recommended.</p></string> + </property> + </widget> + <widget class="TQSpinBox" row="3" column="2"> + <property name="name"> + <cstring>spinHeight</cstring> + </property> + <property name="maxValue"> + <number>32767</number> + </property> + <property name="minValue"> + <number>-1</number> + </property> + <property name="value"> + <number>-1</number> + </property> + <property name="toolTip" stdset="0"> + <string>Size hint height</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Set the size hint for the selected widget.</b><p>The size hint provides the recommended size for the widget. Enter a sizehint of -1/-1 if no size is recommended.</p></string> + </property> + </widget> + <widget class="TQComboBox" row="4" column="1"> + <item> + <property name="text"> + <string>Fixed</string> + </property> + </item> + <item> + <property name="text"> + <string>Minimum</string> + </property> + </item> + <item> + <property name="text"> + <string>Maximum</string> + </property> + </item> + <item> + <property name="text"> + <string>Preferred</string> + </property> + </item> + <item> + <property name="text"> + <string>MinimumExpanding</string> + </property> + </item> + <item> + <property name="text"> + <string>Expanding</string> + </property> + </item> + <property name="name"> + <cstring>sizeHor</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Horizontal Sizepolicy</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose the horizontal size policy for the widget</string> + </property> + </widget> + <spacer row="6" column="2"> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQCheckBox" row="5" column="1"> + <property name="name"> + <cstring>checkContainer</cstring> + </property> + <property name="text"> + <string>Con&tainer widget</string> + </property> + <property name="toolTip" stdset="0"> + <string>Container Widget</string> + </property> + <property name="whatsThis" stdset="0"> + <string><p><b>Container Widget</b></p> +<p>If this custom widget is able to contain other widgets (children), check this checkbox.</p></string> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget3</cstring> + </property> + <attribute name="title"> + <string>Si&gnals</string> + </attribute> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListBox"> + <property name="name"> + <cstring>listSignals</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>The list of all the Q_SIGNALS that the selected widget can emit.</string> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout40</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer1_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonAddSignal</cstring> + </property> + <property name="text"> + <string>N&ew Signal</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Add new signal</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Add a new signal for the current custom widget.</b><p>An argument list should be provided in the signal's name, and the name must be unique.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonRemoveSignal</cstring> + </property> + <property name="text"> + <string>Dele&te Signal</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Delete signal</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the signal.</b><p>All connections using this signal will also be deleted.</p></string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout38</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>S&ignal:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editSignal</cstring> + </property> + </widget> + <widget class="KLineEdit"> + <property name="name"> + <cstring>editSignal</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change signal name</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the name of the selected slot.</b><p>An argument list should be provided in the signal's name, and the name must be unique.</p></string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget4</cstring> + </property> + <attribute name="title"> + <string>S&lots</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListView" row="0" column="0" rowspan="1" colspan="4"> + <column> + <property name="text"> + <string>Slot</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizeable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Access</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizeable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>listSlots</cstring> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="showSortIndicator"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>The list of all the custom widget's slots.</string> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Sl&ot:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editSlot</cstring> + </property> + </widget> + <widget class="KLineEdit" row="2" column="1"> + <property name="name"> + <cstring>editSlot</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change slot name</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the name of the selected slot.</b><p>An argument list should be provided in the signal's name, and the name must be unique.</p></string> + </property> + </widget> + <widget class="TQLabel" row="2" column="2"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="text"> + <string>&Access:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboAccess</cstring> + </property> + </widget> + <widget class="TQComboBox" row="2" column="3"> + <item> + <property name="text"> + <string>public</string> + </property> + </item> + <item> + <property name="text"> + <string>protected</string> + </property> + </item> + <property name="name"> + <cstring>comboAccess</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change slot access</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the slot's access policy.</b><p>You can only connect to the widget's public Q_SLOTS.</p></string> + </property> + </widget> + <widget class="TQLayoutWidget" row="1" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>Layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonAddSlot</cstring> + </property> + <property name="text"> + <string>N&ew Slot</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Add new slot</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Add a new slot to the current custom widget.</b><p>An argument list should be provided in the signal's name, and the name must be unique.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonRemoveSlot</cstring> + </property> + <property name="text"> + <string>Dele&te Slot</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Delete slot</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the slot.</b><p>All connections using this slot will also be deleted.</p></string> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget5</cstring> + </property> + <attribute name="title"> + <string>&Properties</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="1" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>Layout7_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonAddProperty</cstring> + </property> + <property name="text"> + <string>N&ew Property</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Add new property</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Add a new property to the current custom widget.</b><p>The properties must be implemented in the class using Qt's property system.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonRemoveProperty</cstring> + </property> + <property name="text"> + <string>Dele&te Property</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Delete property</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Deletes the selected property.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQComboBox" row="2" column="3"> + <item> + <property name="text"> + <string>String</string> + </property> + </item> + <item> + <property name="text"> + <string>CString</string> + </property> + </item> + <item> + <property name="text"> + <string>StringList</string> + </property> + </item> + <item> + <property name="text"> + <string>Bool</string> + </property> + </item> + <item> + <property name="text"> + <string>Int</string> + </property> + </item> + <item> + <property name="text"> + <string>UInt</string> + </property> + </item> + <item> + <property name="text"> + <string>Font</string> + </property> + </item> + <item> + <property name="text"> + <string>Color</string> + </property> + </item> + <item> + <property name="text"> + <string>Rect</string> + </property> + </item> + <item> + <property name="text"> + <string>Point</string> + </property> + </item> + <item> + <property name="text"> + <string>Size</string> + </property> + </item> + <item> + <property name="text"> + <string>Pixmap</string> + </property> + </item> + <item> + <property name="text"> + <string>Palette</string> + </property> + </item> + <item> + <property name="text"> + <string>Cursor</string> + </property> + </item> + <item> + <property name="text"> + <string>SizePolicy</string> + </property> + </item> + <property name="name"> + <cstring>comboType</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Select property type</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select the type of the property.</b><p>The property must be implemented in the class using Qt's property system.</p><p>You can use integer types to support enumeration properties in the property editor.</p></string> + </property> + </widget> + <widget class="TQListView" row="0" column="0" rowspan="1" colspan="4"> + <column> + <property name="text"> + <string>Property</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizeable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Type</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizeable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>listProperties</cstring> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="showSortIndicator"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>The list of the current widget's properties.</b><p>The properties of the custom widget can be changed in the property editor.</p></string> + </property> + </widget> + <widget class="KLineEdit" row="2" column="1"> + <property name="name"> + <cstring>editProperty</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change property name</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Enter a name for the property.</b><p>The properties must be implemented in the class using Qt's property system.</p></string> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel2_2</cstring> + </property> + <property name="text"> + <string>P&roperty name:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editProperty</cstring> + </property> + </widget> + <widget class="TQLabel" row="2" column="2"> + <property name="name"> + <cstring>TextLabel3_2</cstring> + </property> + <property name="text"> + <string>T&ype:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboType</cstring> + </property> + </widget> + </grid> + </widget> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>boxWidgets</sender> + <signal>selectionChanged(TQListBoxItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentWidgetChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>boxWidgets</sender> + <signal>currentChanged(TQListBoxItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentWidgetChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>buttonNewWidget</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>addWidgetClicked()</slot> + </connection> + <connection> + <sender>buttonDeleteWidget</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>deleteWidgetClicked()</slot> + </connection> + <connection> + <sender>editClass</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>classNameChanged(const TQString&)</slot> + </connection> + <connection> + <sender>editHeader</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>headerFileChanged(const TQString&)</slot> + </connection> + <connection> + <sender>spinWidth</sender> + <signal>valueChanged(int)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>widthChanged(int)</slot> + </connection> + <connection> + <sender>spinHeight</sender> + <signal>valueChanged(int)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>heightChanged(int)</slot> + </connection> + <connection> + <sender>buttonChoosePixmap</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>pixmapChoosen()</slot> + </connection> + <connection> + <sender>localGlobalCombo</sender> + <signal>highlighted(int)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>includePolicyChanged(int)</slot> + </connection> + <connection> + <sender>buttonChooseHeader</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>chooseHeader()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>closeClicked()</slot> + </connection> + <connection> + <sender>listSignals</sender> + <signal>currentChanged(TQListBoxItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentSignalChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>listSignals</sender> + <signal>selectionChanged(TQListBoxItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentSignalChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>buttonRemoveSignal</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>removeSignal()</slot> + </connection> + <connection> + <sender>editSignal</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>signalNameChanged(const TQString&)</slot> + </connection> + <connection> + <sender>listSlots</sender> + <signal>currentChanged(TQListViewItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentSlotChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>listSlots</sender> + <signal>selectionChanged(TQListViewItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentSlotChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>buttonRemoveSlot</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>removeSlot()</slot> + </connection> + <connection> + <sender>editSlot</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>slotNameChanged(const TQString&)</slot> + </connection> + <connection> + <sender>comboAccess</sender> + <signal>activated(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>slotAccessChanged(const TQString&)</slot> + </connection> + <connection> + <sender>listProperties</sender> + <signal>currentChanged(TQListViewItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentPropertyChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>listProperties</sender> + <signal>selectionChanged(TQListViewItem*)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>currentPropertyChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>buttonRemoveProperty</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>removeProperty()</slot> + </connection> + <connection> + <sender>editProperty</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>propertyNameChanged(const TQString&)</slot> + </connection> + <connection> + <sender>comboType</sender> + <signal>activated(const TQString&)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>propertyTypeChanged(const TQString&)</slot> + </connection> + <connection> + <sender>buttonLoad</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>loadDescription()</slot> + </connection> + <connection> + <sender>buttonSave</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>saveDescription()</slot> + </connection> + <connection> + <sender>sizeHor</sender> + <signal>activated(int)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>horDataChanged(int)</slot> + </connection> + <connection> + <sender>sizeVer</sender> + <signal>activated(int)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>verDataChanged(int)</slot> + </connection> + <connection> + <sender>buttonAddProperty</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>addProperty()</slot> + </connection> + <connection> + <sender>checkContainer</sender> + <signal>toggled(bool)</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>widgetIsContainer(bool)</slot> + </connection> + <connection> + <sender>buttonAddSignal</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>addSignal()</slot> + </connection> + <connection> + <sender>buttonAddSlot</sender> + <signal>clicked()</signal> + <receiver>CustomWidgetEditorBase</receiver> + <slot>addSlot()</slot> + </connection> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> + <slot access="protected" language="C++" returnType="void">addProperty()</slot> + <slot access="public" language="C++" returnType="void">addSignal()</slot> + <slot access="protected" language="C++" returnType="void">addWidgetClicked()</slot> + <slot access="protected" language="C++" returnType="void">chooseHeader()</slot> + <slot access="protected" language="C++" returnType="void">classNameChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">closeClicked()</slot> + <slot access="protected" language="C++" returnType="void">currentPropertyChanged( TQListViewItem * )</slot> + <slot access="protected" language="C++" returnType="void">currentSignalChanged( TQListBoxItem * )</slot> + <slot access="protected" language="C++" returnType="void">currentSlotChanged( TQListViewItem * )</slot> + <slot access="protected" language="C++" returnType="void">currentWidgetChanged( TQListBoxItem * )</slot> + <slot access="protected" language="C++" returnType="void">deleteWidgetClicked()</slot> + <slot access="protected" language="C++" returnType="void">headerFileChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">heightChanged( int )</slot> + <slot access="protected" language="C++" returnType="void">horDataChanged(int)</slot> + <slot access="protected" language="C++" returnType="void">includePolicyChanged( int )</slot> + <slot access="public" language="C++" returnType="void">loadDescription()</slot> + <slot access="public" language="C++" returnType="void">addSlot()</slot> + <slot access="protected" language="C++" returnType="void">pixmapChoosen()</slot> + <slot access="protected" language="C++" returnType="void">propertyNameChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">propertyTypeChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">removeProperty()</slot> + <slot access="protected" language="C++" returnType="void">removeSignal()</slot> + <slot access="protected" language="C++" returnType="void">removeSlot()</slot> + <slot access="protected" language="C++" returnType="void">saveDescription()</slot> + <slot access="protected" language="C++" returnType="void">signalNameChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">slotAccessChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">slotNameChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">verDataChanged(int)</slot> + <slot access="protected" language="C++" returnType="void">widgetIsContainer(bool)</slot> + <slot access="protected" language="C++" returnType="void">widthChanged( int )</slot> +</connections> +<tabstops> + <tabstop>buttonCancel</tabstop> + <tabstop>boxWidgets</tabstop> + <tabstop>buttonNewWidget</tabstop> + <tabstop>buttonDeleteWidget</tabstop> + <tabstop>buttonLoad</tabstop> + <tabstop>buttonSave</tabstop> + <tabstop>TabWidget1</tabstop> + <tabstop>editClass</tabstop> + <tabstop>editHeader</tabstop> + <tabstop>buttonChooseHeader</tabstop> + <tabstop>localGlobalCombo</tabstop> + <tabstop>buttonChoosePixmap</tabstop> + <tabstop>spinWidth</tabstop> + <tabstop>spinHeight</tabstop> + <tabstop>sizeHor</tabstop> + <tabstop>sizeVer</tabstop> + <tabstop>checkContainer</tabstop> + <tabstop>helpButton</tabstop> + <tabstop>listSignals</tabstop> + <tabstop>buttonAddSignal</tabstop> + <tabstop>buttonRemoveSignal</tabstop> + <tabstop>editSignal</tabstop> + <tabstop>listSlots</tabstop> + <tabstop>buttonAddSlot</tabstop> + <tabstop>buttonRemoveSlot</tabstop> + <tabstop>editSlot</tabstop> + <tabstop>comboAccess</tabstop> + <tabstop>listProperties</tabstop> + <tabstop>buttonAddProperty</tabstop> + <tabstop>buttonRemoveProperty</tabstop> + <tabstop>editProperty</tabstop> + <tabstop>comboType</tabstop> +</tabstops> +</UI> diff --git a/kdevdesigner/designer/customwidgeteditorimpl.cpp b/kdevdesigner/designer/customwidgeteditorimpl.cpp new file mode 100644 index 00000000..f417f6f2 --- /dev/null +++ b/kdevdesigner/designer/customwidgeteditorimpl.cpp @@ -0,0 +1,842 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "customwidgeteditorimpl.h" +#include "defs.h" +#include "pixmapchooser.h" +#include "mainwindow.h" +#include "asciivalidator.h" +#include "resource.h" +#include "widgetfactory.h" +#include "widgetdatabase.h" + +#include <tdefiledialog.h> +#include <klineedit.h> + +#include <tqlistbox.h> +#include <tqpushbutton.h> +#include <tqcombobox.h> +#include <tqspinbox.h> +#include <tqlabel.h> +#include <tqmessagebox.h> +#include <tqfiledialog.h> +#include <tqmessagebox.h> +#include <tqtimer.h> +#include <tqapplication.h> +#include <tqlistview.h> +#include <tqfile.h> +#include <tqtextstream.h> +#include <tqdom.h> +#include <tqtextcodec.h> +#include <tqcheckbox.h> + +#include <tdelocale.h> + +CustomWidgetEditor::CustomWidgetEditor( TQWidget *parent, MainWindow *mw ) + : CustomWidgetEditorBase( parent, 0, TRUE ), mainWindow( mw ) +{ + connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + checkTimer = new TQTimer( this ); + connect( checkTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( checkWidgetName() ) ); + + editClass->setEnabled( FALSE ); + editHeader->setEnabled( FALSE ); + buttonChooseHeader->setEnabled( FALSE ); + buttonChoosePixmap->setEnabled( FALSE ); + spinWidth->setEnabled( FALSE ); + spinHeight->setEnabled( FALSE ); + sizeHor->setEnabled( FALSE ); + sizeVer->setEnabled( FALSE ); + checkContainer->setEnabled( FALSE ); + localGlobalCombo->setEnabled( FALSE ); + editClass->setValidator( new AsciiValidator( TQString(":"), TQT_TQOBJECT(editClass) ) ); + editSignal->setValidator( new AsciiValidator( TRUE, TQT_TQOBJECT(editSignal) ) ); + editSlot->setValidator( new AsciiValidator( TRUE, TQT_TQOBJECT(editSignal) ) ); + editProperty->setValidator( new AsciiValidator( TQT_TQOBJECT(editSignal) ) ); + editSignal->setEnabled( FALSE ); + buttonRemoveSignal->setEnabled( FALSE ); + + setupDefinition(); + setupSignals(); + setupSlots(); + setupProperties(); +} + +void CustomWidgetEditor::setupDefinition() +{ + TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); + for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { + TQListBoxItem *i; + if ( w->pixmap ) + i = new TQListBoxPixmap( boxWidgets, *w->pixmap, w->className ); + else + i = new TQListBoxText( boxWidgets, w->className ); + customWidgets.insert( i, w ); + } + + if ( boxWidgets->firstItem() ) { + boxWidgets->setCurrentItem( boxWidgets->firstItem() ); + boxWidgets->setSelected( boxWidgets->firstItem(), TRUE ); + } + oldItem = 0; +} + +void CustomWidgetEditor::setupSignals() +{ + editSignal->setEnabled( FALSE ); + buttonRemoveSignal->setEnabled( FALSE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w ) + return; + listSignals->clear(); + for ( TQValueList<TQCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) + listSignals->insertItem( TQString( *it ) ); + if ( listSignals->firstItem() ) { + listSignals->setCurrentItem( listSignals->firstItem() ); + listSignals->setSelected( listSignals->firstItem(), TRUE ); + } +} + +void CustomWidgetEditor::setupSlots() +{ + editSlot->setEnabled( FALSE ); + comboAccess->setEnabled( FALSE ); + buttonRemoveSlot->setEnabled( FALSE ); + + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w ) + return; + listSlots->clear(); + for ( TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) + (void)new TQListViewItem( listSlots, (*it).function, (*it).access ); + + if ( listSlots->firstChild() ) { + listSlots->setCurrentItem( listSlots->firstChild() ); + listSlots->setSelected( listSlots->firstChild(), TRUE ); + } +} + +void CustomWidgetEditor::setupProperties() +{ + editProperty->setEnabled( FALSE ); + comboType->setEnabled( FALSE ); + buttonRemoveProperty->setEnabled( FALSE ); + + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w ) + return; + listProperties->clear(); + for ( TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it ) + (void)new TQListViewItem( listProperties, (*it).property, (*it).type ); + + if ( listProperties->firstChild() ) { + listProperties->setCurrentItem( listProperties->firstChild() ); + listProperties->setSelected( listProperties->firstChild(), TRUE ); + } +} + +void CustomWidgetEditor::currentWidgetChanged( TQListBoxItem *i ) +{ + checkTimer->stop(); + checkWidgetName(); + + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) { + buttonChooseHeader->setEnabled( FALSE ); + editClass->setEnabled( FALSE ); + editHeader->setEnabled( FALSE ); + buttonChoosePixmap->setEnabled( FALSE ); + spinWidth->setEnabled( FALSE ); + spinHeight->setEnabled( FALSE ); + localGlobalCombo->setEnabled( FALSE ); + sizeHor->setEnabled( FALSE ); + sizeVer->setEnabled( FALSE ); + checkContainer->setEnabled( FALSE ); + return; + } + + buttonChooseHeader->setEnabled( TRUE ); + editClass->setEnabled( TRUE ); + editHeader->setEnabled( TRUE ); + buttonChoosePixmap->setEnabled( TRUE ); + spinWidth->setEnabled( TRUE ); + spinHeight->setEnabled( TRUE ); + localGlobalCombo->setEnabled( TRUE ); + sizeHor->setEnabled( TRUE ); + sizeVer->setEnabled( TRUE ); + checkContainer->setEnabled( TRUE ); + + editClass->blockSignals( TRUE ); + editClass->setText( w->className ); + editClass->blockSignals( FALSE ); + editHeader->setText( w->includeFile ); + localGlobalCombo->setCurrentItem( (int)w->includePolicy ); + if ( w->pixmap ) + previewPixmap->setPixmap( *w->pixmap ); + else + previewPixmap->setText( "" ); + spinWidth->setValue( w->sizeHint.width() ); + spinHeight->setValue( w->sizeHint.height() ); + sizeHor->setCurrentItem( size_type_to_int( w->sizePolicy.horData() ) ); + sizeVer->setCurrentItem( size_type_to_int( w->sizePolicy.verData() ) ); + checkContainer->setChecked( w->isContainer ); + + setupSignals(); + setupSlots(); + setupProperties(); +} + +void CustomWidgetEditor::addWidgetClicked() +{ + oldItem = 0; + checkTimer->stop(); + checkWidgetName(); + + MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget; + TQString s = w->className; + if ( !MetaDataBase::addCustomWidget( w ) ) { + TQMessageBox::information( this, i18n( "Adding Custom Widget" ), + i18n( "Custom widget names must be unique.\n" + "A custom widget called '%1' already exists, so it is not possible " + "to add another widget with this name." ).arg( s ) ); + return; + } + + TQListBoxPixmap *i = new TQListBoxPixmap( boxWidgets, *w->pixmap, w->className ); + customWidgets.insert( i, w ); + + boxWidgets->setCurrentItem( i ); + boxWidgets->setSelected( i, TRUE ); +} + +void CustomWidgetEditor::classNameChanged( const TQString &s ) +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + WidgetDatabase::customWidgetClassNameChanged( w->className, s ); + + checkTimer->stop(); + boxWidgets->blockSignals( TRUE ); + oldName = w->className; + w->className = s; + TQListBoxItem *old = i; + if ( w->pixmap ) + boxWidgets->changeItem( *w->pixmap, s, boxWidgets->currentItem() ); + else + boxWidgets->changeItem( s, boxWidgets->currentItem() ); + i = boxWidgets->item( boxWidgets->currentItem() ); + oldItem = i; + customWidgets.insert( i, w ); + customWidgets.remove( old ); + boxWidgets->blockSignals( FALSE ); + checkTimer->start( 1000, TRUE ); +} + +void CustomWidgetEditor::deleteWidgetClicked() +{ + oldItem = 0; + checkTimer->stop(); + checkWidgetName(); + + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + + if ( mainWindow->isCustomWidgetUsed( w ) ) { + TQMessageBox::information( mainWindow, i18n( "Removing Custom Widget" ), + i18n( "The custom widget '%1' is in use, so it cannot be removed." ). + arg( w->className ) ); + return; + } + + if ( !i || !w ) + return; + + MetaDataBase::CustomWidget *cw = MetaDataBase::customWidget( mainWindow->currentTool() ); + if ( cw == w ) + mainWindow->resetTool(); + + MetaDataBase::removeCustomWidget( w ); + customWidgets.remove( i ); + delete i; + + i = boxWidgets->item( boxWidgets->currentItem() ); + if ( i ) { + boxWidgets->setCurrentItem( i ); + boxWidgets->setSelected( i, TRUE ); + } +} + +void CustomWidgetEditor::headerFileChanged( const TQString &s ) +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + w->includeFile = s; +} + +void CustomWidgetEditor::heightChanged( int h ) +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + w->sizeHint.setHeight( h ); + updateCustomWidgetSizes(); +} + +void CustomWidgetEditor::includePolicyChanged( int p ) +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + w->includePolicy = (MetaDataBase::CustomWidget::IncludePolicy)p; +} + +void CustomWidgetEditor::pixmapChoosen() +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + TQPixmap pix = qChoosePixmap( this ); + if ( pix.isNull() ) + return; + delete w->pixmap; + w->pixmap = new TQPixmap( pix ); + + boxWidgets->blockSignals( TRUE ); + TQListBoxItem *old = i; + boxWidgets->changeItem( *w->pixmap, w->className, boxWidgets->currentItem() ); + i = boxWidgets->item( boxWidgets->currentItem() ); + customWidgets.insert( i, w ); + customWidgets.remove( old ); + boxWidgets->blockSignals( FALSE ); + previewPixmap->setPixmap( *w->pixmap ); +} + +void CustomWidgetEditor::widthChanged( int wid ) +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + w->sizeHint.setWidth( wid ); + updateCustomWidgetSizes(); +} + +MetaDataBase::CustomWidget *CustomWidgetEditor::findWidget( TQListBoxItem *i ) +{ + if ( !i ) + return 0; + + TQMap<TQListBoxItem*, MetaDataBase::CustomWidget*>::Iterator it = customWidgets.find( i ); + if ( it == customWidgets.end() ) + return 0; + return *it; +} + +void CustomWidgetEditor::chooseHeader() +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + TQString h = KFileDialog::getOpenFileName( TQString(), i18n( "*.h *.h++ *.hxx *.hh|Header Files" ), this ); + if ( h.isEmpty() ) + return; + editHeader->setText( h ); + localGlobalCombo->setCurrentItem( (int)MetaDataBase::CustomWidget::Global ); +} + +void CustomWidgetEditor::checkWidgetName() +{ + TQListBoxItem *i = oldItem ? oldItem : boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + oldItem = 0; + if ( !i || !w ) + return; + + if ( MetaDataBase::isWidgetNameUsed( w ) ) { + TQString s = w->className; + w->className = oldName; + TQMessageBox::information( this, i18n( "Renaming Custom Widget" ), + i18n( "Custom widget names must be unique.\n" + "A custom widget called '%1' already exists, so it is not possible " + "to rename this widget with this name." ).arg( s ) ); + if ( i != boxWidgets->item( boxWidgets->currentItem() ) ) { + boxWidgets->setCurrentItem( i ); + tqApp->processEvents(); + } + editClass->setText( w->className ); + classNameChanged( w->className ); + } +} + +void CustomWidgetEditor::closeClicked() +{ + oldItem = 0; + checkTimer->stop(); + checkWidgetName(); + accept(); +} + +void CustomWidgetEditor::currentSignalChanged( TQListBoxItem *i ) +{ + editSignal->blockSignals( TRUE ); + editSignal->setText( "" ); + editSignal->blockSignals( FALSE ); + + if ( !i ) { + editSignal->setEnabled( FALSE ); + buttonRemoveSignal->setEnabled( FALSE ); + return; + } + + editSignal->blockSignals( TRUE ); + editSignal->setEnabled( TRUE ); + buttonRemoveSignal->setEnabled( TRUE ); + editSignal->setText( i->text() ); + editSignal->blockSignals( FALSE ); +} + +void CustomWidgetEditor::addSignal() +{ + TQListBoxItem *i = new TQListBoxText( listSignals, "signal()" ); + listSignals->setCurrentItem( i ); + listSignals->setSelected( i, TRUE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( w ) + w->lstSignals.append( i->text().latin1() ); +} + +void CustomWidgetEditor::removeSignal() +{ + TQString s = listSignals->currentText(); + delete listSignals->item( listSignals->currentItem() ); + if ( listSignals->currentItem() != -1 ) + listSignals->setSelected( listSignals->currentItem(), TRUE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( w ) + w->lstSignals.remove( s.latin1() ); +} + +void CustomWidgetEditor::signalNameChanged( const TQString &s ) +{ + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w || listSignals->currentItem() == -1 ) + return; + + TQValueList<TQCString>::Iterator it = w->lstSignals.find( listSignals->currentText().latin1() ); + if ( it != w->lstSignals.end() ) + w->lstSignals.remove( it ); + listSignals->blockSignals( TRUE ); + listSignals->changeItem( s, listSignals->currentItem() ); + listSignals->blockSignals( FALSE ); + w->lstSignals.append( s.latin1() ); +} + +void CustomWidgetEditor::slotAccessChanged( const TQString &s ) +{ + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w || !listSlots->currentItem() ) + return; + + MetaDataBase::Function slot; + slot.function = listSlots->currentItem()->text( 0 ); + slot.access = listSlots->currentItem()->text( 1 ); + TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.find( slot ); + if ( it != w->lstSlots.end() ) + w->lstSlots.remove( it ); + listSlots->currentItem()->setText( 1, s ); + slot.function = listSlots->currentItem()->text( 0 ); + slot.access = listSlots->currentItem()->text( 1 ); + w->lstSlots.append( slot ); +} + +void CustomWidgetEditor::slotNameChanged( const TQString &s ) +{ + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w || !listSlots->currentItem() ) + return; + + MetaDataBase::Function slot; + slot.function = listSlots->currentItem()->text( 0 ); + slot.access = listSlots->currentItem()->text( 1 ); + slot.type = "slot"; + TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.find( slot ); + if ( it != w->lstSlots.end() ) + w->lstSlots.remove( it ); + listSlots->currentItem()->setText( 0, s ); + slot.function = listSlots->currentItem()->text( 0 ); + slot.access = listSlots->currentItem()->text( 1 ); + w->lstSlots.append( slot ); +} + +void CustomWidgetEditor::addSlot() +{ + TQListViewItem *i = new TQListViewItem( listSlots, "slot()", "public" ); + listSlots->setCurrentItem( i ); + listSlots->setSelected( i, TRUE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( w ) { + MetaDataBase::Function slot; + slot.function = "slot()"; + slot.access = "public"; + slot.type = "slot"; + w->lstSlots.append( slot ); + } +} + +void CustomWidgetEditor::removeSlot() +{ + MetaDataBase::Function slot; + slot.function = "1 2 3"; + if ( listSlots->currentItem() ) { + slot.function = listSlots->currentItem()->text( 0 ); + slot.access = listSlots->currentItem()->text( 1 ); + } + delete listSlots->currentItem(); + if ( listSlots->currentItem() ) + listSlots->setSelected( listSlots->currentItem(), TRUE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( w && slot.function != "1 2 3" ) + w->lstSlots.remove( slot ); +} + +void CustomWidgetEditor::currentSlotChanged( TQListViewItem *i ) +{ + editSlot->blockSignals( TRUE ); + editSlot->setText( "" ); + editSignal->blockSignals( FALSE ); + + if ( !i ) { + editSlot->setEnabled( FALSE ); + comboAccess->setEnabled( FALSE ); + buttonRemoveSlot->setEnabled( FALSE ); + return; + } + + editSlot->setEnabled( TRUE ); + comboAccess->setEnabled( TRUE ); + buttonRemoveSlot->setEnabled( TRUE ); + editSlot->blockSignals( TRUE ); + comboAccess->blockSignals( TRUE ); + editSlot->setText( i->text( 0 ) ); + if ( i->text( 1 ) == i18n( "protected" ) ) + comboAccess->setCurrentItem( 1 ); + else + comboAccess->setCurrentItem( 0 ); + editSlot->blockSignals( FALSE ); + comboAccess->blockSignals( FALSE ); +} + +void CustomWidgetEditor::propertyTypeChanged( const TQString &s ) +{ + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w || !listProperties->currentItem() ) + return; + + MetaDataBase::Property property; + property.property = listProperties->currentItem()->text( 0 ); + property.type = listProperties->currentItem()->text( 1 ); + TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.find( property ); + if ( it != w->lstProperties.end() ) + w->lstProperties.remove( it ); + listProperties->currentItem()->setText( 1, s ); + property.property = listProperties->currentItem()->text( 0 ); + property.type = listProperties->currentItem()->text( 1 ); + w->lstProperties.append( property ); +} + +void CustomWidgetEditor::propertyNameChanged( const TQString &s ) +{ + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( !w || !listProperties->currentItem() ) + return; + + MetaDataBase::Property property; + property.property = listProperties->currentItem()->text( 0 ); + property.type = listProperties->currentItem()->text( 1 ); + TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.find( property ); + if ( it != w->lstProperties.end() ) + w->lstProperties.remove( it ); + listProperties->currentItem()->setText( 0, s ); + property.property = listProperties->currentItem()->text( 0 ); + property.type = listProperties->currentItem()->text( 1 ); + w->lstProperties.append( property ); +} + +void CustomWidgetEditor::addProperty() +{ + TQListViewItem *i = new TQListViewItem( listProperties, "property", "String" ); + listProperties->setCurrentItem( i ); + listProperties->setSelected( i, TRUE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( w ) { + MetaDataBase::Property prop; + prop.property = "property"; + prop.type = "String"; + w->lstProperties.append( prop ); + } +} + +void CustomWidgetEditor::removeProperty() +{ + MetaDataBase::Property property; + property.property = "1 2 3"; + if ( listProperties->currentItem() ) { + property.property = listProperties->currentItem()->text( 0 ); + property.type = listProperties->currentItem()->text( 1 ); + } + delete listProperties->currentItem(); + if ( listProperties->currentItem() ) + listProperties->setSelected( listProperties->currentItem(), TRUE ); + MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); + if ( w && property.property != "1 2 3" ) + w->lstProperties.remove( property ); +} + +void CustomWidgetEditor::currentPropertyChanged( TQListViewItem *i ) +{ + editProperty->blockSignals( TRUE ); + editProperty->setText( "" ); + editSignal->blockSignals( FALSE ); + + if ( !i ) { + editProperty->setEnabled( FALSE ); + comboType->setEnabled( FALSE ); + buttonRemoveProperty->setEnabled( FALSE ); + return; + } + + editProperty->setEnabled( TRUE ); + comboType->setEnabled( TRUE ); + buttonRemoveProperty->setEnabled( TRUE ); + editProperty->blockSignals( TRUE ); + comboType->blockSignals( TRUE ); + editProperty->setText( i->text( 0 ) ); + + for ( int j = 0; j < comboType->count(); ++j ) { + if ( i->text( 1 ) == comboType->text( j ) ) { + comboType->setCurrentItem( j ); + break; + } + } + editProperty->blockSignals( FALSE ); + comboType->blockSignals( FALSE ); +} + +static TQString makeIndent2( int indent ) +{ + TQString s; + s.fill( ' ', indent * 4 ); + return s; +} + +static TQString entitize2( const TQString &s ) +{ + TQString s2 = s; + s2 = s2.replace( "\"", """ ); + s2 = s2.replace( "&", "&" ); + s2 = s2.replace( ">", ">" ); + s2 = s2.replace( "<", "<" ); + s2 = s2.replace( "'", "'" ); + return s2; +} + +void CustomWidgetEditor::saveDescription() +{ + TQString fn = KFileDialog::getSaveFileName( TQString(), i18n( "*.cw|Custom-Widget Description\n*|All Files" ), this ); + if ( fn.isEmpty() ) + return; + + if ( TQFileInfo( fn ).extension() != "cw" ) + fn += ".cw"; + TQFile f( fn ); + if ( !f.open( IO_WriteOnly ) ) + return; + + TQTextStream ts( &f ); + ts.setCodec( TQTextCodec::codecForName( "UTF-8" ) ); + int indent = 0; + + ts << "<!DOCTYPE CW><CW>" << endl; + + ts << makeIndent2( indent ) << "<customwidgets>" << endl; + indent++; + + TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); + for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { + ts << makeIndent2( indent ) << "<customwidget>" << endl; + indent++; + ts << makeIndent2( indent ) << "<class>" << w->className << "</class>" << endl; + ts << makeIndent2( indent ) << "<header location=\"" + << ( w->includePolicy == MetaDataBase::CustomWidget::Local ? "local" : "global" ) + << "\">" << w->includeFile << "</header>" << endl; + ts << makeIndent2( indent ) << "<sizehint>" << endl; + indent++; + ts << makeIndent2( indent ) << "<width>" << w->sizeHint.width() << "</width>" << endl; + ts << makeIndent2( indent ) << "<height>" << w->sizeHint.height() << "</height>" << endl; + indent--; + ts << makeIndent2( indent ) << "</sizehint>" << endl; + ts << makeIndent2( indent ) << "<container>" << (int)w->isContainer << "</container>" << endl; + ts << makeIndent2( indent ) << "<sizepolicy>" << endl; + indent++; + ts << makeIndent2( indent ) << "<hordata>" << (int)w->sizePolicy.horData() << "</hordata>" << endl; + ts << makeIndent2( indent ) << "<verdata>" << (int)w->sizePolicy.verData() << "</verdata>" << endl; + indent--; + ts << makeIndent2( indent ) << "</sizepolicy>" << endl; + ts << makeIndent2( indent ) << "<pixmap>" << endl; + indent++; + Resource::saveImageData( w->pixmap->convertToImage(), ts, indent ); + indent--; + ts << makeIndent2( indent ) << "</pixmap>" << endl; + if ( !w->lstSignals.isEmpty() ) { + for ( TQValueList<TQCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) + ts << makeIndent2( indent ) << "<signal>" << entitize2( *it ) << "</signal>" << endl; + } + if ( !w->lstSlots.isEmpty() ) { + for ( TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) + ts << makeIndent2( indent ) << "<slot access=\"" << (*it).access << "\">" << entitize2( (*it).function ) << "</slot>" << endl; + } + if ( !w->lstProperties.isEmpty() ) { + for ( TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it ) + ts << makeIndent2( indent ) << "<property type=\"" << (*it).type << "\">" << entitize2( (*it).property ) << "</property>" << endl; + } + indent--; + ts << makeIndent2( indent ) << "</customwidget>" << endl; + } + + indent--; + ts << makeIndent2( indent ) << "</customwidgets>" << endl; + ts << "</CW>" << endl; +} + +void CustomWidgetEditor::loadDescription() +{ + TQString fn = KFileDialog::getOpenFileName( TQString(), i18n( "*.cw|Custom-Widget Description\n*|All Files" ), this ); + if ( fn.isEmpty() ) + return; + + TQFile f( fn ); + if ( !f.open( IO_ReadOnly ) ) + return; + + TQDomDocument doc; + TQString errMsg; + int errLine; + if ( !doc.setContent( &f, &errMsg, &errLine ) ) { + tqDebug( TQString("Parse error: ") + errMsg + TQString(" in line %d"), errLine ); + return; + } + + TQDomElement firstWidget = doc.firstChild().toElement().firstChild().toElement(); + + while ( firstWidget.tagName() != "customwidgets" ) + firstWidget = firstWidget.nextSibling().toElement(); + + Resource::loadCustomWidgets( firstWidget, 0 ); + boxWidgets->clear(); + setupDefinition(); + setupSignals(); + setupSlots(); + setupProperties(); +} + +void CustomWidgetEditor::updateCustomWidgetSizes() +{ + if ( cwLst.isEmpty() ) + cwLst = *mainWindow->queryList( "CustomWidget" ); + for ( TQObject *o = cwLst.first(); o; o = cwLst.next() ) + ( (TQWidget*)o )->updateGeometry(); +} + +void CustomWidgetEditor::horDataChanged( int a ) +{ + TQSizePolicy::SizeType st = int_to_size_type( a ); + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + TQSizePolicy osp = w->sizePolicy; + w->sizePolicy.setHorData( st ); + if ( cwLst.isEmpty() ) + cwLst = *mainWindow->queryList( "CustomWidget" ); + for ( TQObject *o = cwLst.first(); o; o = cwLst.next() ) { + CustomWidget *cw = (CustomWidget*)o; + if ( cw->realClassName() == boxWidgets->currentText() ) { + if ( cw->sizePolicy() == osp ) + cw->setSizePolicy( w->sizePolicy ); + } + } +} + +void CustomWidgetEditor::verDataChanged( int a ) +{ + TQSizePolicy::SizeType st = int_to_size_type( a ); + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + TQSizePolicy osp = w->sizePolicy; + w->sizePolicy.setVerData( st ); + if ( cwLst.isEmpty() ) + cwLst = *mainWindow->queryList( "CustomWidget" ); + for ( TQObject *o = cwLst.first(); o; o = cwLst.next() ) { + CustomWidget *cw = (CustomWidget*)o; + if ( cw->realClassName() == boxWidgets->currentText() ) { + if ( cw->sizePolicy() == osp ) + cw->setSizePolicy( w->sizePolicy ); + } + } +} + +void CustomWidgetEditor::widgetIsContainer( bool b ) +{ + TQListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); + MetaDataBase::CustomWidget *w = findWidget( i ); + if ( !i || !w ) + return; + + w->isContainer = b; + WidgetDatabaseRecord *r = WidgetDatabase::at( w->id ); + if ( r ) + r->isContainer = b; +} diff --git a/kdevdesigner/designer/customwidgeteditorimpl.h b/kdevdesigner/designer/customwidgeteditorimpl.h new file mode 100644 index 00000000..9e53b2ce --- /dev/null +++ b/kdevdesigner/designer/customwidgeteditorimpl.h @@ -0,0 +1,99 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef CUSTOMWIDGETEDITORIMPL_H +#define CUSTOMWIDGETEDITORIMPL_H + +#include "customwidgeteditor.h" +#include "metadatabase.h" + +#include <tqmap.h> +#include <tqobjectlist.h> + +class TQTimer; +class TQListBoxItem; +class MainWindow; + +class CustomWidgetEditor : public CustomWidgetEditorBase +{ + Q_OBJECT + + +public: + CustomWidgetEditor( TQWidget *parent , MainWindow *mw); + +protected slots: + void addWidgetClicked(); + void classNameChanged( const TQString & ); + void currentWidgetChanged( TQListBoxItem * ); + void deleteWidgetClicked(); + void headerFileChanged( const TQString & ); + void heightChanged( int ); + void includePolicyChanged( int ); + void pixmapChoosen(); + void widthChanged( int ); + void chooseHeader(); + void checkWidgetName(); + void closeClicked(); + void currentSignalChanged( TQListBoxItem *i ); + void addSignal(); + void removeSignal(); + void signalNameChanged( const TQString &s ); + void slotAccessChanged( const TQString & ); + void slotNameChanged( const TQString & ); + void addSlot(); + void removeSlot(); + void currentSlotChanged( TQListViewItem * ); + void propertyTypeChanged( const TQString & ); + void propertyNameChanged( const TQString & ); + void addProperty(); + void removeProperty(); + void currentPropertyChanged( TQListViewItem * ); + void saveDescription(); + void loadDescription(); + void horDataChanged( int ); + void verDataChanged( int ); + void widgetIsContainer( bool ); + +private: + MetaDataBase::CustomWidget *findWidget( TQListBoxItem *i ); + void setupDefinition(); + void setupSignals(); + void setupSlots(); + void setupProperties(); + void updateCustomWidgetSizes(); + +private: + TQMap<TQListBoxItem*, MetaDataBase::CustomWidget*> customWidgets; + TQString oldName; + TQTimer *checkTimer; + TQListBoxItem *oldItem; + MainWindow *mainWindow; + TQObjectList cwLst; + +}; + +#endif diff --git a/kdevdesigner/designer/database.cpp b/kdevdesigner/designer/database.cpp new file mode 100644 index 00000000..b5baea28 --- /dev/null +++ b/kdevdesigner/designer/database.cpp @@ -0,0 +1,122 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#if defined(DESIGNER) +#include "database.h" +#else +#include "database2.h" +#endif + +#ifndef TQT_NO_SQL + +#if defined(DESIGNER) +#include "formwindow.h" +#include "mainwindow.h" +#endif + +#include <tqsqldatabase.h> +#include <tqsqlform.h> +#include <tqsqlcursor.h> +#include <tqsqlrecord.h> + +DatabaseSupport::DatabaseSupport() +{ + con = 0; + frm = 0; + parent = 0; +} + +void DatabaseSupport::initPreview( const TQString &connection, const TQString &table, TQObject *o, + const TQMap<TQString, TQString> &databaseControls ) +{ + tbl = table; + dbControls = databaseControls; + parent = o; + + if ( connection != "(default)" ) + con = TQSqlDatabase::database( connection ); + else + con = TQSqlDatabase::database(); + frm = new TQSqlForm( o, table ); + for ( TQMap<TQString, TQString>::Iterator it = dbControls.begin(); it != dbControls.end(); ++it ) { + TQObject *chld = parent->child( it.key(), TQWIDGET_OBJECT_NAME_STRING ); + if ( !chld ) + continue; + frm->insert( (TQWidget*)chld, *it ); + } +} + +QDesignerDataBrowser::QDesignerDataBrowser( TQWidget *parent, const char *name ) + : TQDataBrowser( parent, name ) +{ +} + +bool QDesignerDataBrowser::event( TQEvent* e ) +{ + bool b = TQDataBrowser::event( e ); +#if defined(DESIGNER) + if ( MainWindow::self->isPreviewing() ) { +#endif + if ( e->type() == TQEvent::Show ) { + if ( con ) { + TQSqlCursor* cursor = new TQSqlCursor( tbl, TRUE, con ); + setSqlCursor( cursor, TRUE ); + setForm( frm ); + refresh(); + first(); + } + return TRUE; + } +#if defined(DESIGNER) + } +#endif + return b; +} + +QDesignerDataView::QDesignerDataView( TQWidget *parent, const char *name ) + : TQDataView( parent, name ) +{ +} + +bool QDesignerDataView::event( TQEvent* e ) +{ + bool b = TQDataView::event( e ); +#if defined(DESIGNER) + if ( MainWindow::self->isPreviewing() ) { +#endif + if ( e->type() == TQEvent::Show ) { + setForm( frm ); + readFields(); + return TRUE; + } +#if defined(DESIGNER) + } +#endif + return b; +} + + +#endif diff --git a/kdevdesigner/designer/database.h b/kdevdesigner/designer/database.h new file mode 100644 index 00000000..cbde491f --- /dev/null +++ b/kdevdesigner/designer/database.h @@ -0,0 +1,85 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DATABASE_H +#define DATABASE_H + +#include "tqfeatures.h" + +#ifndef TQT_NO_SQL +#include <tqdataview.h> +#include <tqdatabrowser.h> +#include <tqsqlcursor.h> +#include <tqstring.h> + +class TQSqlDatabase; +class TQSqlForm; + +class DatabaseSupport +{ +public: + DatabaseSupport(); + virtual ~DatabaseSupport() {} + + void initPreview( const TQString &connection, const TQString &table, TQObject *o, + const TQMap<TQString, TQString> &databaseControls ); + +protected: + TQSqlDatabase* con; + TQSqlForm* frm; + TQString tbl; + TQMap<TQString, TQString> dbControls; + TQObject *parent; + +}; + +class QDesignerDataBrowser : public TQDataBrowser, public DatabaseSupport +{ + Q_OBJECT + + +public: + QDesignerDataBrowser( TQWidget *parent, const char *name ); + +protected: + bool event( TQEvent* e ); +}; + +class QDesignerDataView : public TQDataView, public DatabaseSupport +{ + Q_OBJECT + + +public: + QDesignerDataView( TQWidget *parent, const char *name ); + +protected: + bool event( TQEvent* e ); + +}; +#endif + +#endif diff --git a/kdevdesigner/designer/dbconnection.ui b/kdevdesigner/designer/dbconnection.ui new file mode 100644 index 00000000..75b7d5cb --- /dev/null +++ b/kdevdesigner/designer/dbconnection.ui @@ -0,0 +1,222 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>DatabaseConnectionWidget</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQWidget"> + <property name="name"> + <cstring>DatabaseConnectionWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>199</width> + <height>185</height> + </rect> + </property> + <property name="caption"> + <string>Edit Database Connection</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="text"> + <string>&Database name:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editDatabase</cstring> + </property> + </widget> + <widget class="TQLabel" row="3" column="0"> + <property name="name"> + <cstring>TextLabel4</cstring> + </property> + <property name="text"> + <string>&Username:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editUsername</cstring> + </property> + </widget> + <widget class="TQLabel" row="4" column="0"> + <property name="name"> + <cstring>TextLabel4_2</cstring> + </property> + <property name="text"> + <string>&Password:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editPassword</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>D&river:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboDriver</cstring> + </property> + </widget> + <widget class="KLineEdit" row="0" column="1"> + <property name="name"> + <cstring>editName</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLabel" row="5" column="0"> + <property name="name"> + <cstring>TextLabel5</cstring> + </property> + <property name="text"> + <string>&Hostname:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editHostname</cstring> + </property> + </widget> + <widget class="TQComboBox" row="1" column="1"> + <property name="name"> + <cstring>comboDriver</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>&Name:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editName</cstring> + </property> + </widget> + <widget class="KLineEdit" row="5" column="1"> + <property name="name"> + <cstring>editHostname</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLabel" row="6" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>P&ort:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editPort</cstring> + </property> + </widget> + <widget class="KLineEdit" row="3" column="1"> + <property name="name"> + <cstring>editUsername</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KLineEdit" row="4" column="1"> + <property name="name"> + <cstring>editPassword</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="echoMode"> + <enum>Password</enum> + </property> + </widget> + <widget class="KLineEdit" row="2" column="1"> + <property name="name"> + <cstring>editDatabase</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="TQSpinBox" row="6" column="1"> + <property name="name"> + <cstring>editPort</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="specialValueText"> + <string>Default</string> + </property> + <property name="maxValue"> + <number>65535</number> + </property> + <property name="minValue"> + <number>-1</number> + </property> + <property name="value"> + <number>-1</number> + </property> + </widget> + </grid> +</widget> +<connections> +</connections> +<tabstops> + <tabstop>editName</tabstop> + <tabstop>comboDriver</tabstop> + <tabstop>editDatabase</tabstop> + <tabstop>editUsername</tabstop> + <tabstop>editPassword</tabstop> + <tabstop>editHostname</tabstop> + <tabstop>editPort</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/dbconnectioneditor.ui b/kdevdesigner/designer/dbconnectioneditor.ui new file mode 100644 index 00000000..40ef0a9b --- /dev/null +++ b/kdevdesigner/designer/dbconnectioneditor.ui @@ -0,0 +1,147 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>DatabaseConnectionEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>DatabaseConnectionEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>393</width> + <height>286</height> + </rect> + </property> + <property name="caption"> + <string>Connect</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton" row="1" column="2"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQGroupBox" row="0" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>grp</cstring> + </property> + <property name="title"> + <string>Connection Details</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer row="0" column="0"> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>DatabaseConnectionEditorBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>DatabaseConnectionEditorBase</receiver> + <slot>accept()</slot> + </connection> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> +</connections> +<tabstops> + <tabstop>PushButton1</tabstop> + <tabstop>PushButton2</tabstop> +</tabstops> +</UI> diff --git a/kdevdesigner/designer/dbconnectionimpl.cpp b/kdevdesigner/designer/dbconnectionimpl.cpp new file mode 100644 index 00000000..3cfd1fdc --- /dev/null +++ b/kdevdesigner/designer/dbconnectionimpl.cpp @@ -0,0 +1,80 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "dbconnectionimpl.h" +#include "dbconnection.h" +#include "project.h" +#include "asciivalidator.h" +#include <tqgroupbox.h> +#include <tqcombobox.h> +#include <tqspinbox.h> +#include <klineedit.h> +#include <tqlayout.h> +#include <tqsqldatabase.h> + +DatabaseConnectionEditor::DatabaseConnectionEditor( DatabaseConnection* connection, TQWidget* parent, + const char* name, bool modal, WFlags fl ) + : DatabaseConnectionEditorBase( parent, name, modal, fl ), conn( connection ) +{ + connectionWidget = new DatabaseConnectionWidget( grp ); + grpLayout->addWidget( connectionWidget, 0, 0 ); + init(); +} + +DatabaseConnectionEditor::~DatabaseConnectionEditor() +{ +} + +void DatabaseConnectionEditor::accept() +{ +#ifndef TQT_NO_SQL + conn->setUsername( connectionWidget->editUsername->text() ); + conn->setPassword( connectionWidget->editPassword->text() ); + conn->setHostname( connectionWidget->editHostname->text() ); +#endif + DatabaseConnectionEditorBase::accept(); +} + +void DatabaseConnectionEditor::init() +{ + connectionWidget->editName->setEnabled( FALSE ); + connectionWidget->editName->setValidator( new AsciiValidator( TQT_TQOBJECT(connectionWidget->editName) ) ); + connectionWidget->editName->setText( conn->name() ); + connectionWidget->comboDriver->setEnabled( FALSE ); + connectionWidget->comboDriver->lineEdit()->setText( conn->driver() ); + connectionWidget->editDatabase->setEnabled( FALSE ); + connectionWidget->editDatabase->setText( conn->database() ); + connectionWidget->editUsername->setEnabled( TRUE ); + connectionWidget->editUsername->setText( conn->username() ); + connectionWidget->editPassword->setEnabled( TRUE ); + connectionWidget->editPassword->setText( "" ); + connectionWidget->editHostname->setEnabled( TRUE ); + connectionWidget->editHostname->setText( conn->hostname() ); + connectionWidget->editPort->setEnabled( TRUE ); + connectionWidget->editPort->setValue( conn->port() ); + connectionWidget->editUsername->setFocus(); + connectionWidget->editUsername->selectAll(); +} diff --git a/kdevdesigner/designer/dbconnectionimpl.h b/kdevdesigner/designer/dbconnectionimpl.h new file mode 100644 index 00000000..e2db2286 --- /dev/null +++ b/kdevdesigner/designer/dbconnectionimpl.h @@ -0,0 +1,58 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DBCONNECTIONIMPL_H +#define DBCONNECTIONIMPL_H + +#include "dbconnectioneditor.h" + +class DatabaseConnection; +class DatabaseConnectionWidget; +class TQGridLayout; + +class DatabaseConnectionEditor : public DatabaseConnectionEditorBase +{ + Q_OBJECT + + +public: + DatabaseConnectionEditor( DatabaseConnection* connection, TQWidget* parent = 0, + const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~DatabaseConnectionEditor(); + +public slots: + void accept(); +private: + void init(); + +private: + DatabaseConnection *conn; + TQGridLayout* lay; + DatabaseConnectionWidget* connectionWidget; + +}; + +#endif // DBCONNECTIONIMPL_H diff --git a/kdevdesigner/designer/dbconnections.ui b/kdevdesigner/designer/dbconnections.ui new file mode 100644 index 00000000..27d7d127 --- /dev/null +++ b/kdevdesigner/designer/dbconnections.ui @@ -0,0 +1,321 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>DatabaseConnectionBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>DatabaseConnectionBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>512</width> + <height>309</height> + </rect> + </property> + <property name="caption"> + <string>Edit Database Connections</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>buttonNew</cstring> + </property> + <property name="text"> + <string>&New Connection</string> + </property> + </widget> + <widget class="TQListBox" row="0" column="0" rowspan="5" colspan="1"> + <property name="name"> + <cstring>listConnections</cstring> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>buttonDelete</cstring> + </property> + <property name="text"> + <string>&Delete Connection</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="5" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonClose</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + <spacer row="2" column="1" rowspan="3" colspan="1"> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQGroupBox" row="0" column="2" rowspan="3" colspan="1"> + <property name="name"> + <cstring>grp</cstring> + </property> + <property name="title"> + <string>Connection</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer row="0" column="0"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="TQLayoutWidget" row="3" column="2"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonConnect</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Connec&t</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <spacer row="4" column="2"> + <property name="name"> + <cstring>Spacer6</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>buttonClose</sender> + <signal>clicked()</signal> + <receiver>DatabaseConnectionBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonNew</sender> + <signal>clicked()</signal> + <receiver>DatabaseConnectionBase</receiver> + <slot>newConnection()</slot> + </connection> + <connection> + <sender>buttonDelete</sender> + <signal>clicked()</signal> + <receiver>DatabaseConnectionBase</receiver> + <slot>deleteConnection()</slot> + </connection> + <connection> + <sender>buttonConnect</sender> + <signal>clicked()</signal> + <receiver>DatabaseConnectionBase</receiver> + <slot>doConnect()</slot> + </connection> + <connection> + <sender>listConnections</sender> + <signal>highlighted(const TQString&)</signal> + <receiver>DatabaseConnectionBase</receiver> + <slot>currentConnectionChanged(const TQString&)</slot> + </connection> + <connection> + <sender>listConnections</sender> + <signal>selected(const TQString&)</signal> + <receiver>DatabaseConnectionBase</receiver> + <slot>currentConnectionChanged(const TQString&)</slot> + </connection> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> + <slot access="protected" language="C++" returnType="void">currentConnectionChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">deleteConnection()</slot> + <slot access="protected" language="C++" returnType="void">newConnection()</slot> + <slot access="protected" language="C++" returnType="void">connectionNameChanged( const TQString & )</slot> + <slot access="protected" language="C++" returnType="void">doConnect()</slot> +</connections> +<tabstops> + <tabstop>buttonClose</tabstop> + <tabstop>listConnections</tabstop> + <tabstop>buttonNew</tabstop> + <tabstop>buttonDelete</tabstop> + <tabstop>buttonConnect</tabstop> + <tabstop>buttonHelp</tabstop> +</tabstops> +</UI> diff --git a/kdevdesigner/designer/dbconnectionsimpl.cpp b/kdevdesigner/designer/dbconnectionsimpl.cpp new file mode 100644 index 00000000..e589679b --- /dev/null +++ b/kdevdesigner/designer/dbconnectionsimpl.cpp @@ -0,0 +1,196 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "dbconnectionsimpl.h" +#include <tqptrlist.h> +#include <tqgroupbox.h> +#include <tqlayout.h> +#include "project.h" +#include <tqlistbox.h> +#include <tqcombobox.h> +#include <tqspinbox.h> +#include <klineedit.h> +#include <tqpushbutton.h> +#include <tqsqldatabase.h> +#include <tqmessagebox.h> +#include <tqapplication.h> +#include "mainwindow.h" +#include "asciivalidator.h" + +#include <tdelocale.h> + +static bool blockChanges = FALSE; + +/* + * Constructs a DatabaseConnectionsEditor which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +DatabaseConnectionsEditor::DatabaseConnectionsEditor( Project *pro, TQWidget* parent, const char* name, bool modal, WFlags fl ) + : DatabaseConnectionBase( parent, name, modal, fl ), project( pro ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + connectionWidget = new DatabaseConnectionWidget( grp ); + grpLayout->addWidget( connectionWidget, 0, 0 ); +#ifndef TQT_NO_SQL + TQPtrList<DatabaseConnection> lst = project->databaseConnections(); + for ( DatabaseConnection *conn = lst.first(); conn; conn = lst.next() ) + listConnections->insertItem( conn->name() ); + connectionWidget->comboDriver->insertStringList( TQSqlDatabase::drivers() ); +#endif + connectionWidget->editName->setValidator( new AsciiValidator( TQT_TQOBJECT(connectionWidget->editName) ) ); + enableAll( FALSE ); +} + +DatabaseConnectionsEditor::~DatabaseConnectionsEditor() +{ +} + +void DatabaseConnectionsEditor::deleteConnection() +{ + if ( listConnections->currentItem() == -1 ) + return; + project->removeDatabaseConnection( listConnections->currentText() ); + delete listConnections->item( listConnections->currentItem() ); + if ( listConnections->count() ) { + listConnections->setCurrentItem( 0 ); + currentConnectionChanged( listConnections->currentText() ); + } else { + enableAll( FALSE ); + } + project->saveConnections(); +} + +void DatabaseConnectionsEditor::newConnection() +{ + blockChanges = TRUE; + enableAll( TRUE ); + TQString n( "(default)" ); + if ( project->databaseConnection( n ) ) { + n = "connection"; + int i = 2; + while ( project->databaseConnection( n + TQString::number( i ) ) ) + ++i; + n = n + TQString::number( i ); + } + connectionWidget->editName->setText( n ); + listConnections->clearSelection(); + buttonConnect->setDefault( TRUE ); + connectionWidget->editName->setFocus(); + blockChanges = FALSE; +} + +void DatabaseConnectionsEditor::doConnect() +{ +#ifndef TQT_NO_SQL + if ( listConnections->currentItem() == -1 || + !listConnections->item( listConnections->currentItem() )->isSelected() ) { // new connection + // ### do error checking for duplicated connection names + DatabaseConnection *conn = new DatabaseConnection( project ); + conn->setName( connectionWidget->editName->text() ); + conn->setDriver( connectionWidget->comboDriver->lineEdit()->text() ); + conn->setDatabase( connectionWidget->editDatabase->text() ); + conn->setUsername( connectionWidget->editUsername->text() ); + conn->setPassword( connectionWidget->editPassword->text() ); + conn->setHostname( connectionWidget->editHostname->text() ); + conn->setPort( connectionWidget->editPort->value() ); + if ( conn->refreshCatalog() ) { + project->addDatabaseConnection( conn ); + listConnections->insertItem( conn->name() ); + listConnections->setCurrentItem( listConnections->count() - 1 ); + project->saveConnections(); + } else { + TQMessageBox::warning( MainWindow::self, i18n( "Connection" ), + i18n( "Could not connect to the database.\n" + "Please ensure that the database server is running " + "and that all the connection information is correct.\n" + "[ " + conn->lastError() + " ]" ) ); + delete conn; + } + } else { // sync // ### should this do something else? right now it just overwrites all info about the connection... + DatabaseConnection *conn = project->databaseConnection( listConnections->currentText() ); + conn->setName( connectionWidget->editName->text() ); + conn->setDriver( connectionWidget->comboDriver->lineEdit()->text() ); + conn->setDatabase( connectionWidget->editDatabase->text() ); + conn->setUsername( connectionWidget->editUsername->text() ); + conn->setPassword( connectionWidget->editPassword->text() ); + conn->setHostname( connectionWidget->editHostname->text() ); + conn->setPort( connectionWidget->editPort->value() ); + conn->refreshCatalog(); + project->saveConnections(); + } +#endif +} + +void DatabaseConnectionsEditor::currentConnectionChanged( const TQString &s ) +{ +#ifndef TQT_NO_SQL + DatabaseConnection *conn = project->databaseConnection( s ); + blockChanges = TRUE; + enableAll( conn != 0 ); + connectionWidget->editName->setEnabled( FALSE ); + blockChanges = FALSE; + if ( !conn ) + return; + blockChanges = TRUE; + connectionWidget->editName->setText( conn->name() ); + blockChanges = FALSE; + connectionWidget->comboDriver->lineEdit()->setText( conn->driver() ); + connectionWidget->editDatabase->setText( conn->database() ); + connectionWidget->editUsername->setText( conn->username() ); + connectionWidget->editPassword->setText( conn->password() ); + connectionWidget->editHostname->setText( conn->hostname() ); + connectionWidget->editPort->setValue( conn->port() ); +#endif +} + +void DatabaseConnectionsEditor::connectionNameChanged( const TQString &s ) +{ + if ( listConnections->currentItem() == 0 || blockChanges ) + return; + listConnections->changeItem( s, listConnections->currentItem() ); +} + +void DatabaseConnectionsEditor::enableAll( bool b ) +{ + connectionWidget->editName->setEnabled( b ); + connectionWidget->editName->setText( "" ); + connectionWidget->comboDriver->setEnabled( b ); + connectionWidget->comboDriver->lineEdit()->setText( "" ); + connectionWidget->editDatabase->setEnabled( b ); + connectionWidget->editDatabase->setText( "" ); + connectionWidget->editUsername->setEnabled( b ); + connectionWidget->editUsername->setText( "" ); + connectionWidget->editPassword->setEnabled( b ); + connectionWidget->editPassword->setText( "" ); + connectionWidget->editHostname->setEnabled( b ); + connectionWidget->editHostname->setText( "" ); + connectionWidget->editPort->setEnabled( b ); + connectionWidget->editPort->setValue( -1 ); + buttonConnect->setEnabled( b ); +} diff --git a/kdevdesigner/designer/dbconnectionsimpl.h b/kdevdesigner/designer/dbconnectionsimpl.h new file mode 100644 index 00000000..e06cc06a --- /dev/null +++ b/kdevdesigner/designer/dbconnectionsimpl.h @@ -0,0 +1,61 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DBCONNECTIONSIMPL_H +#define DBCONNECTIONSIMPL_H + +#include "dbconnections.h" +#include "dbconnection.h" + +class Project; + +class DatabaseConnectionsEditor : public DatabaseConnectionBase +{ + Q_OBJECT + + +public: + DatabaseConnectionsEditor( Project *pro, TQWidget* parent = 0, + const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~DatabaseConnectionsEditor(); + +protected slots: + void deleteConnection(); + void newConnection(); + void doConnect(); + void currentConnectionChanged( const TQString & ); + void connectionNameChanged( const TQString &s ); + +private: + void enableAll( bool b ); + +private: + Project *project; + DatabaseConnectionWidget* connectionWidget; + +}; + +#endif // DBCONNECTIONSIMPL_H diff --git a/kdevdesigner/designer/defs.cpp b/kdevdesigner/designer/defs.cpp new file mode 100644 index 00000000..c1aa36de --- /dev/null +++ b/kdevdesigner/designer/defs.cpp @@ -0,0 +1,84 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "defs.h" + +int size_type_to_int( TQSizePolicy::SizeType t ) +{ + if ( t == TQSizePolicy::Fixed ) + return 0; + if ( t == TQSizePolicy::Minimum ) + return 1; + if ( t == TQSizePolicy::Maximum ) + return 2; + if ( t == TQSizePolicy::Preferred ) + return 3; + if ( t == TQSizePolicy::MinimumExpanding ) + return 4; + if ( t == TQSizePolicy::Expanding ) + return 5; + if ( t == TQSizePolicy::Ignored ) + return 6; + return 0; +} + +TQString size_type_to_string( TQSizePolicy::SizeType t ) +{ + if ( t == TQSizePolicy::Fixed ) + return "Fixed"; + if ( t == TQSizePolicy::Minimum ) + return "Minimum"; + if ( t == TQSizePolicy::Maximum ) + return "Maximum"; + if ( t == TQSizePolicy::Preferred ) + return "Preferred"; + if ( t == TQSizePolicy::MinimumExpanding ) + return "MinimumExpanding"; + if ( t == TQSizePolicy::Expanding ) + return "Expanding"; + if ( t == TQSizePolicy::Ignored ) + return "Ignored"; + return TQString(); +} + +TQSizePolicy::SizeType int_to_size_type( int i ) +{ + if ( i == 0 ) + return TQSizePolicy::Fixed; + if ( i == 1 ) + return TQSizePolicy::Minimum; + if ( i == 2 ) + return TQSizePolicy::Maximum; + if ( i == 3 ) + return TQSizePolicy::Preferred; + if ( i == 4 ) + return TQSizePolicy::MinimumExpanding; + if ( i == 5 ) + return TQSizePolicy::Expanding; + if ( i == 6 ) + return TQSizePolicy::Ignored; + return TQSizePolicy::Preferred; +} diff --git a/kdevdesigner/designer/defs.h b/kdevdesigner/designer/defs.h new file mode 100644 index 00000000..45143b81 --- /dev/null +++ b/kdevdesigner/designer/defs.h @@ -0,0 +1,42 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DEFS_H +#define DEFS_H + +#include <tqsizepolicy.h> +#include <tqstring.h> + +#define POINTER_TOOL 32000 +#define CONNECT_TOOL 32001 +#define ORDER_TOOL 32002 +#define BUDDY_TOOL 32004 + +int size_type_to_int( TQSizePolicy::SizeType t ); +TQString size_type_to_string( TQSizePolicy::SizeType t ); +TQSizePolicy::SizeType int_to_size_type( int i ); + +#endif diff --git a/kdevdesigner/designer/designer_pch.h b/kdevdesigner/designer/designer_pch.h new file mode 100644 index 00000000..fa840181 --- /dev/null +++ b/kdevdesigner/designer/designer_pch.h @@ -0,0 +1,44 @@ +/* + * This is a precompiled header file for use in Xcode / Mac GCC / + * GCC >= 3.4 / VC to greatly speed the building of TQt Designer. It may + * also be of use to people developing their own project, but it is + * probably better to define your own header. Use of this header is + * currently UNSUPPORTED. + */ + +#if defined __cplusplus + +#include <private/tqucomextra_p.h> +#include <tqaction.h> +#include <tqapplication.h> +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include <tqdialog.h> +#include <tqheader.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqlineedit.h> +#include <tqlistbox.h> +#include <tqlistview.h> +#include <tqmap.h> +#include <tqmessagebox.h> +#include <tqmetaobject.h> +#include <tqobjectlist.h> +#include <tqpainter.h> +#include <tqpixmap.h> +#include <tqpushbutton.h> +#include <tqspinbox.h> +#include <tqstring.h> +#include <tqtooltip.h> +#include <tqvariant.h> +#include <tqwhatsthis.h> +#include <tqwidget.h> + +#include "command.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "metadatabase.h" +#include "project.h" +#include "widgetfactory.h" + +#endif diff --git a/kdevdesigner/designer/designeraction.cpp b/kdevdesigner/designer/designeraction.cpp new file mode 100644 index 00000000..66ecb438 --- /dev/null +++ b/kdevdesigner/designer/designeraction.cpp @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (C) 2004 by Alexander Dymo * + * cloudtemple@mksat.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "designeraction.h" + +DesignerAction::~DesignerAction() +{ +} + +void DesignerAction::setDisabled( bool d ) +{ + TQAction::setEnabled(!d); + emit actionEnabled(!d); +} + +void DesignerAction::setEnabled( bool e ) +{ + TQAction::setEnabled(e); + emit actionEnabled(e); +} + +#include "designeraction.moc" diff --git a/kdevdesigner/designer/designeraction.h b/kdevdesigner/designer/designeraction.h new file mode 100644 index 00000000..85efef6b --- /dev/null +++ b/kdevdesigner/designer/designeraction.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * Copyright (C) 2004 by Alexander Dymo * + * cloudtemple@mksat.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef DESIGNERACTION_H +#define DESIGNERACTION_H + +#include <tqaction.h> + +class DesignerAction : public TQAction +{ +Q_OBJECT + +public: + DesignerAction(TQObject *parent = 0, const char *name = 0) + :TQAction(parent, name) {} + DesignerAction ( const TQString & menuText, TQKeySequence accel, TQObject * parent, const char * name = 0 ) + :TQAction(menuText, accel, parent, name) {} + DesignerAction ( const TQIconSet & icon, const TQString & menuText, TQKeySequence accel, TQObject * parent, const char * name = 0 ) + :TQAction(icon, menuText, accel, parent, name) {} + DesignerAction ( const TQString & text, const TQIconSet & icon, const TQString & menuText, TQKeySequence accel, TQObject * parent, const char * name = 0, bool toggle = FALSE ) + :TQAction(text, icon, menuText, accel, parent, name, toggle) {} + DesignerAction ( const TQString & text, const TQString & menuText, TQKeySequence accel, TQObject * parent, const char * name = 0, bool toggle = FALSE ) + :TQAction(text, menuText, accel, parent, name, toggle) {} + DesignerAction ( TQObject * parent, const char * name, bool toggle ) + :TQAction(parent, name, toggle) {} + ~DesignerAction(); + + virtual void setEnabled(bool e); + virtual void setDisabled(bool d); + +signals: + void actionEnabled(bool e); + +}; + +#endif diff --git a/kdevdesigner/designer/designerapp.cpp b/kdevdesigner/designer/designerapp.cpp new file mode 100644 index 00000000..22d1e531 --- /dev/null +++ b/kdevdesigner/designer/designerapp.cpp @@ -0,0 +1,176 @@ + /********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "designerappiface.h" +#include "designerapp.h" +#include "mainwindow.h" +#include "formwindow.h" + +#include <kiconloader.h> + +#include <tqfile.h> +#include <tqdir.h> +#include <tqsettings.h> +#include <tqsplashscreen.h> + +#ifdef TQ_WS_WIN +#include <tqt_windows.h> +#include <process.h> +#endif + +static TQSplashScreen *splash = 0; + +void set_splash_status( const TQString &txt ) +{ + if ( !splash ) + return; + TQString splashText = "Licensed to " + + TQString::fromLatin1( TQT_PRODUCT_LICENSEE ) + "\n" + + txt; + splash->message( splashText, TQt::AlignRight|TQt::AlignTop ); +} + +DesignerApplication::DesignerApplication( int &argc, char **argv ) + : TQApplication( argc, argv ) +{ +#if defined(TQ_WS_WIN) + if ( winVersion() & TQt::WV_NT_based ) + DESIGNER_OPENFILE = RegisterWindowMessage((TCHAR*)"TQT_DESIGNER_OPEN_FILE"); + else + DESIGNER_OPENFILE = RegisterWindowMessageA("TQT_DESIGNER_OPEN_FILE"); +#endif +} + +TQSplashScreen *DesignerApplication::showSplash() +{ + TQRect screen = TQApplication::desktop()->screenGeometry(); + TQSettings config; + config.insertSearchPath( TQSettings::Windows, "/Trolltech" ); + + TQRect mainRect; + TQString keybase = settingsKey(); + bool show = config.readBoolEntry( keybase + "SplashScreen", TRUE ); + mainRect.setX( config.readNumEntry( keybase + "Geometries/MainwindowX", 0 ) ); + mainRect.setY( config.readNumEntry( keybase + "Geometries/MainwindowY", 0 ) ); + mainRect.setWidth( config.readNumEntry( keybase + "Geometries/MainwindowWidth", 500 ) ); + mainRect.setHeight( config.readNumEntry( keybase + "Geometries/MainwindowHeight", 500 ) ); + screen = TQApplication::desktop()->screenGeometry( TQApplication::desktop()->screenNumber( mainRect.center() ) ); + + if ( show ) { + splash = new TQSplashScreen( UserIcon("designer_splash.png") ); + splash->show(); + set_splash_status( "Initializing..." ); + } + + return splash; +} + +void DesignerApplication::closeSplash() +{ + splash->hide(); +} + +static TQString *settings_key = 0; +static TQString *old_settings_key = 0; + +TQString DesignerApplication::settingsKey() +{ + if ( !settings_key ) + settings_key = new TQString( "/TQt Designer/" + + TQString::number( (TQT_VERSION >> 16) & 0xff ) + + "." + TQString::number( (TQT_VERSION >> 8) & 0xff ) + "/" ); + return *settings_key; +} + +TQString DesignerApplication::oldSettingsKey() +{ + if ( !old_settings_key ) { + int majorVer = (TQT_VERSION >> 16) & 0xff; + int minorVer = (TQT_VERSION >> 8) & 0xff; + + // If minorVer is 0 (e.g. 4.0) then we don't want to read the + // old settings, too much might have changed. + if ( !minorVer == 0 ) + minorVer--; + + old_settings_key = new TQString( "/TQt Designer/" + + TQString::number( majorVer ) + + "." + TQString::number( minorVer ) + "/" ); + } + return *old_settings_key; +} + +void DesignerApplication::setSettingsKey( const TQString &key ) +{ + if ( !settings_key ) + settings_key = new TQString( key ); + else + *settings_key = key; +} + +#if defined(TQ_WS_WIN) +bool DesignerApplication::winEventFilter( MSG *msg ) +{ + if ( msg->message == DESIGNER_OPENFILE ) { + TQFile f( TQDir::homeDirPath() + "/.designerargs" ); + TQFileInfo fi(f); + if ( fi.lastModified() == lastMod ) + return TQApplication::winEventFilter( msg ); + lastMod = fi.lastModified(); + f.open( IO_ReadOnly ); + TQString args; + f.readLine( args, f.size() ); + TQStringList lst = TQStringList::split( " ", args ); + + for ( TQStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) { + TQString arg = (*it).stripWhiteSpace(); + if ( arg[0] != '-' ) { + TQObjectList* l = MainWindow::self->queryList( "FormWindow" ); + FormWindow* fw = (FormWindow*) l->first(); + FormWindow* totop = 0; + bool haveit = FALSE; + while ( fw ) { + haveit = haveit || fw->fileName() == arg; + if ( haveit ) + totop = fw; + + fw = (FormWindow*) l->next(); + } + + if ( !haveit ) { + FlashWindow( MainWindow::self->winId(), TRUE ); + MainWindow::self->openFormWindow( arg ); + } else if ( totop ) { + totop->setFocus(); + } + delete l; + } + } + return TRUE; + } + return TQApplication::winEventFilter( msg ); +} +#endif diff --git a/kdevdesigner/designer/designerapp.h b/kdevdesigner/designer/designerapp.h new file mode 100644 index 00000000..b3c62a11 --- /dev/null +++ b/kdevdesigner/designer/designerapp.h @@ -0,0 +1,58 @@ + /********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DESIGNERAPP_H +#define DESIGNERAPP_H + +class TQSplashScreen; + +#include <tqapplication.h> + +class DesignerApplication : public TQApplication +{ +public: + const char *className() const { return "DesignerApplication"; } + + DesignerApplication( int &argc, char **argv ); + + TQSplashScreen *showSplash(); + static void closeSplash(); + + static TQString settingsKey(); + static TQString oldSettingsKey(); + static void setSettingsKey( const TQString &key ); + +protected: + TQDateTime lastMod; + +#if defined(TQ_WS_WIN) + bool winEventFilter( MSG *msg ); + uint DESIGNER_OPENFILE; +#endif + +}; + +#endif diff --git a/kdevdesigner/designer/designerappiface.cpp b/kdevdesigner/designer/designerappiface.cpp new file mode 100644 index 00000000..57ee992e --- /dev/null +++ b/kdevdesigner/designer/designerappiface.cpp @@ -0,0 +1,1093 @@ + /********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqmenubar.h> +#include <tqpopupmenu.h> +#include "designerappiface.h" +#include "mainwindow.h" +#include "project.h" +#include "formwindow.h" +#include "workspace.h" +#include "widgetfactory.h" +#include "command.h" +#include "outputwindow.h" +#include "../shared/widgetdatabase.h" +#include <tqvariant.h> +#include <tqlistview.h> +#include <tqtextedit.h> +#include <tqstatusbar.h> +#include "pixmapcollection.h" +#include "hierarchyview.h" +#include <stdlib.h> +#include <tqmetaobject.h> +#include "popupmenueditor.h" +#include "menubareditor.h" + +DesignerInterfaceImpl::DesignerInterfaceImpl( MainWindow *mw ) + : mainWindow( mw ) +{ +} + +TQRESULT DesignerInterfaceImpl::queryInterface( const TQUuid &uuid, TQUnknownInterface** iface ) +{ + *iface = 0; + + if ( uuid == IID_TQUnknown ) + *iface = (TQUnknownInterface*)this; + else if ( uuid == IID_TQComponentInformation ) + *iface = (TQComponentInformationInterface*)this; + else if ( uuid == IID_Designer ) + *iface = (DesignerInterface*)this; + else + return TQE_NOINTERFACE; + + (*iface)->addRef(); + return TQS_OK; +} + + +DesignerProject *DesignerInterfaceImpl::currentProject() const +{ + return mainWindow->currProject()->iFace(); +} + +DesignerFormWindow *DesignerInterfaceImpl::currentForm() const +{ + if ( mainWindow->formWindow() ) + return mainWindow->formWindow()->iFace(); + return 0; +} + +DesignerSourceFile *DesignerInterfaceImpl::currentSourceFile() const +{ + if ( mainWindow->sourceFile() ) + return mainWindow->sourceFile()->iFace(); + return 0; +} + +TQPtrList<DesignerProject> DesignerInterfaceImpl::projectList() const +{ + return mainWindow->projectList(); +} + +void DesignerInterfaceImpl::showStatusMessage( const TQString &text, int ms ) const +{ + if ( text.isEmpty() ) { + mainWindow->statusBar()->clear(); + return; + } + if ( ms ) + mainWindow->statusMessage( text/*, ms*/ ); + else + mainWindow->statusMessage( text ); +} + +DesignerDock *DesignerInterfaceImpl::createDock() const +{ + return 0; +} + +DesignerOutputDock *DesignerInterfaceImpl::outputDock() const +{ + return mainWindow->outputWindow() ? mainWindow->outputWindow()->iFace() : 0; +} + +void DesignerInterfaceImpl::setModified( bool b, TQWidget *window ) +{ + mainWindow->setModified( b, window ); +} + +void DesignerInterfaceImpl::updateFunctionList() +{ + mainWindow->updateFunctionList(); + if ( mainWindow->objectHierarchy()->sourceEditor() ) + mainWindow->objectHierarchy()->updateClassBrowsers(); +} + +void DesignerInterfaceImpl::onProjectChange( TQObject *receiver, const char *slot ) +{ + TQObject::connect( mainWindow, TQT_SIGNAL( projectChanged() ), receiver, slot ); +} + +void DesignerInterfaceImpl::onFormChange( TQObject *receiver, const char *slot ) +{ + TQObject::connect( mainWindow, TQT_SIGNAL( formWindowChanged() ), receiver, slot ); + TQObject::connect( mainWindow, TQT_SIGNAL( editorChanged() ), receiver, slot ); +} + +bool DesignerInterfaceImpl::singleProjectMode() const +{ + return mainWindow->singleProjectMode(); +} + +void DesignerInterfaceImpl::showError( TQWidget *widget, + int line, const TQString &message ) +{ + mainWindow->showErrorMessage( TQT_TQOBJECT(widget), line, message ); +} + +void DesignerInterfaceImpl::runFinished() +{ + mainWindow->finishedRun(); +} + +void DesignerInterfaceImpl::showStackFrame( TQWidget *w, int line ) +{ + mainWindow->showStackFrame( TQT_TQOBJECT(w), line ); +} + +void DesignerInterfaceImpl::showDebugStep( TQWidget *w, int line ) +{ + mainWindow->showDebugStep( TQT_TQOBJECT(w), line ); +} + +void DesignerInterfaceImpl::runProjectPrecondition() +{ + mainWindow->runProjectPrecondition(); +} + +void DesignerInterfaceImpl::runProjectPostcondition( TQObjectList *l ) +{ + mainWindow->runProjectPostcondition( l ); +} + +DesignerProjectImpl::DesignerProjectImpl( Project *pr ) + : project( pr ) +{ +} + +TQPtrList<DesignerFormWindow> DesignerProjectImpl::formList() const +{ + TQPtrList<DesignerFormWindow> list; + TQObjectList *forms = project->formList(); + if ( !forms ) + return list; + + TQPtrListIterator<TQObject> it( *forms ); + while ( it.current() ) { + TQObject *obj = it.current(); + ++it; + TQWidget *par = ::tqqt_cast<FormWindow*>(obj->parent()); + if ( !obj->isWidgetType() || !par ) + continue; + + list.append( ((FormWindow*)par)->iFace() ); + } + + delete forms; + return list; +} + +TQString DesignerProjectImpl::formFileName( const TQString &form ) const +{ + for ( TQPtrListIterator<FormFile> forms = project->formFiles(); + forms.current(); ++forms ) { + if ( TQString( forms.current()->formName() ) == form ) + return forms.current()->fileName(); + } + return TQString(); +} + +TQStringList DesignerProjectImpl::formNames() const +{ + TQStringList l; + for ( TQPtrListIterator<FormFile> forms = project->formFiles(); + forms.current(); ++forms ) { + FormFile* f = forms.current(); + if ( f->isFake() ) + continue; + l << f->formName(); + } + return l; +} + +void DesignerProjectImpl::addForm( DesignerFormWindow * ) +{ +} + +void DesignerProjectImpl::removeForm( DesignerFormWindow * ) +{ +} + +TQString DesignerProjectImpl::fileName() const +{ + return project->fileName(); +} + +void DesignerProjectImpl::setFileName( const TQString & ) +{ +} + +TQString DesignerProjectImpl::projectName() const +{ + return project->projectName(); +} + +void DesignerProjectImpl::setProjectName( const TQString & ) +{ +} + +TQString DesignerProjectImpl::databaseFile() const +{ + return TQString(); +} + +void DesignerProjectImpl::setDatabaseFile( const TQString & ) +{ +} + +void DesignerProjectImpl::setupDatabases() const +{ + MainWindow::self->editDatabaseConnections(); +} + +TQPtrList<DesignerDatabase> DesignerProjectImpl::databaseConnections() const +{ + TQPtrList<DesignerDatabase> lst; +#ifndef TQT_NO_SQL + TQPtrList<DatabaseConnection> conns = project->databaseConnections(); + for ( DatabaseConnection *d = conns.first(); d; d = conns.next() ) + lst.append( d->iFace() ); +#endif + return lst; +} + +void DesignerProjectImpl::addDatabase( DesignerDatabase * ) +{ +} + +void DesignerProjectImpl::removeDatabase( DesignerDatabase * ) +{ +} + +void DesignerProjectImpl::save() const +{ +} + +void DesignerProjectImpl::setLanguage( const TQString &l ) +{ + project->setLanguage( l ); +} + +TQString DesignerProjectImpl::language() const +{ + return project->language(); +} + +void DesignerProjectImpl::setCustomSetting( const TQString &key, const TQString &value ) +{ + project->setCustomSetting( key, value ); +} + +TQString DesignerProjectImpl::customSetting( const TQString &key ) const +{ + if ( key == "QTSCRIPT_PACKAGES" ) { + TQString s = getenv( "QTSCRIPT_PACKAGES" ); + TQString s2 = project->customSetting( "QUICK_PACKAGES" ); + if ( !s.isEmpty() && !s2.isEmpty() ) +#if defined(Q_OS_WIN32) + s += ";"; +#else + s += ":"; +#endif + s += s2; + return s; + } + return project->customSetting( key ); +} + +DesignerPixmapCollection *DesignerProjectImpl::pixmapCollection() const +{ + return project->pixmapCollection()->iFace(); +} + +void DesignerProjectImpl::breakPoints( TQMap<TQString, TQValueList<uint> > &bps ) const +{ + MainWindow::self->saveAllBreakPoints(); + for ( TQPtrListIterator<SourceFile> sources = project->sourceFiles(); + sources.current(); ++sources ) { + SourceFile* f = sources.current(); + bps.insert( project->makeRelative( f->fileName() ) + " <Source-File>", MetaDataBase::breakPoints( f ) ); + } + for ( TQPtrListIterator<FormFile> forms = project->formFiles(); + forms.current(); ++forms ) { + if ( forms.current()->formWindow() ) + bps.insert( TQString( forms.current()->formWindow()->name() ) + " <Form>", MetaDataBase::breakPoints( TQT_TQOBJECT(forms.current()->formWindow()) ) ); + } +} + +TQString DesignerProjectImpl::breakPointCondition( TQObject *o, int line ) const +{ + return MetaDataBase::breakPointCondition( MainWindow::self->findRealObject( o ), line ); +} + +void DesignerProjectImpl::setBreakPointCondition( TQObject *o, int line, const TQString &condition ) +{ + MetaDataBase::setBreakPointCondition( MainWindow::self->findRealObject( o ), line, condition ); +} + +void DesignerProjectImpl::clearAllBreakpoints() const +{ + TQValueList<uint> empty; + for ( TQPtrListIterator<SourceFile> sources = project->sourceFiles(); + sources.current(); ++sources ) { + SourceFile* f = sources.current(); + MetaDataBase::setBreakPoints( f, empty ); + } + for ( TQPtrListIterator<FormFile> forms = project->formFiles(); + forms.current(); ++forms ) { + if ( forms.current()->formWindow() ) + MetaDataBase::setBreakPoints( TQT_TQOBJECT(forms.current()->formWindow()), empty ); + MainWindow::self->resetBreakPoints(); + } +} + +void DesignerProjectImpl::setIncludePath( const TQString &platform, const TQString &path ) +{ + project->setIncludePath( platform, path ); +} + +void DesignerProjectImpl::setLibs( const TQString &platform, const TQString &path ) +{ + project->setLibs( platform, path ); +} + +void DesignerProjectImpl::setDefines( const TQString &platform, const TQString &path ) +{ + project->setDefines( platform, path ); +} + +void DesignerProjectImpl::setConfig( const TQString &platform, const TQString &config ) +{ + project->setConfig( platform, config ); +} + +void DesignerProjectImpl::setTemplate( const TQString &t ) +{ + project->setTemplate( t ); +} + +TQString DesignerProjectImpl::config( const TQString &platform ) const +{ + return project->config( platform ); +} + +TQString DesignerProjectImpl::libs( const TQString &platform ) const +{ + return project->libs( platform ); +} + +TQString DesignerProjectImpl::defines( const TQString &platform ) const +{ + return project->defines( platform ); +} + +TQString DesignerProjectImpl::includePath( const TQString &platform ) const +{ + return project->includePath( platform ); +} + +TQString DesignerProjectImpl::templte() const +{ + return project->templte(); +} + +bool DesignerProjectImpl::isGenericObject( TQObject *o ) const +{ + return !!project->fakeFormFileFor( o ); +} + + + + + + + +#ifndef TQT_NO_SQL +DesignerDatabaseImpl::DesignerDatabaseImpl( DatabaseConnection *d ) + : db( d ) +{ +} + +TQString DesignerDatabaseImpl::name() const +{ + return db->name(); +} + +void DesignerDatabaseImpl::setName( const TQString & ) +{ +} + +TQString DesignerDatabaseImpl::driver() const +{ + return db->driver(); +} + +void DesignerDatabaseImpl::setDriver( const TQString & ) +{ +} + +TQString DesignerDatabaseImpl::database() const +{ + return db->database(); +} + +void DesignerDatabaseImpl::setDatabase( const TQString & ) +{ +} + +TQString DesignerDatabaseImpl::userName() const +{ + return db->username(); +} + +void DesignerDatabaseImpl::setUserName( const TQString & ) +{ +} + +TQString DesignerDatabaseImpl::password() const +{ + return db->password(); +} + +void DesignerDatabaseImpl::setPassword( const TQString & ) +{ +} + +TQString DesignerDatabaseImpl::hostName() const +{ + return db->hostname(); +} + +void DesignerDatabaseImpl::setHostName( const TQString & ) +{ +} + +TQStringList DesignerDatabaseImpl::tables() const +{ + return db->tables(); +} + +TQMap<TQString, TQStringList> DesignerDatabaseImpl::fields() const +{ + return db->fields(); +} + +void DesignerDatabaseImpl::open( bool suppressDialog ) const +{ + db->open( suppressDialog ); +} + +void DesignerDatabaseImpl::close() const +{ + db->close(); +} + +void DesignerDatabaseImpl::setFields( const TQMap<TQString, TQStringList> & ) +{ +} + +void DesignerDatabaseImpl::setTables( const TQStringList & ) +{ +} + +TQSqlDatabase* DesignerDatabaseImpl::connection() +{ + return db->connection(); +} +#endif + + + +DesignerPixmapCollectionImpl::DesignerPixmapCollectionImpl( PixmapCollection *coll ) + : pixCollection( coll ) +{ +} + +void DesignerPixmapCollectionImpl::addPixmap( const TQPixmap &p, const TQString &name, bool force ) +{ + PixmapCollection::Pixmap pix; + pix.pix = p; + pix.name = name; + pixCollection->addPixmap( pix, force ); + FormWindow *fw = MainWindow::self->formWindow(); + if ( fw ) + MetaDataBase::setPixmapKey( TQT_TQOBJECT(fw), p.serialNumber(), name ); +} + +TQPixmap DesignerPixmapCollectionImpl::pixmap( const TQString &name ) const +{ + return pixCollection->pixmap( name ); +} + + + +DesignerFormWindowImpl::DesignerFormWindowImpl( FormWindow *fw ) + : formWindow( fw ) +{ +} + +TQString DesignerFormWindowImpl::name() const +{ + return formWindow->name(); + } + +void DesignerFormWindowImpl::setName( const TQString &n ) +{ + formWindow->setName( n ); +} + +TQString DesignerFormWindowImpl::fileName() const +{ + return formWindow->fileName(); +} + +void DesignerFormWindowImpl::setFileName( const TQString & ) +{ +} + +void DesignerFormWindowImpl::save() const +{ +} + +bool DesignerFormWindowImpl::isModified() const +{ + return formWindow->commandHistory()->isModified(); +} + +void DesignerFormWindowImpl::insertWidget( TQWidget * ) +{ +} + +TQWidget *DesignerFormWindowImpl::create( const char *className, TQWidget *parent, const char *name ) +{ + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( className ), parent, name ); + formWindow->insertWidget( w, TRUE ); + formWindow->killAccels( TQT_TQOBJECT(formWindow->mainContainer()) ); + return w; +} + +void DesignerFormWindowImpl::removeWidget( TQWidget * ) +{ +} + +TQWidgetList DesignerFormWindowImpl::widgets() const +{ + return TQWidgetList(); +} + +void DesignerFormWindowImpl::undo() +{ +} + +void DesignerFormWindowImpl::redo() +{ +} + +void DesignerFormWindowImpl::cut() +{ +} + +void DesignerFormWindowImpl::copy() +{ +} + +void DesignerFormWindowImpl::paste() +{ +} + +void DesignerFormWindowImpl::adjustSize() +{ +} + +void DesignerFormWindowImpl::editConnections() +{ +} + +void DesignerFormWindowImpl::checkAccels() +{ +} + +void DesignerFormWindowImpl::layoutH() +{ + formWindow->layoutHorizontal(); +} + +void DesignerFormWindowImpl::layoutV() +{ +} + +void DesignerFormWindowImpl::layoutHSplit() +{ +} + +void DesignerFormWindowImpl::layoutVSplit() +{ +} + +void DesignerFormWindowImpl::layoutG() +{ + formWindow->layoutGrid(); +} + +void DesignerFormWindowImpl::layoutHContainer( TQWidget* w ) +{ + formWindow->layoutHorizontalContainer( w ); +} + +void DesignerFormWindowImpl::layoutVContainer( TQWidget* w ) +{ + formWindow->layoutVerticalContainer( w ); +} + +void DesignerFormWindowImpl::layoutGContainer( TQWidget* w ) +{ + formWindow->layoutGridContainer( w ); +} + +void DesignerFormWindowImpl::breakLayout() +{ +} + +void DesignerFormWindowImpl::selectWidget( TQWidget * w ) +{ + formWindow->selectWidget( TQT_TQOBJECT(w), TRUE ); +} + +void DesignerFormWindowImpl::selectAll() +{ +} + +void DesignerFormWindowImpl::clearSelection() +{ + formWindow->clearSelection(); +} + +bool DesignerFormWindowImpl::isWidgetSelected( TQWidget * ) const +{ + return FALSE; +} + +TQWidgetList DesignerFormWindowImpl::selectedWidgets() const +{ + return formWindow->selectedWidgets(); +} + +TQWidget *DesignerFormWindowImpl::currentWidget() const +{ + return formWindow->currentWidget(); +} + +TQWidget *DesignerFormWindowImpl::form() const +{ + return formWindow; +} + + +void DesignerFormWindowImpl::setCurrentWidget( TQWidget * ) +{ +} + +TQPtrList<TQAction> DesignerFormWindowImpl::actionList() const +{ + return TQPtrList<TQAction>(); +} + +TQAction *DesignerFormWindowImpl::createAction( const TQString& text, const TQIconSet& icon, const TQString& menuText, int accel, + TQObject* parent, const char* name, bool toggle ) +{ + QDesignerAction *a = new QDesignerAction( parent ); + a->setName( name ); + a->setText( text ); + if ( !icon.isNull() && !icon.pixmap().isNull() ) + a->setIconSet( icon ); + a->setMenuText( menuText ); + a->setAccel( accel ); + a->setToggleAction( toggle ); + return a; +} + +void DesignerFormWindowImpl::addAction( TQAction *a ) +{ + if ( formWindow->actionList().findRef( a ) != -1 ) + return; + formWindow->actionList().append( a ); + MetaDataBase::addEntry( a ); + setPropertyChanged( a, "name", TRUE ); + setPropertyChanged( a, "text", TRUE ); + setPropertyChanged( a, "menuText", TRUE ); + setPropertyChanged( a, "accel", TRUE ); + if ( !a->iconSet().isNull() && !a->iconSet().pixmap().isNull() ) + setPropertyChanged( a, "iconSet", TRUE ); +} + +void DesignerFormWindowImpl::removeAction( TQAction *a ) +{ + formWindow->actionList().removeRef( a ); +} + +void DesignerFormWindowImpl::preview() const +{ +} + +void DesignerFormWindowImpl::addConnection( TQObject *sender, const char *signal, TQObject *receiver, const char *slot ) +{ + MetaDataBase::addConnection( TQT_TQOBJECT(formWindow), sender, signal, receiver, slot ); +} + +void DesignerFormWindowImpl::addFunction( const TQCString &function, const TQString &specifier, + const TQString &access, const TQString &type, + const TQString &language, const TQString &returnType ) +{ + MetaDataBase::addFunction( TQT_TQOBJECT(formWindow), function, specifier, access, type, language, returnType ); + formWindow->mainWindow()->functionsChanged(); +} + + + +void DesignerFormWindowImpl::setProperty( TQObject *o, const char *property, const TQVariant &value ) +{ + int id = o->metaObject()->findProperty( property, TRUE ); + const TQMetaProperty* p = o->metaObject()->property( id, TRUE ); + if ( p && p->isValid() ) + o->setProperty( property, value ); + else + MetaDataBase::setFakeProperty( o, property, value ); +} + +TQVariant DesignerFormWindowImpl::property( TQObject *o, const char *prop ) const +{ + int id = o->metaObject()->findProperty( prop, TRUE ); + const TQMetaProperty* p = o->metaObject()->property( id, TRUE ); + if ( p && p->isValid() ) + return o->property( prop ); + return MetaDataBase::fakeProperty( o, prop ); +} + +void DesignerFormWindowImpl::setPropertyChanged( TQObject *o, const char *property, bool changed ) +{ + MetaDataBase::setPropertyChanged( o, property, changed ); +} + +bool DesignerFormWindowImpl::isPropertyChanged( TQObject *o, const char *property ) const +{ + return MetaDataBase::isPropertyChanged( o, property ); +} + +void DesignerFormWindowImpl::setColumnFields( TQObject *o, const TQMap<TQString, TQString> &f ) +{ + MetaDataBase::setColumnFields( o, f ); +} + +TQStringList DesignerFormWindowImpl::implementationIncludes() const +{ + TQValueList<MetaDataBase::Include> includes = MetaDataBase::includes( TQT_TQOBJECT(formWindow) ); + TQStringList lst; + for ( TQValueList<MetaDataBase::Include>::Iterator it = includes.begin(); it != includes.end(); ++it ) { + MetaDataBase::Include inc = *it; + if ( inc.implDecl != "in implementation" ) + continue; + TQString s = inc.header; + if ( inc.location == "global" ) { + s.prepend( "<" ); + s.append( ">" ); + } else { + s.prepend( "\"" ); + s.append( "\"" ); + } + lst << s; + } + return lst; +} + +TQStringList DesignerFormWindowImpl::declarationIncludes() const +{ + TQValueList<MetaDataBase::Include> includes = MetaDataBase::includes( TQT_TQOBJECT(formWindow) ); + TQStringList lst; + for ( TQValueList<MetaDataBase::Include>::Iterator it = includes.begin(); it != includes.end(); ++it ) { + MetaDataBase::Include inc = *it; + if ( inc.implDecl == "in implementation" ) + continue; + TQString s = inc.header; + if ( inc.location == "global" ) { + s.prepend( "<" ); + s.append( ">" ); + } else { + s.prepend( "\"" ); + s.append( "\"" ); + } + lst << s; + } + return lst; +} + +void DesignerFormWindowImpl::setImplementationIncludes( const TQStringList &lst ) +{ + TQValueList<MetaDataBase::Include> oldIncludes = MetaDataBase::includes( TQT_TQOBJECT(formWindow) ); + TQValueList<MetaDataBase::Include> includes; + for ( TQValueList<MetaDataBase::Include>::Iterator it = oldIncludes.begin(); it != oldIncludes.end(); ++it ) { + MetaDataBase::Include inc = *it; + if ( inc.implDecl == "in implementation" ) + continue; + includes << inc; + } + + for ( TQStringList::ConstIterator sit = lst.begin(); sit != lst.end(); ++sit ) { + TQString s = *sit; + if ( s.startsWith( "#include" ) ) + s.remove( (uint)0, 8 ); + s = s.simplifyWhiteSpace(); + if ( s[ 0 ] != '<' && s[ 0 ] != '"' ) { + s.prepend( "\"" ); + s.append( "\"" ); + } + if ( s[ 0 ] == '<' ) { + s.remove( (uint)0, 1 ); + s.remove( s.length() - 1, 1 ); + MetaDataBase::Include inc; + inc.header = s; + inc.implDecl = "in implementation"; + inc.location = "global"; + includes << inc; + } else { + s.remove( (uint)0, 1 ); + s.remove( s.length() - 1, 1 ); + MetaDataBase::Include inc; + inc.header = s; + inc.implDecl = "in implementation"; + inc.location = "local"; + includes << inc; + } + } + MetaDataBase::setIncludes( TQT_TQOBJECT(formWindow), includes ); + formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup(); +} + +void DesignerFormWindowImpl::setDeclarationIncludes( const TQStringList &lst ) +{ + TQValueList<MetaDataBase::Include> oldIncludes = MetaDataBase::includes( TQT_TQOBJECT(formWindow) ); + TQValueList<MetaDataBase::Include> includes; + for ( TQValueList<MetaDataBase::Include>::Iterator it = oldIncludes.begin(); it != oldIncludes.end(); ++it ) { + MetaDataBase::Include inc = *it; + if ( inc.implDecl == "in declaration" ) + continue; + includes << inc; + } + + for ( TQStringList::ConstIterator sit = lst.begin(); sit != lst.end(); ++sit ) { + TQString s = *sit; + if ( s.startsWith( "#include" ) ) + s.remove( (uint)0, 8 ); + s = s.simplifyWhiteSpace(); + if ( s[ 0 ] != '<' && s[ 0 ] != '"' ) { + s.prepend( "\"" ); + s.append( "\"" ); + } + if ( s[ 0 ] == '<' ) { + s.remove( (uint)0, 1 ); + s.remove( s.length() - 1, 1 ); + MetaDataBase::Include inc; + inc.header = s; + inc.implDecl = "in declaration"; + inc.location = "global"; + includes << inc; + } else { + s.remove( (uint)0, 1 ); + s.remove( s.length() - 1, 1 ); + MetaDataBase::Include inc; + inc.header = s; + inc.implDecl = "in declaration"; + inc.location = "local"; + includes << inc; + } + } + MetaDataBase::setIncludes( TQT_TQOBJECT(formWindow), includes ); + formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup(); +} + +TQStringList DesignerFormWindowImpl::forwardDeclarations() const +{ + return MetaDataBase::forwards( TQT_TQOBJECT(formWindow) ); +} + +void DesignerFormWindowImpl::setForwardDeclarations( const TQStringList &lst ) +{ + MetaDataBase::setForwards( TQT_TQOBJECT(formWindow), lst ); + formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup(); +} + +TQStringList DesignerFormWindowImpl::signalList() const +{ + return MetaDataBase::signalList( TQT_TQOBJECT(formWindow) ); +} + +void DesignerFormWindowImpl::setSignalList( const TQStringList &lst ) +{ + MetaDataBase::setSignalList( TQT_TQOBJECT(formWindow), lst ); + formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup(); +} + +void DesignerFormWindowImpl::onModificationChange( TQObject *receiver, const char *slot ) +{ + TQObject::connect( formWindow, TQT_SIGNAL( modificationChanged( bool, FormWindow * ) ), receiver, slot ); +} + +void DesignerFormWindowImpl::addMenu( const TQString &text, const TQString &name ) +{ + if ( !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) + return; + + TQMainWindow *mw = (TQMainWindow*)formWindow->mainContainer(); + PopupMenuEditor *popup = new PopupMenuEditor( formWindow, mw ); + TQString n = name; + formWindow->unify( TQT_TQOBJECT(popup), n, TRUE ); + popup->setName( n ); + MenuBarEditor *mb = (MenuBarEditor *)mw->child( 0, "MenuBarEditor" ); + if ( !mb ) { + mb = new MenuBarEditor( formWindow, mw ); + mb->setName( "MenuBar" ); + MetaDataBase::addEntry( TQT_TQOBJECT(mb) ); + } + mb->insertItem( text, popup ); + MetaDataBase::addEntry( TQT_TQOBJECT(popup) ); +} + +void DesignerFormWindowImpl::addMenuAction( const TQString &menu, TQAction *a ) +{ + if ( !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) + return; + TQMainWindow *mw = (TQMainWindow*)formWindow->mainContainer(); + if ( !mw->child( 0, "MenuBarEditor" ) ) + return; + PopupMenuEditor *popup = (PopupMenuEditor*)mw->child( menu, "PopupMenuEditor" ); + if ( !popup ) + return; + popup->insert( a ); +} + +void DesignerFormWindowImpl::addMenuSeparator( const TQString &menu ) +{ + if ( !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) + return; + TQMainWindow *mw = (TQMainWindow*)formWindow->mainContainer(); + if ( !mw->child( 0, "MenuBarEditor" ) ) + return; + PopupMenuEditor *popup = (PopupMenuEditor*)mw->child( menu, "PopupMenuEditor" ); + if ( !popup ) + return; + TQAction *a = new QSeparatorAction( 0 ); + popup->insert( a ); +} + +void DesignerFormWindowImpl::addToolBar( const TQString &text, const TQString &name ) +{ + if ( !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) + return; + TQMainWindow *mw = (TQMainWindow*)formWindow->mainContainer(); + TQToolBar *tb = new QDesignerToolBar( mw ); + TQString n = name; + formWindow->unify( TQT_TQOBJECT(tb), n, TRUE ); + tb->setName( n ); + mw->addToolBar( tb, text ); +} + +void DesignerFormWindowImpl::addToolBarAction( const TQString &tbn, TQAction *a ) +{ + if ( !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) + return; + TQMainWindow *mw = (TQMainWindow*)formWindow->mainContainer(); + QDesignerToolBar *tb = (QDesignerToolBar*)mw->child( tbn, "QDesignerToolBar" ); + if ( !tb ) + return; + a->addTo( tb ); + tb->addAction( a ); +} + +void DesignerFormWindowImpl::addToolBarSeparator( const TQString &tbn ) +{ + if ( !::tqqt_cast<TQMainWindow*>(formWindow->mainContainer()) ) + return; + TQMainWindow *mw = (TQMainWindow*)formWindow->mainContainer(); + QDesignerToolBar *tb = (QDesignerToolBar*)mw->child( tbn, "QDesignerToolBar" ); + if ( !tb ) + return; + TQAction *a = new QSeparatorAction( 0 ); + a->addTo( tb ); + tb->addAction( a ); +} + +DesignerDockImpl::DesignerDockImpl() +{ +} + +TQDockWindow *DesignerDockImpl::dockWindow() const +{ + return 0; +} + +DesignerOutputDockImpl::DesignerOutputDockImpl( OutputWindow *ow ) + : outWin( ow ) +{ +} + +TQWidget *DesignerOutputDockImpl::addView( const TQString &title ) +{ + TQWidget *page = new TQWidget( outWin ); + outWin->addTab( page, title ); + return page; +} + +void DesignerOutputDockImpl::appendDebug( const TQString &s ) +{ + outWin->appendDebug( s ); +} + +void DesignerOutputDockImpl::clearDebug() +{ +} + +void DesignerOutputDockImpl::appendError( const TQString &s, int l ) +{ + TQStringList ls; + ls << s; + TQValueList<uint> ll; + ll << l; + outWin->setErrorMessages( ls, ll, FALSE, TQStringList(), TQObjectList() ); +} + +void DesignerOutputDockImpl::clearError() +{ +} + +DesignerSourceFileImpl::DesignerSourceFileImpl( SourceFile *e ) + : ed( e ) +{ +} + +TQString DesignerSourceFileImpl::fileName() const +{ + return ed->fileName(); +} diff --git a/kdevdesigner/designer/designerappiface.h b/kdevdesigner/designer/designerappiface.h new file mode 100644 index 00000000..2ddcd47c --- /dev/null +++ b/kdevdesigner/designer/designerappiface.h @@ -0,0 +1,277 @@ + /********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef DESIGNERAPPIFACE_H +#define DESIGNERAPPIFACE_H + +#include "../interfaces/designerinterface.h" +#include "project.h" + +class FormWindow; +class MainWindow; +class Project; +class OutputWindow; +class SourceFile; + +class DesignerInterfaceImpl : public DesignerInterface +{ +public: + DesignerInterfaceImpl( MainWindow *mw ); + + DesignerProject *currentProject() const; + DesignerFormWindow *currentForm() const; + DesignerSourceFile *currentSourceFile() const; + TQPtrList<DesignerProject> projectList() const; + void showStatusMessage( const TQString &, int ms = 0 ) const; + DesignerDock *createDock() const; + DesignerOutputDock *outputDock() const; + void setModified( bool b, TQWidget *window ); + void updateFunctionList(); + + void onProjectChange( TQObject *receiver, const char *slot ); + void onFormChange( TQObject *receiver, const char *slot ); + + bool singleProjectMode() const; + void showError( TQWidget *widget, int line, const TQString &message ); + void runFinished(); + void showStackFrame( TQWidget *w, int line ); + void showDebugStep( TQWidget *w, int line ); + void runProjectPrecondition(); + void runProjectPostcondition( TQObjectList *l ); + + + TQRESULT queryInterface( const TQUuid &uuid, TQUnknownInterface** iface ); + TQ_REFCOUNT + +private: + MainWindow *mainWindow; + +}; + +class DesignerProjectImpl: public DesignerProject +{ +public: + DesignerProjectImpl( Project *pr ); + + TQPtrList<DesignerFormWindow> formList() const; + TQStringList formNames() const; + TQString formFileName( const TQString &form ) const; + void addForm( DesignerFormWindow * ); + void removeForm( DesignerFormWindow * ); + TQString fileName() const; + void setFileName( const TQString & ); + TQString projectName() const; + void setProjectName( const TQString & ); + TQString databaseFile() const; + void setDatabaseFile( const TQString & ); + void setupDatabases() const; + TQPtrList<DesignerDatabase> databaseConnections() const; + void addDatabase( DesignerDatabase * ); + void removeDatabase( DesignerDatabase * ); + void save() const; + void setLanguage( const TQString & ); + TQString language() const; + void setCustomSetting( const TQString &key, const TQString &value ); + TQString customSetting( const TQString &key ) const; + DesignerPixmapCollection *pixmapCollection() const; + void breakPoints( TQMap<TQString, TQValueList<uint> > &bps ) const; + TQString breakPointCondition( TQObject *o, int line ) const; + void setBreakPointCondition( TQObject *o, int line, const TQString &condition ); + void clearAllBreakpoints() const; + void setIncludePath( const TQString &platform, const TQString &path ); + void setLibs( const TQString &platform, const TQString &path ); + void setDefines( const TQString &platform, const TQString &path ); + void setConfig( const TQString &platform, const TQString &config ); + void setTemplate( const TQString &t ); + TQString config( const TQString &platform ) const; + TQString libs( const TQString &platform ) const; + TQString defines( const TQString &platform ) const; + TQString includePath( const TQString &platform ) const; + TQString templte() const; + bool isGenericObject( TQObject *o ) const; + +private: + Project *project; + +}; + +#ifndef TQT_NO_SQL +class TQSqlDatabase; + +class DesignerDatabaseImpl: public DesignerDatabase +{ +public: + DesignerDatabaseImpl( DatabaseConnection *d ); + + TQString name() const; + void setName( const TQString & ); + TQString driver() const; + void setDriver( const TQString & ); + TQString database() const; + void setDatabase( const TQString & ); + TQString userName() const; + void setUserName( const TQString & ); + TQString password() const; + void setPassword( const TQString & ); + TQString hostName() const; + void setHostName( const TQString & ); + TQStringList tables() const; + void setTables( const TQStringList & ); + TQMap<TQString, TQStringList> fields() const; + void setFields( const TQMap<TQString, TQStringList> & ); + void open( bool suppressDialog = TRUE ) const; + void close() const; + TQSqlDatabase* connection(); +private: + DatabaseConnection *db; + +}; +#endif + +class DesignerPixmapCollectionImpl : public DesignerPixmapCollection +{ +public: + DesignerPixmapCollectionImpl( PixmapCollection *coll ); + void addPixmap( const TQPixmap &p, const TQString &name, bool force ); + TQPixmap pixmap( const TQString &name ) const; + +private: + PixmapCollection *pixCollection; + +}; + +class DesignerFormWindowImpl: public DesignerFormWindow +{ +public: + DesignerFormWindowImpl( FormWindow *fw ); + + TQString name() const; + void setName( const TQString &n ); + TQString fileName() const; + void setFileName( const TQString & ); + void save() const; + bool isModified() const; + void insertWidget( TQWidget * ); + TQWidget *create( const char *className, TQWidget *parent, const char *name ); + void removeWidget( TQWidget * ); + TQWidgetList widgets() const; + void undo(); + void redo(); + void cut(); + void copy(); + void paste(); + void adjustSize(); + void editConnections(); + void checkAccels(); + void layoutH(); + void layoutV(); + void layoutHSplit(); + void layoutVSplit(); + void layoutG(); + void layoutHContainer( TQWidget* w ); + void layoutVContainer( TQWidget* w ); + void layoutGContainer( TQWidget* w ); + void breakLayout(); + void selectWidget( TQWidget * ); + void selectAll(); + void clearSelection(); + bool isWidgetSelected( TQWidget * ) const; + TQWidgetList selectedWidgets() const; + TQWidget *currentWidget() const; + TQWidget *form() const; + void setCurrentWidget( TQWidget * ); + TQPtrList<TQAction> actionList() const; + TQAction *createAction( const TQString& text, const TQIconSet& icon, const TQString& menuText, int accel, + TQObject* parent, const char* name = 0, bool toggle = FALSE ); + void addAction( TQAction * ); + void removeAction( TQAction * ); + void preview() const; + void addFunction( const TQCString &function, const TQString& specifier, const TQString &access, + const TQString &type, const TQString &language, const TQString &returnType ); + void addConnection( TQObject *sender, const char *signal, TQObject *receiver, const char *slot ); + void setProperty( TQObject *o, const char *property, const TQVariant &value ); + TQVariant property( TQObject *o, const char *property ) const; + void setPropertyChanged( TQObject *o, const char *property, bool changed ); + bool isPropertyChanged( TQObject *o, const char *property ) const; + void setColumnFields( TQObject *o, const TQMap<TQString, TQString> & ); + TQStringList implementationIncludes() const; + TQStringList declarationIncludes() const; + void setImplementationIncludes( const TQStringList &lst ); + void setDeclarationIncludes( const TQStringList &lst ); + TQStringList forwardDeclarations() const; + void setForwardDeclarations( const TQStringList &lst ); + TQStringList signalList() const; + void setSignalList( const TQStringList &lst ); + void addMenu( const TQString &text, const TQString &name ); + void addMenuAction( const TQString &menu, TQAction *a ); + void addMenuSeparator( const TQString &menu ); + void addToolBar( const TQString &text, const TQString &name ); + void addToolBarAction( const TQString &tb, TQAction *a ); + void addToolBarSeparator( const TQString &tb ); + + void onModificationChange( TQObject *receiver, const char *slot ); + +private: + FormWindow *formWindow; + +}; + +class DesignerDockImpl: public DesignerDock +{ +public: + DesignerDockImpl(); + + TQDockWindow *dockWindow() const; +}; + +class DesignerOutputDockImpl: public DesignerOutputDock +{ +public: + DesignerOutputDockImpl( OutputWindow *ow ); + + TQWidget *addView( const TQString &pageName ); + void appendDebug( const TQString & ); + void clearDebug(); + void appendError( const TQString &, int ); + void clearError(); + +private: + OutputWindow *outWin; + +}; + +class DesignerSourceFileImpl : public DesignerSourceFile +{ +public: + DesignerSourceFileImpl( SourceFile *e ); + TQString fileName() const; + +private: + SourceFile *ed; + +}; + +#endif diff --git a/kdevdesigner/designer/editfunctions.ui b/kdevdesigner/designer/editfunctions.ui new file mode 100644 index 00000000..ea59e46a --- /dev/null +++ b/kdevdesigner/designer/editfunctions.ui @@ -0,0 +1,714 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>EditFunctionsBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>EditFunctionsBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>371</height> + </rect> + </property> + <property name="caption"> + <string>Edit Functions</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Edit Functions</b><p>Add, edit or delete the current form's slots or functions.</p><p>Click the <b>Add Function</b>-button to create a new function; enter a name, choose an access mode and specify if it should be a slot or normal function.</p><p>Select an entry from the list and click the <b>Delete Function</b>-button to remove a function; in case of a slot all connections using this slot will also be removed.</p></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListView"> + <column> + <property name="text"> + <string>Function</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Return Type</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Specifier</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Access</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Type</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>In Use</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>functionListView</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="showSortIndicator"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>This form's functions.</b><p>Select the function you want to change or delete.</p></string> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout11</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>showOnlySlots</cstring> + </property> + <property name="focusPolicy"> + <enum>StrongFocus</enum> + </property> + <property name="text"> + <string>Only d&isplay slots</string> + </property> + <property name="toolTip" stdset="0"> + <string>Change displaying mode for functions</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Check this button if only the slots should be displayed</b><p>Otherwise all functions, i.e. normal C++ functions and slots are displayed.</p> +</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Vertical Spacing1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>addFunction</cstring> + </property> + <property name="text"> + <string>&New Function</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add new function</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Add a new function.</b><p>New functions have a default name and public access.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>deleteFunction</cstring> + </property> + <property name="text"> + <string>&Delete Function</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete function</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the selected function.</b><p>All connections using this function are also removed.</p></string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>boxProperties</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Function Properties</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout14</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>Label8</cstring> + </property> + <property name="text"> + <string>&Function:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + <property name="buddy" stdset="0"> + <cstring>functionName</cstring> + </property> + </widget> + <widget class="KLineEdit"> + <property name="name"> + <cstring>functionName</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" stdset="0"> + <string>Change function name</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the name of the selected function.</b><p>The name should include the argument list and must be syntactically correct.</p></string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelType</cstring> + </property> + <property name="text"> + <string>&Return type:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + <property name="buddy" stdset="0"> + <cstring>editType</cstring> + </property> + </widget> + <widget class="KLineEdit"> + <property name="name"> + <cstring>editType</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" stdset="0"> + <string>Change the return type of the function</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the return type of the selected function.</b><p>Specifiy here the datatype which should be returned by the function.</p></string> + </property> + </widget> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Fixed</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout13</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>Label9_2</cstring> + </property> + <property name="text"> + <string>S&pecifier:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + <property name="buddy" stdset="0"> + <cstring>functionSpecifier</cstring> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>non virtual</string> + </property> + </item> + <item> + <property name="text"> + <string>virtual</string> + </property> + </item> + <item> + <property name="text"> + <string>pure virtual</string> + </property> + </item> + <item> + <property name="text"> + <string>static</string> + </property> + </item> + <property name="name"> + <cstring>functionSpecifier</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" stdset="0"> + <string>Change function access</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the access policy of the function</b><p>All functions are created virtual and should be reimplemented in subclasses.</p></string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>&Access:</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter|AlignRight</set> + </property> + <property name="buddy" stdset="0"> + <cstring>functionAccess</cstring> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>public</string> + </property> + </item> + <item> + <property name="text"> + <string>protected</string> + </property> + </item> + <item> + <property name="text"> + <string>private</string> + </property> + </item> + <property name="name"> + <cstring>functionAccess</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" stdset="0"> + <string>Change function access</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the access policy of the function</b><p>All functions are created virtual and should be reimplemented in subclasses.</p></string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>&Type:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + <property name="buddy" stdset="0"> + <cstring>functionType</cstring> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>slot</string> + </property> + </item> + <item> + <property name="text"> + <string>function</string> + </property> + </item> + <property name="name"> + <cstring>functionType</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change function type</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the type of the function.</b><p>The type specifies if the function is either a slot or a normal C++ function.</p></string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>okButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>cancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>cancelButton</sender> + <signal>clicked()</signal> + <receiver>EditFunctionsBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>okButton</sender> + <signal>clicked()</signal> + <receiver>EditFunctionsBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>deleteFunction</sender> + <signal>clicked()</signal> + <receiver>EditFunctionsBase</receiver> + <slot>functionRemove()</slot> + </connection> + <connection> + <sender>addFunction</sender> + <signal>clicked()</signal> + <receiver>EditFunctionsBase</receiver> + <slot>functionAdd()</slot> + </connection> + <connection> + <sender>functionName</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>functionListView</sender> + <signal>selectionChanged(TQListViewItem*)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentItemChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>functionListView</sender> + <signal>currentChanged(TQListViewItem*)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentItemChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>editType</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentReturnTypeChanged(const TQString&)</slot> + </connection> + <connection> + <sender>functionSpecifier</sender> + <signal>activated(const TQString&)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentSpecifierChanged(const TQString&)</slot> + </connection> + <connection> + <sender>functionAccess</sender> + <signal>activated(const TQString&)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentAccessChanged(const TQString&)</slot> + </connection> + <connection> + <sender>functionType</sender> + <signal>activated(const TQString&)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>currentTypeChanged(const TQString&)</slot> + </connection> + <connection> + <sender>showOnlySlots</sender> + <signal>toggled(bool)</signal> + <receiver>EditFunctionsBase</receiver> + <slot>displaySlots(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>functionName</tabstop> + <tabstop>editType</tabstop> + <tabstop>functionSpecifier</tabstop> + <tabstop>functionAccess</tabstop> + <tabstop>functionType</tabstop> + <tabstop>helpButton</tabstop> + <tabstop>okButton</tabstop> + <tabstop>cancelButton</tabstop> + <tabstop>functionListView</tabstop> + <tabstop>showOnlySlots</tabstop> + <tabstop>addFunction</tabstop> + <tabstop>deleteFunction</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">currentItemChanged( TQListViewItem * )</slot> + <slot access="protected">currentSpecifierChanged( const TQString & )</slot> + <slot access="protected">currentTextChanged( const TQString & )</slot> + <slot access="protected">currentReturnTypeChanged( const TQString & )</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">init()</slot> + <slot access="protected">currentAccessChanged( const TQString & )</slot> + <slot access="protected">currentTypeChanged( const TQString & )</slot> + <slot access="protected">okClicked()</slot> + <slot access="protected">functionAdd()</slot> + <slot access="protected">functionRemove()</slot> + <slot access="protected">displaySlots( bool )</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/editfunctionsimpl.cpp b/kdevdesigner/designer/editfunctionsimpl.cpp new file mode 100644 index 00000000..5681f00b --- /dev/null +++ b/kdevdesigner/designer/editfunctionsimpl.cpp @@ -0,0 +1,534 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "editfunctionsimpl.h" +#include "formwindow.h" +#include "metadatabase.h" +#include "asciivalidator.h" +#include "mainwindow.h" +#include "hierarchyview.h" +#include "project.h" + +#include <kiconloader.h> +#include <klineedit.h> +#include "kdevdesigner_part.h" + +#include <tqlistview.h> +#include <tqpushbutton.h> +#include <tqcombobox.h> +#include <tqstrlist.h> +#include <tqmessagebox.h> +#include <tqlayout.h> +#include <tqlabel.h> +#include <tqgroupbox.h> +#include <tqheader.h> +#include <tqcheckbox.h> + +#include <tdelocale.h> + +EditFunctions::EditFunctions( TQWidget *parent, FormWindow *fw, bool justSlots ) + : EditFunctionsBase( parent, 0, TRUE ), formWindow( fw ) +{ + connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + + id = 0; + functList.clear(); + + TQValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( TQT_TQOBJECT(fw) ); + for ( TQValueList<MetaDataBase::Function>::Iterator it = functionList.begin(); it != functionList.end(); ++it ) { + TQListViewItem *i = new TQListViewItem( functionListView ); + + i->setPixmap( 0, SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()) ); + i->setText( 0, (*it).function ); + i->setText( 1, (*it).returnType ); + i->setText( 2, (*it).specifier ); + i->setText( 3, (*it).access ); + i->setText( 4, (*it).type ); + + FunctItem fui; + fui.id = id; + fui.oldName = (*it).function; + fui.newName = fui.oldName; + fui.oldRetTyp = (*it).returnType; + fui.retTyp = fui.oldRetTyp; + fui.oldSpec = (*it).specifier; + fui.spec = fui.oldSpec; + fui.oldAccess = (*it).access; + fui.access = fui.oldAccess; + fui.oldType = (*it).type; + fui.type = fui.oldType; + functList.append( fui ); + + functionIds.insert( i, id ); + id++; + + if ( (*it).type == "slot" ) { + if ( MetaDataBase::isSlotUsed( TQT_TQOBJECT(formWindow), MetaDataBase::normalizeFunction( (*it).function ).latin1() ) ) + i->setText( 5, i18n( "Yes" ) ); + else + i->setText( 5, i18n( "No" ) ); + } else { + i->setText( 5, "---" ); + } + } + + boxProperties->setEnabled( FALSE ); + functionName->setValidator( new AsciiValidator( TRUE, TQT_TQOBJECT(functionName) ) ); + + if ( functionListView->firstChild() ) + functionListView->setCurrentItem( functionListView->firstChild() ); + + showOnlySlots->setChecked( justSlots ); + lastType = "function"; + + // Enable rename for all TQListViewItems + TQListViewItemIterator lvit = functionListView->firstChild(); + for ( ; *lvit; lvit++ ) + (*lvit)->setRenameEnabled( 0, TRUE ); + + // Connect listview signal to signal-relay + TQObject::connect( functionListView, + TQT_SIGNAL( itemRenamed( TQListViewItem*, int, const TQString & ) ), + this, + TQT_SLOT( emitItemRenamed(TQListViewItem*, int, const TQString&) ) ); + + // Connect signal-relay to TQLineEdit "functionName" + TQObjectList *l = parent->queryList( TQLINEEDIT_OBJECT_NAME_STRING, "functionName" ); + TQObject *obj; + TQObjectListIt itemsLineEditIt( *l ); + while ( (obj = itemsLineEditIt.current()) != 0 ) { + ++itemsLineEditIt; + TQObject::connect( this, + TQT_SIGNAL( itemRenamed( const TQString & ) ), + obj, + TQT_SLOT( setText( const TQString & ) ) ); + } + delete l; +} + +void EditFunctions::okClicked() +{ + TQValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( TQT_TQOBJECT(formWindow) ); + TQString n = i18n( "Add/Remove functions of '%1'" ).arg( formWindow->name() ); + TQPtrList<Command> commands; + TQValueList<MetaDataBase::Function>::Iterator fit; + if ( !functionList.isEmpty() ) { + for ( fit = functionList.begin(); fit != functionList.end(); ++fit ) { + bool functionFound = FALSE; + TQValueList<FunctItem>::Iterator it = functList.begin(); + for ( ; it != functList.end(); ++it ) { + if ( MetaDataBase::normalizeFunction( (*it).oldName ) == + MetaDataBase::normalizeFunction( (*fit).function ) ) { + functionFound = TRUE; + break; + } + } + if ( !functionFound ) + commands.append( new RemoveFunctionCommand( i18n( "Remove Function" ), + formWindow, (*fit).function, (*fit).specifier, + (*fit).access, + (*fit).type, + formWindow->project()->language(), + (*fit).returnType ) ); + } + } + + bool invalidFunctions = FALSE; + TQValueList<FunctItem> invalidItems; + + if ( !functList.isEmpty() ) { + TQStrList lst; + TQValueList<FunctItem>::Iterator it = functList.begin(); + for ( ; it != functList.end(); ++it ) { + MetaDataBase::Function function; + function.function = (*it).newName; + function.returnType = (*it).retTyp; + function.specifier = (*it).spec; + function.access = (*it).access; + function.type = (*it).type; + function.language = formWindow->project()->language(); + if ( function.returnType.isEmpty() ) + function.returnType = "void"; + TQString s = function.function; + s = s.simplifyWhiteSpace(); + bool startNum = s[ 0 ] >= '0' && s[ 0 ] <= '9'; + bool noParens = s.contains( '(' ) != 1 || s.contains( ')' ) != 1; + bool illegalSpace = s.find( ' ' ) != -1 && s.find( ' ' ) < s.find( '(' ); + + if ( startNum || noParens || illegalSpace || lst.find( function.function ) != -1 ) { + invalidFunctions = TRUE; + invalidItems.append( (*it) ); + continue; + } + bool functionFound = FALSE; + for ( fit = functionList.begin(); fit != functionList.end(); ++fit ) { + if ( MetaDataBase::normalizeFunction( (*fit).function ) == + MetaDataBase::normalizeFunction( (*it).oldName ) ) { + functionFound = TRUE; + break; + } + } + if ( !functionFound ) + commands.append( new AddFunctionCommand( i18n( "Add Function" ), + formWindow, function.function, function.specifier, + function.access, + function.type, formWindow->project()->language(), + function.returnType ) ); + if ( MetaDataBase::normalizeFunction( (*it).newName ) != MetaDataBase::normalizeFunction( (*it).oldName ) || + (*it).spec != (*it).oldSpec || (*it).access != (*it).oldAccess || (*it).type != (*it).oldType || + (*it).retTyp != (*it).oldRetTyp ) { + TQString normalizedOldName = MetaDataBase::normalizeFunction( (*it).oldName ); + if ((*it).oldName.endsWith("const")) // make sure we get the 'const' when we remove the old name + normalizedOldName += " const"; + commands.append( new ChangeFunctionAttribCommand( i18n( "Change Function Attributes" ), + formWindow, function, normalizedOldName, + (*it).oldSpec, (*it).oldAccess, (*it).oldType, + formWindow->project()->language(), (*it).oldRetTyp ) ); + } + lst.append( function.function ); + } + } + + if ( invalidFunctions ) { + if ( TQMessageBox::information( this, i18n( "Edit Functions" ), + i18n( "Some syntactically incorrect functions have been defined.\n" + "Remove these functions?" ), i18n( "&Yes" ), i18n( "&No" ) ) == 0 ) { + TQValueList<FunctItem>::Iterator it = functList.begin(); + while ( it != functList.end() ) { + bool found = FALSE; + TQValueList<FunctItem>::Iterator vit = invalidItems.begin(); + for ( ; vit != invalidItems.end(); ++vit ) { + if ( (*vit).newName == (*it).newName ) { + invalidItems.remove( vit ); + found = TRUE; + break; + } + } + if ( found ) { + int delId = (*it).id; + it = functList.remove( it ); + TQMap<TQListViewItem*, int>::Iterator fit = functionIds.begin(); + while ( fit != functionIds.end() ) { + if ( *fit == delId ) { + TQListViewItem *litem = fit.key(); + functionIds.remove( fit ); + delete litem; + if ( functionListView->currentItem() ) + functionListView->setSelected( functionListView->currentItem(), TRUE ); + currentItemChanged( functionListView->currentItem() ); + break; + } + ++fit; + } + } + else + ++it; + } + if ( functionListView->firstChild() ) { + functionListView->setCurrentItem( functionListView->firstChild() ); + functionListView->setSelected( functionListView->firstChild(), TRUE ); + } + } + formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + return; + } + + if ( !commands.isEmpty() ) { + MacroCommand *cmd = new MacroCommand( n, formWindow, commands ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + + formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + accept(); +} + +void EditFunctions::functionAdd( const TQString &access, const TQString &type ) +{ + TQListViewItem *i = new TQListViewItem( functionListView ); + i->setPixmap( 0, SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()) ); + i->setRenameEnabled( 0, TRUE ); + i->setText( 1, "void" ); + i->setText( 2, "virtual" ); + + if ( access.isEmpty() ) + i->setText( 3, "public" ); + else + i->setText( 3, access ); + + if( type.isEmpty() ) { + if ( showOnlySlots->isChecked() ) + i->setText( 4, "slot" ); + else { + i->setText( 4, lastType ); + } + } else { + i->setText( 4, type ); + } + + if ( i->text( 4 ) == "slot" ) { + i->setText( 0, "newSlot()" ); + if ( MetaDataBase::isSlotUsed( TQT_TQOBJECT(formWindow), "newSlot()" ) ) + i->setText( 5, i18n( "Yes" ) ); + else + i->setText( 5, i18n( "No" ) ); + } else { + i->setText( 0, "newFunction()" ); + i->setText( 5, "---" ); + } + + functionListView->setCurrentItem( i ); + functionListView->setSelected( i, TRUE ); + functionListView->ensureItemVisible( i ); + functionName->setFocus(); + functionName->selectAll(); + + FunctItem fui; + fui.id = id; + fui.oldName = i->text( 0 ); + fui.newName = fui.oldName; + fui.oldRetTyp = i->text( 1 ); + fui.retTyp = fui.oldRetTyp; + fui.oldSpec = i->text ( 2 ); + fui.spec = fui.oldSpec; + fui.oldAccess = i->text( 3 ); + fui.access = fui.oldAccess; + fui.oldType = i->text( 4 ); + fui.type = fui.oldType; + lastType = fui.oldType; + functList.append( fui ); + functionIds.insert( i, id ); + id++; +} + +void EditFunctions::functionRemove() +{ + if ( !functionListView->currentItem() ) + return; + + functionListView->blockSignals( TRUE ); + removedFunctions << MetaDataBase::normalizeFunction( functionListView->currentItem()->text( 0 ) ); + int delId = functionIds[ functionListView->currentItem() ]; + TQValueList<FunctItem>::Iterator it = functList.begin(); + while ( it != functList.end() ) { + if ( (*it).id == delId ) { + functList.remove( it ); + break; + } + ++it; + } + functionIds.remove( functionListView->currentItem() ); + delete functionListView->currentItem(); + if ( functionListView->currentItem() ) + functionListView->setSelected( functionListView->currentItem(), TRUE ); + functionListView->blockSignals( FALSE ); + currentItemChanged( functionListView->currentItem() ); +} + +void EditFunctions::currentItemChanged( TQListViewItem *i ) +{ + functionName->blockSignals( TRUE ); + functionName->setText( "" ); + functionAccess->setCurrentItem( 0 ); + functionName->blockSignals( FALSE ); + + if ( !i ) { + boxProperties->setEnabled( FALSE ); + return; + } + + functionName->blockSignals( TRUE ); + functionName->setText( i->text( 0 ) ); + editType->setText( i->text( 1 ) ); + TQString specifier = i->text( 2 ); + TQString access = i->text( 3 ); + TQString type = i->text( 4 ); + if ( specifier == "pure virtual" ) + functionSpecifier->setCurrentItem( 2 ); + else if ( specifier == "non virtual" ) + functionSpecifier->setCurrentItem( 0 ); + else if ( specifier == "virtual" ) + functionSpecifier->setCurrentItem( 1 ); + else + functionSpecifier->setCurrentItem( 3 ); + if ( access == "private" ) + functionAccess->setCurrentItem( 2 ); + else if ( access == "protected" ) + functionAccess->setCurrentItem( 1 ); + else + functionAccess->setCurrentItem( 0 ); + if ( type == "slot" ) + functionType->setCurrentItem( 0 ); + else + functionType->setCurrentItem( 1 ); + + functionName->blockSignals( FALSE ); + boxProperties->setEnabled( TRUE ); +} + +void EditFunctions::currentTextChanged( const TQString &txt ) +{ + if ( !functionListView->currentItem() ) + return; + + changeItem( functionListView->currentItem(), Name, txt ); + functionListView->currentItem()->setText( 0, txt ); + + if ( functionListView->currentItem()->text( 4 ) == "slot" ) { + if ( MetaDataBase::isSlotUsed( TQT_TQOBJECT(formWindow), MetaDataBase::normalizeFunction( txt.latin1() ).latin1() ) ) + functionListView->currentItem()->setText( 5, i18n( "Yes" ) ); + else + functionListView->currentItem()->setText( 5, i18n( "No" ) ); + } else { + functionListView->currentItem()->setText( 5, "---" ); + } +} + +void EditFunctions::currentSpecifierChanged( const TQString& s ) +{ + if ( !functionListView->currentItem() ) + return; + + changeItem( functionListView->currentItem(), Specifier, s ); + functionListView->currentItem()->setText( 2, s ); +} + +void EditFunctions::currentAccessChanged( const TQString& a ) +{ + if ( !functionListView->currentItem() ) + return; + changeItem( functionListView->currentItem(), Access, a ); + functionListView->currentItem()->setText( 3, a ); +} + + +void EditFunctions::currentReturnTypeChanged( const TQString &type ) +{ + if ( !functionListView->currentItem() ) + return; + changeItem( functionListView->currentItem(), ReturnType, type ); + functionListView->currentItem()->setText( 1, type ); +} + +void EditFunctions::currentTypeChanged( const TQString &type ) +{ + if ( !functionListView->currentItem() ) + return; + changeItem( functionListView->currentItem(), Type, type ); + lastType = type; + functionListView->currentItem()->setText( 4, type ); + if ( type == "slot" ) { + if ( MetaDataBase::isSlotUsed( TQT_TQOBJECT(formWindow), + MetaDataBase::normalizeFunction( functionListView->currentItem()->text( 0 ).latin1() ).latin1() ) ) + functionListView->currentItem()->setText( 5, i18n( "Yes" ) ); + else + functionListView->currentItem()->setText( 5, i18n( "No" ) ); + } else { + functionListView->currentItem()->setText( 5, "---" ); + } +} + +void EditFunctions::changeItem( TQListViewItem *item, Attribute a, const TQString &nV ) +{ + int itemId; + TQMap<TQListViewItem*, int>::Iterator fit = functionIds.find( item ); + if ( fit != functionIds.end() ) + itemId = *fit; + else + return; + + TQValueList<FunctItem>::Iterator it = functList.begin(); + for ( ; it != functList.end(); ++it ) { + if ( (*it).id == itemId ) { + switch( a ) { + case Name: + (*it).newName = nV; + break; + case Specifier: + (*it).spec = nV; + break; + case Access: + (*it).access = nV; + break; + case ReturnType: + (*it).retTyp = nV; + break; + case Type: + (*it).type = nV; + break; + } + } + } +} + +void EditFunctions::setCurrentFunction( const TQString &function ) +{ + TQListViewItemIterator it( functionListView ); + while ( it.current() ) { + if ( MetaDataBase::normalizeFunction( it.current()->text( 0 ) ) == function ) { + functionListView->setCurrentItem( it.current() ); + functionListView->setSelected( it.current(), TRUE ); + currentItemChanged( it.current() ); + return; + } + ++it; + } +} + +void EditFunctions::displaySlots( bool justSlots ) +{ + functionIds.clear(); + functionListView->clear(); + for ( TQValueList<FunctItem>::Iterator it = functList.begin(); it != functList.end(); ++it ) { + if ( (*it).type == "function" && justSlots ) + continue; + TQListViewItem *i = new TQListViewItem( functionListView ); + functionIds.insert( i, (*it).id ); + i->setPixmap( 0, SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()) ); + i->setText( 0, (*it).newName ); + i->setText( 1, (*it).retTyp ); + i->setText( 2, (*it).spec ); + i->setText( 3, (*it).access ); + i->setText( 4, (*it).type ); + + if ( (*it).type == "slot" ) { + if ( MetaDataBase::isSlotUsed( TQT_TQOBJECT(formWindow), MetaDataBase::normalizeFunction( (*it).newName ).latin1() ) ) + i->setText( 5, i18n( "Yes" ) ); + else + i->setText( 5, i18n( "No" ) ); + } else { + i->setText( 5, "---" ); + } + } + + if ( functionListView->firstChild() ) + functionListView->setSelected( functionListView->firstChild(), TRUE ); +} + +void EditFunctions::emitItemRenamed( TQListViewItem *, int, const TQString & text ) +{ + emit itemRenamed( text ); // Relay signal ( to TQLineEdit ) +} diff --git a/kdevdesigner/designer/editfunctionsimpl.h b/kdevdesigner/designer/editfunctionsimpl.h new file mode 100644 index 00000000..0d4259dc --- /dev/null +++ b/kdevdesigner/designer/editfunctionsimpl.h @@ -0,0 +1,95 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef EDITFUNCTIONSIMPL_H +#define EDITFUNCTIONSIMPL_H + +#include "editfunctions.h" +#include "hierarchyview.h" +#include "metadatabase.h" +#include <tqmap.h> + +class FormWindow; +class TQListViewItem; + +class EditFunctions : public EditFunctionsBase +{ + Q_OBJECT + + +public: + EditFunctions( TQWidget *parent, FormWindow *fw, bool showOnlySlots = FALSE ); + + void setCurrentFunction( const TQString &function ); + void functionAdd( const TQString &access = TQString(), + const TQString &type = TQString() ); + void functionAdd() { functionAdd( "public" ); } + +signals: + void itemRenamed(const TQString &); + +protected slots: + void okClicked(); + void functionRemove(); + void currentItemChanged( TQListViewItem * ); + void currentTextChanged( const TQString &txt ); + void currentSpecifierChanged( const TQString &s ); + void currentAccessChanged( const TQString &a ); + void currentReturnTypeChanged( const TQString &type ); + void currentTypeChanged( const TQString &type ); + void displaySlots( bool justSlots ); + void emitItemRenamed( TQListViewItem *, int, const TQString & ); + +private: + enum Attribute { Name, Specifier, Access, ReturnType, Type }; + struct FunctItem { + int id; + TQString oldName; + TQString newName; + TQString oldRetTyp; + TQString retTyp; + TQString spec; + TQString oldSpec; + TQString access; + TQString oldAccess; + TQString type; + TQString oldType; + + TQ_DUMMY_COMPARISON_OPERATOR( FunctItem ) + }; + + void changeItem( TQListViewItem *item, Attribute a, const TQString &nV ); + + FormWindow *formWindow; + TQMap<TQListViewItem*, int> functionIds; + TQStringList removedFunctions; + TQValueList<MetaDataBase::Function> itemList; + TQValueList<FunctItem> functList; + int id; + TQString lastType; +}; + +#endif diff --git a/kdevdesigner/designer/filechooser.cpp b/kdevdesigner/designer/filechooser.cpp new file mode 100644 index 00000000..0f4c426e --- /dev/null +++ b/kdevdesigner/designer/filechooser.cpp @@ -0,0 +1,90 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "filechooser.h" +#include <tqlineedit.h> +#include <tqpushbutton.h> +#include <tqfiledialog.h> +#include <tqlayout.h> + +#include <tdefiledialog.h> + +FileChooser::FileChooser( TQWidget *parent, const char *name ) + : TQWidget( parent, name ), md( File ) +{ + TQHBoxLayout *layout = new TQHBoxLayout( this ); + layout->setMargin( 0 ); + + lineEdit = new TQLineEdit( this, "filechooser_lineedit" ); + layout->addWidget( lineEdit ); + + connect( lineEdit, TQT_SIGNAL( textChanged( const TQString & ) ), + this, TQT_SIGNAL( fileNameChanged( const TQString & ) ) ); + + button = new TQPushButton( "...", this, "filechooser_button" ); + button->setFixedWidth( button->fontMetrics().width( " ... " ) ); + layout->addWidget( button ); + + connect( button, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( chooseFile() ) ); + + setFocusProxy( lineEdit ); +} + +void FileChooser::setMode( Mode m ) +{ + md = m; +} + +FileChooser::Mode FileChooser::mode() const +{ + return md; +} + +void FileChooser::setFileName( const TQString &fn ) +{ + lineEdit->setText( fn ); +} + +TQString FileChooser::fileName() const +{ + return lineEdit->text(); +} + +void FileChooser::chooseFile() +{ + TQString fn; + if ( mode() == File ) + fn = KFileDialog::getOpenFileName( lineEdit->text(), TQString(), this ); + else + fn = KFileDialog::getExistingDirectory( lineEdit->text(),this ); + + if ( !fn.isEmpty() ) { + lineEdit->setText( fn ); + emit fileNameChanged( fn ); + } +} + diff --git a/kdevdesigner/designer/filechooser.h b/kdevdesigner/designer/filechooser.h new file mode 100644 index 00000000..42430334 --- /dev/null +++ b/kdevdesigner/designer/filechooser.h @@ -0,0 +1,69 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef FILECHOOSER_H +#define FILECHOOSER_H + +#include <tqwidget.h> + +class TQLineEdit; +class TQPushButton; + +class FileChooser : public TQWidget +{ + Q_OBJECT + + + TQ_ENUMS( Mode ) + TQ_PROPERTY( Mode mode READ mode WRITE setMode ) + TQ_PROPERTY( TQString fileName READ fileName WRITE setFileName ) + +public: + FileChooser( TQWidget *parent = 0, const char *name = 0); + + enum Mode { File, Directory }; + + TQString fileName() const; + Mode mode() const; + +public slots: + void setFileName( const TQString &fn ); + void setMode( Mode m ); + +signals: + void fileNameChanged( const TQString & ); + +private slots: + void chooseFile(); + +private: + TQLineEdit *lineEdit; + TQPushButton *button; + Mode md; + +}; + +#endif diff --git a/kdevdesigner/designer/finddialog.ui b/kdevdesigner/designer/finddialog.ui new file mode 100644 index 00000000..9b16cd8c --- /dev/null +++ b/kdevdesigner/designer/finddialog.ui @@ -0,0 +1,274 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>FindDialog</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>FindDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>285</width> + <height>189</height> + </rect> + </property> + <property name="caption"> + <string>Find Text</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>F&ind:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboFind</cstring> + </property> + </widget> + <widget class="TQComboBox"> + <property name="name"> + <cstring>comboFind</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&Find</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQButtonGroup" row="1" column="1"> + <property name="name"> + <cstring>ButtonGroup2</cstring> + </property> + <property name="title"> + <string>Direction</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>radioForward</cstring> + </property> + <property name="text"> + <string>Forwar&d</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>radioBackward</cstring> + </property> + <property name="text"> + <string>Bac&kward</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQButtonGroup" row="1" column="0"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkWords</cstring> + </property> + <property name="text"> + <string>&Whole words only</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkCase</cstring> + </property> + <property name="text"> + <string>Case &sensitive</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBegin</cstring> + </property> + <property name="text"> + <string>Start at &beginning</string> + </property> + </widget> + </vbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>FindDialog</receiver> + <slot>doFind()</slot> + </connection> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>FindDialog</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>comboFind</tabstop> + <tabstop>checkWords</tabstop> + <tabstop>checkCase</tabstop> + <tabstop>checkBegin</tabstop> + <tabstop>radioForward</tabstop> + <tabstop>radioBackward</tabstop> + <tabstop>PushButton1</tabstop> + <tabstop>PushButton2</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in implementation">tqlineedit.h</include> + <include location="local" impldecl="in implementation">../interfaces/editorinterface.h</include> + <include location="local" impldecl="in implementation">finddialog.ui.h</include> +</includes> +<forwards> + <forward>struct EditorInterface;</forward> +</forwards> +<variables> + <variable>EditorInterface *editor;</variable> + <variable>TQObject *formWindow;</variable> +</variables> +<Q_SLOTS> + <slot>init()</slot> + <slot>destroy()</slot> + <slot>doFind()</slot> + <slot>setEditor( EditorInterface * e, TQObject * fw )</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/finddialog.ui.h b/kdevdesigner/designer/finddialog.ui.h new file mode 100644 index 00000000..126c0a5f --- /dev/null +++ b/kdevdesigner/designer/finddialog.ui.h @@ -0,0 +1,61 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +void FindDialog::init() +{ + editor = 0; + formWindow = 0; +} + +void FindDialog::destroy() +{ + if ( editor ) + editor->release(); +} + +void FindDialog::doFind() +{ + if ( !editor ) + return; + + if ( !editor->find( comboFind->currentText(), checkCase->isChecked(), + checkWords->isChecked(), radioForward->isChecked(), !checkBegin->isChecked() ) ) + checkBegin->setChecked( TRUE ); + else + checkBegin->setChecked( FALSE ); + +} + +void FindDialog::setEditor( EditorInterface * e, TQObject * fw ) +{ + if ( fw != formWindow ) + checkBegin->setChecked( TRUE ); + formWindow = fw; + if ( editor ) + editor->release(); + editor = e; + editor->addRef(); +} diff --git a/kdevdesigner/designer/formfile.cpp b/kdevdesigner/designer/formfile.cpp new file mode 100644 index 00000000..4ba5b7c7 --- /dev/null +++ b/kdevdesigner/designer/formfile.cpp @@ -0,0 +1,905 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formfile.h" +#include "timestamp.h" +#include "project.h" +#include "formwindow.h" +#include "command.h" +#include "sourceeditor.h" +#include "mainwindow.h" +#include "../interfaces/languageinterface.h" +#include "resource.h" +#include "workspace.h" +#include <tqmessagebox.h> +#include <tqfile.h> +#include <tqstatusbar.h> +#include "propertyeditor.h" +#include <tqworkspace.h> +#include <stdlib.h> +#include "designerappiface.h" +#include <tqapplication.h> + +#include <tdefiledialog.h> +#include <tdelocale.h> +#include "kdevdesigner_part.h" + +static TQString make_func_pretty( const TQString &s ) +{ + TQString res = s; + if ( res.find( ")" ) - res.find( "(" ) == 1 ) + return res; + res.replace( "(", "( " ); + res.replace( ")", " )" ); + res.replace( "&", " &" ); + res.replace( "*", " *" ); + res.replace( ",", ", " ); + res.replace( ":", " : " ); + res = res.simplifyWhiteSpace(); + res.replace( " : : ", "::" ); + res.replace( ">>", "> >" ); + return res; +} + +FormFile::FormFile( const TQString &fn, bool temp, Project *p, const char *name ) + : filename( fn ), fileNameTemp( temp ), pro( p ), fw( 0 ), ed( 0 ), + timeStamp( 0, fn + codeExtension() ), codeEdited( FALSE ), pkg( FALSE ), + cm( FALSE ), codeFileStat( None ) +{ + MetaDataBase::addEntry( this ); + fake = qstrcmp( name, "qt_fakewindow" ) == 0; + //codeFileStat = FormFile::None; + pro->addFormFile( this ); + loadCode(); + if ( !temp ) + checkFileName( FALSE ); + + connect(this, TQT_SIGNAL(somethingChanged(FormFile* )), this, TQT_SLOT(emitNewStatus(FormFile* ))); +} + +FormFile::~FormFile() +{ + pro->removeFormFile( this ); + if ( TQT_TQOBJECT(formWindow()) ) + formWindow()->setFormFile( 0 ); +} + +void FormFile::setFormWindow( FormWindow *f ) +{ + if ( f == fw ) + return; + if ( fw ) + fw->setFormFile( 0 ); + fw = f; + if ( fw ) + fw->setFormFile( this ); + parseCode( cod, FALSE ); + TQTimer::singleShot( 0, this, TQT_SLOT( notifyFormWindowChange() ) ); +} + +void FormFile::setEditor( SourceEditor *e ) +{ + ed = e; +} + +void FormFile::setFileName( const TQString &fn ) +{ + if ( fn == filename ) + return; + if ( fn.isEmpty() ) { + fileNameTemp = TRUE; + if ( filename.find( "unnamed" ) != 0 ) + filename = createUnnamedFileName(); + return; + } else { + fileNameTemp = FALSE; + } + filename = fn; + timeStamp.setFileName( filename + codeExtension() ); + cod = ""; + loadCode(); +} + +void FormFile::setCode( const TQString &c ) +{ + cod = c; +} + +FormWindow *FormFile::formWindow() const +{ + return fw; +} + +SourceEditor *FormFile::editor() const +{ + return ed; +} + +TQString FormFile::fileName() const +{ + return filename; +} + +TQString FormFile::absFileName() const +{ + return pro->makeAbsolute( filename ); +} + +TQString FormFile::codeFile() const +{ + TQString codeExt = codeExtension(); + if ( codeExt.isEmpty() ) + return ""; + return filename + codeExt; +} + +TQString FormFile::code() +{ + return cod; +} + +bool FormFile::save( bool withMsgBox, bool ignoreModified ) +{ + if ( fileNameTemp ) + return saveAs(); + if ( !ignoreModified && !isModified() ) + return TRUE; + if ( ed ) + ed->save(); + + if ( TQT_TQOBJECT(formWindow()) && isModified( WFormWindow ) ) { + if ( withMsgBox ) { + if ( !formWindow()->checkCustomWidgets() ) + return FALSE; + } + + if ( TQFile::exists( pro->makeAbsolute( filename ) ) ) { + TQString fn( pro->makeAbsolute( filename ) ); +#if defined(Q_OS_WIN32) + fn += ".bak"; +#else + fn += "~"; +#endif + TQFile f( pro->makeAbsolute( filename ) ); + if ( f.open( IO_ReadOnly ) ) { + TQFile f2( fn ); + if ( f2.open( IO_WriteOnly | IO_Translate ) ) { + TQCString data( f.size() ); + f.readBlock( data.data(), f.size() ); + f2.writeBlock( data ); + } else { + TQMessageBox::warning( MainWindow::self, i18n( "Save" ), + i18n( "The file %1 could not be saved" ).arg( codeFile() ) ); + } + } + } + } + + if ( isModified( WFormCode ) ) { + if ( TQFile::exists( pro->makeAbsolute( codeFile() ) ) ) { + TQString fn( pro->makeAbsolute( codeFile() ) ); +#if defined(Q_OS_WIN32) + fn += ".bak"; +#else + fn += "~"; +#endif + TQFile f( pro->makeAbsolute( codeFile() ) ); + if ( f.open( IO_ReadOnly ) ) { + TQFile f2( fn ); + if ( f2.open( IO_WriteOnly | IO_Translate) ) { + TQCString data( f.size() ); + f.readBlock( data.data(), f.size() ); + f2.writeBlock( data ); + } else if ( tqApp->type() != TQApplication::Tty ) { + TQMessageBox::warning( MainWindow::self, i18n( "Save" ), + i18n( "The file %1 could not be saved" ).arg( codeFile() ) ); + } + } + } + } + + if ( TQT_TQOBJECT(formWindow()) ) { + Resource resource( MainWindow::self ); + resource.setWidget( formWindow() ); + bool formCodeOnly = isModified( WFormCode ) && !isModified( WFormWindow ); + if ( !resource.save( pro->makeAbsolute( filename ), formCodeOnly ) ) { + if ( MainWindow::self ) + MainWindow::self->statusMessage( i18n( "Failed to save file '%1'.").arg( formCodeOnly ? codeFile(): filename ) ); + if ( formCodeOnly ) + return FALSE; + return saveAs(); + } + if ( MainWindow::self ) + MainWindow::self->statusMessage( i18n( "'%1' saved."). + arg( formCodeOnly ? codeFile() : filename )); + } else { + if ( !Resource::saveFormCode(this, MetaDataBase::languageInterface(pro->language())) ) + return FALSE; + } + timeStamp.update(); + setModified( FALSE ); + return TRUE; +} + +bool FormFile::saveAs( bool ignoreModified ) +{ + TQString f = pro->makeAbsolute( fileName() ); + if ( fileNameTemp && TQT_TQOBJECT(formWindow()) ) { + f = TQString( formWindow()->name() ).lower(); + f.replace( "::", "_" ); + f = pro->makeAbsolute( f + ".ui" ); + } + bool saved = FALSE; + if ( ignoreModified ) { + TQString dir = TQStringList::split( ':', pro->iFace()->customSetting( "QTSCRIPT_PACKAGES" ) ).first(); + f = TQFileInfo( f ).fileName(); + f.prepend( dir + "/" ); + } + TQString fn; + while ( !saved ) { + fn = KFileDialog::getSaveFileName( f, + i18n( "*.ui|TQt User-Interface Files" ) + "\n" + + i18n( "*|All Files" ), MainWindow::self, /*0,*/ + i18n( "Save Form '%1' As").arg( formName() )/*, + MainWindow::self ? &MainWindow::self->lastSaveFilter : 0*/ ); + if ( fn.isEmpty() ) + return FALSE; + TQFileInfo fi( fn ); + if ( fi.extension() != "ui" ) + fn += ".ui"; + fileNameTemp = FALSE; + filename = pro->makeRelative( fn ); + TQFileInfo relfi( filename ); + if ( relfi.exists() ) { + if ( TQMessageBox::warning( MainWindow::self, i18n( "File Already Exists" ), + i18n( "The file already exists. Do you wish to overwrite it?" ), + TQMessageBox::Yes, + TQMessageBox::No ) == TQMessageBox::Yes ) { + saved = TRUE; + } else { + filename = f; + } + + } else { + saved = TRUE; + } + } + if ( !checkFileName( TRUE ) ) { + filename = f; + return FALSE; + } + pro->setModified( TRUE ); + timeStamp.setFileName( pro->makeAbsolute( codeFile() ) ); + if ( ed && TQT_TQOBJECT(formWindow()) ) + ed->setCaption( i18n( "Edit %1" ).arg( formWindow()->name() ) ); + setModified( TRUE ); + if ( pro->isDummy() ) + fw->mainWindow()->addRecentlyOpenedFile( fn ); + return save( TRUE, ignoreModified ); +} + +bool FormFile::close() +{ + if ( editor() ) { + editor()->save(); + editor()->close(); + } + if ( TQT_TQOBJECT(formWindow()) ) + return formWindow()->close(); + return TRUE; +} + +bool FormFile::closeEvent() +{ + if ( !isModified() && fileNameTemp ) { + pro->removeFormFile( this ); + return TRUE; + } + + if ( !isModified() ) + return TRUE; + + if ( editor() ) + editor()->save(); + + switch ( TQMessageBox::warning( MainWindow::self, i18n( "Save Form" ), + i18n( "Save changes to form '%1'?" ).arg( filename ), + i18n( "&Yes" ), i18n( "&No" ), i18n( "&Cancel" ), 0, 2 ) ) { + case 0: // save + if ( !save() ) + return FALSE; + case 1: // don't save + loadCode(); + if ( ed ) + ed->editorInterface()->setText( cod ); + if ( fileNameTemp ) + pro->removeFormFile( this ); + if ( MainWindow::self ) + MainWindow::self->workspace()->update(); + break; + case 2: // cancel + return FALSE; + default: + break; + } + + setModified( FALSE ); + if ( MainWindow::self ) + MainWindow::self->updateFunctionList(); + setCodeEdited( FALSE ); + return TRUE; +} + +void FormFile::setModified( bool m, int who ) +{ + if ( ( who & WFormWindow ) == WFormWindow ) + setFormWindowModified( m ); + if ( ( who & WFormCode ) == WFormCode ) + setCodeModified( m ); +} + +bool FormFile::isModified( int who ) +{ + if ( who == WFormWindow ) + return isFormWindowModified(); + if ( who == WFormCode ) + return isCodeModified(); + return isCodeModified() || isFormWindowModified(); +} + +bool FormFile::isFormWindowModified() const +{ + if ( !TQT_TQOBJECT(formWindow()) || !formWindow()->commandHistory() ) + return FALSE; + return formWindow()->commandHistory()->isModified(); +} + +bool FormFile::isCodeModified() const +{ + if ( !editor() ) + return cm; + return editor()->isModified(); +} + +void FormFile::setFormWindowModified( bool m ) +{ + bool b = isFormWindowModified(); + if ( m == b ) + return; + if ( !TQT_TQOBJECT(formWindow()) || !formWindow()->commandHistory() ) + return; + formWindow()->commandHistory()->setModified( m ); + emit somethingChanged( this ); +} + +void FormFile::setCodeModified( bool m ) +{ + bool b = isCodeModified(); + if ( m == b ) + return; + emit somethingChanged( this ); + cm = m; + if ( !editor() ) + return; + editor()->setModified( m ); +} + +void FormFile::showFormWindow() +{ + if ( !MainWindow::self ) + return; + if ( TQT_TQOBJECT(formWindow()) ) { + if ( ( formWindow()->hasFocus() || + TQT_BASE_OBJECT(MainWindow::self->qWorkspace()->activeWindow()) == TQT_BASE_OBJECT(formWindow()) ) && + TQT_BASE_OBJECT(MainWindow::self->propertyeditor()->formWindow()) != TQT_BASE_OBJECT(formWindow()) ) { + MainWindow::self->propertyeditor()->setWidget( TQT_TQOBJECT(formWindow()->currentWidget()), formWindow() ); + MainWindow::self->objectHierarchy()->setFormWindow( formWindow(), + TQT_TQOBJECT(formWindow()->currentWidget()) ); + } + formWindow()->setFocus(); + return; + } + MainWindow::self->openFormWindow( pro->makeAbsolute( filename ), TRUE, this ); +} + +bool FormFile::setupUihFile( bool askForUih ) +{ + if ( !pro->isCpp() || !askForUih ) { + if ( !hasFormCode() ) { + createFormCode(); + setModified( TRUE ); + } + codeFileStat = FormFile::Ok; + return TRUE; + } + if ( codeFileStat != FormFile::Ok && !ed ) { + if ( hasFormCode() ) { + int i = TQMessageBox::information( MainWindow::self, i18n( "Using ui.h File" ), + i18n( "An \"ui.h\" file for this form already exists.\n" + "Do you want to use it or create a new one?" ), + i18n( "Use Existing" ), i18n( "Create New" ), + i18n( "Cancel" ), 2, 2 ); + if ( i == 2 ) + return FALSE; + if ( i == 1 ) + createFormCode(); + } else { + if ( TQMessageBox::Yes != TQMessageBox::information( MainWindow::self, i18n( "Creating ui.h file" ), + i18n( "Do you want to create an new \"ui.h\" file?" ), + TQMessageBox::Yes, TQMessageBox::No ) ) + return FALSE; + createFormCode(); + } + setModified( TRUE ); + } + codeFileStat = FormFile::Ok; + return TRUE; +} + +SourceEditor *FormFile::showEditor( bool askForUih ) +{ + if ( !MainWindow::self ) + return 0; + showFormWindow(); + //emit signal to the embedding IDE if there is one and return 0 because + //no source editing is possible + emit fw->mainWindow()->part()->emitEditSource(fw->fileName()); + return 0; +/* if ( !setupUihFile( askForUih ) ) + return 0; + return MainWindow::self->openSourceEditor();*/ +} + +static int ui_counter = 0; +TQString FormFile::createUnnamedFileName() +{ + return TQString( "unnamed" ) + TQString::number( ++ui_counter ) + TQString( ".ui" ); +} + +TQString FormFile::codeExtension() const +{ + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( iface ) + return iface->formCodeExtension(); + return ""; +} + +TQString FormFile::codeComment() const +{ + return TQString( "/****************************************************************************\n" + "** ui.h extension file, included from the uic-generated form implementation.\n" + "**\n" + "** If you want to add, delete, or rename functions or slots, use\n" + "** TQt Designer to update this file, preserving your code.\n" + "**\n" + "** You should not define a constructor or destructor in this file.\n" + "** Instead, write your code in functions called init() and destroy().\n" + "** These will automatically be called by the form's constructor and\n" + "** destructor.\n" + "*****************************************************************************/\n" ); +} + +bool FormFile::hasFormCode() const +{ + return !cod.isEmpty() && cod != TQString( codeComment() ); +} + +int FormFile::codeFileState() const +{ + return hasFormCode() ? codeFileStat : None; +} + +void FormFile::setCodeFileState( UihState s ) +{ + codeFileStat = s; +} + +void FormFile::createFormCode() +{ + if ( !TQT_TQOBJECT(formWindow()) ) + return; + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( !iface ) + return; + if ( pro->isCpp() ) + cod = codeComment(); + TQValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( TQT_TQOBJECT(formWindow()) ); + for ( TQValueList<MetaDataBase::Function>::Iterator it = functionList.begin(); it != functionList.end(); ++it ) { + cod += (!cod.isEmpty() ? "\n\n" : "") + + iface->createFunctionStart( formWindow()->name(), make_func_pretty((*it).function), + (*it).returnType.isEmpty() ? + TQString( "void" ) : + (*it).returnType, (*it).access ) + + "\n" + iface->createEmptyFunction(); + } + parseCode( cod, FALSE ); +} + +void FormFile::load() +{ + showFormWindow(); + code(); +} + +bool FormFile::loadCode() +{ + TQFile f( pro->makeAbsolute( codeFile() ) ); + if ( !f.open( IO_ReadOnly ) ) { + cod = ""; + setCodeFileState( FormFile::None ); + return FALSE; + } + TQTextStream ts( &f ); + cod = ts.read(); + parseCode( cod, FALSE ); + if ( hasFormCode() && codeFileStat != FormFile::Ok ) + setCodeFileState( FormFile::Deleted ); + timeStamp.update(); + return TRUE; +} + +bool FormFile::isCodeEdited() const +{ + return codeEdited; +} + +void FormFile::setCodeEdited( bool b ) +{ + codeEdited = b; +} + +void FormFile::parseCode( const TQString &txt, bool allowModify ) +{ + if ( !TQT_TQOBJECT(formWindow()) ) + return; + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( !iface ) + return; + TQValueList<LanguageInterface::Function> functions; + TQValueList<MetaDataBase::Function> newFunctions, oldFunctions; + oldFunctions = MetaDataBase::functionList( TQT_TQOBJECT(formWindow()) ); + iface->functions( txt, &functions ); + TQMap<TQString, TQString> funcs; + for ( TQValueList<LanguageInterface::Function>::Iterator it = functions.begin(); + it != functions.end(); ++it ) { + bool found = FALSE; + for ( TQValueList<MetaDataBase::Function>::Iterator fit = oldFunctions.begin(); + fit != oldFunctions.end(); ++fit ) { + TQString f( (*fit).function ); + if ( MetaDataBase::normalizeFunction( f ) == + MetaDataBase::normalizeFunction( (*it).name ) ) { + found = TRUE; + MetaDataBase::Function function; + function.function = make_func_pretty( (*it).name ); + function.specifier = (*fit).specifier; + function.type = (*fit).type; + if ( !pro->isCpp() ) + function.access = (*it).access; + else + function.access = (*fit).access; + function.language = (*fit).language; + function.returnType = (*it).returnType; + newFunctions << function; + funcs.insert( (*it).name, (*it).body ); + oldFunctions.remove( fit ); + break; + } + } + if ( !found ) { + MetaDataBase::Function function; + function.function = make_func_pretty( (*it).name ); + function.specifier = "virtual"; + function.access = "public"; + function.language = pro->language(); + function.returnType = (*it).returnType; + if ( function.returnType == "void" ) + function.type = "slot"; + else + function.type = "function"; + if ( function.function == "init()" || function.function == "destroy()" ) { + function.type = "function"; + function.access = "private"; + function.specifier = "non virtual"; + } + newFunctions << function; + funcs.insert( (*it).name, (*it).body ); + if ( allowModify ) + setFormWindowModified( TRUE ); + } + } + + if ( allowModify && oldFunctions.count() > 0 ) + setFormWindowModified( TRUE ); + + MetaDataBase::setFunctionList( TQT_TQOBJECT(formWindow()), newFunctions ); +} + +void FormFile::syncCode() +{ + if ( !editor() ) + return; + parseCode( editor()->editorInterface()->text(), TRUE ); + cod = editor()->editorInterface()->text(); +} + +void FormFile::checkTimeStamp() +{ + if ( timeStamp.isUpToDate() ) + return; + timeStamp.update(); + if ( codeEdited ) { + if ( TQMessageBox::information( MainWindow::self, i18n( "TQt Designer" ), + i18n( "File '%1' has been changed outside TQt Designer.\n" + "Do you want to reload it?" ).arg( timeStamp.fileName() ), + i18n( "&Yes" ), i18n( "&No" ) ) == 0 ) { + TQFile f( timeStamp.fileName() ); + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + editor()->editorInterface()->setText( ts.read() ); + editor()->save(); + if ( MainWindow::self ) + MainWindow::self->functionsChanged(); + } + } + } else { + loadCode(); + } +} + +bool FormFile::isUihFileUpToDate() +{ + if ( timeStamp.isUpToDate() ) + return TRUE; + if ( !editor() ) { + MainWindow::self->editSource(); + tqDebug( "parse Code" ); + parseCode( editor()->editorInterface()->text(), TRUE ); + } + checkTimeStamp(); + return FALSE; +} + +void FormFile::addFunctionCode( MetaDataBase::Function function ) +{ + if ( pro->isCpp() && !hasFormCode() && !codeEdited ) + return; + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( !iface ) + return; + + TQValueList<LanguageInterface::Function> funcs; + iface->functions( cod, &funcs ); + bool hasFunc = FALSE; + for ( TQValueList<LanguageInterface::Function>::Iterator it = funcs.begin(); + it != funcs.end(); ++it ) { + if ( MetaDataBase::normalizeFunction( (*it).name ) == MetaDataBase::normalizeFunction( function.function ) ) { + hasFunc = TRUE; + break; + } + } + + if ( !hasFunc ) { + if ( !codeEdited && !timeStamp.isUpToDate() ) + loadCode(); + MetaDataBase::MetaInfo mi = MetaDataBase::metaInfo( TQT_TQOBJECT(formWindow()) ); + TQString cn; + if ( mi.classNameChanged ) + cn = mi.className; + if ( cn.isEmpty() ) + cn = formWindow()->name(); + TQString body = "\n\n" + iface->createFunctionStart( cn, + make_func_pretty( function.function ), + function.returnType.isEmpty() ? + TQString( "void" ) : + function.returnType, function.access ) + + "\n" + iface->createEmptyFunction(); + cod += body; + if ( codeEdited ) { + setModified( TRUE ); + emit somethingChanged( this ); + } + } +} + +void FormFile::removeFunctionCode( MetaDataBase::Function function ) +{ + if ( pro->isCpp() && !hasFormCode() && !codeEdited ) + return; + + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( !iface ) + return; + + checkTimeStamp(); + TQString sourceCode = code(); + if ( sourceCode.isEmpty() ) + return; + TQValueList<LanguageInterface::Function> functions; + iface->functions( sourceCode, &functions ); + TQString fu = MetaDataBase::normalizeFunction( function.function ); + for ( TQValueList<LanguageInterface::Function>::Iterator fit = functions.begin(); fit != functions.end(); ++fit ) { + if ( MetaDataBase::normalizeFunction( (*fit).name ) == fu ) { + int line = 0; + int start = 0; + while ( line < (*fit).start - 1 ) { + start = sourceCode.find( '\n', start ); + if ( start == -1 ) + return; + start++; + line++; + } + if ( start == -1 ) + return; + int end = start; + while ( line < (*fit).end + 1 ) { + end = sourceCode.find( '\n', end ); + if ( end == -1 ) { + if ( line <= (*fit).end ) + end = sourceCode.length() - 1; + else + return; + } + end++; + line++; + } + if ( end < start ) + return; + sourceCode.remove( start, end - start ); + setCode( sourceCode ); + } + } +} + +void FormFile::functionNameChanged( const TQString &oldName, const TQString &newName ) +{ + if ( !cod.isEmpty() ) { + TQString funcStart = TQString( formWindow()->name() ) + TQString( "::" ); + int i = cod.find( funcStart + oldName ); + if ( i != -1 ) { + cod.remove( i + funcStart.length(), oldName.length() ); + cod.insert( i + funcStart.length(), newName ); + } + } +} + +void FormFile::functionRetTypeChanged( const TQString &fuName, const TQString &oldType, const TQString &newType ) +{ + if ( !cod.isEmpty() ) { + TQString oldFunct = oldType + " " + TQString( formWindow()->name() ) + "::" + fuName; + TQString newFunct = newType + " " + TQString( formWindow()->name() ) + "::" + fuName; + + int i = cod.find( oldFunct ); + if ( i != -1 ) { + cod.remove( i, oldFunct.length() ); + cod.insert( i, newFunct ); + } + } +} + +TQString FormFile::formName() const +{ + FormFile* that = (FormFile*) this; + if ( TQT_TQOBJECT(formWindow()) ) { + that->cachedFormName = formWindow()->name(); + return cachedFormName; + } + if ( !cachedFormName.isNull() ) + return cachedFormName; + TQFile f( pro->makeAbsolute( filename ) ); + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + TQString line; + TQString className; + while ( !ts.eof() ) { + line = ts.readLine(); + if ( !className.isEmpty() ) { + int end = line.find( "</class>" ); + if ( end == -1 ) { + className += line; + } else { + className += line.left( end ); + break; + } + continue; + } + int start; + if ( ( start = line.find( "<class>" ) ) != -1 ) { + int end = line.find( "</class>" ); + if ( end == -1 ) { + className = line.mid( start + 7 ); + } else { + className = line.mid( start + 7, end - ( start + 7 ) ); + break; + } + } + } + that->cachedFormName = className; + } + if ( cachedFormName.isEmpty() ) + that->cachedFormName = filename; + return cachedFormName; +} + +void FormFile::formWindowChangedSomehow() +{ + emit somethingChanged( this ); +} + +bool FormFile::checkFileName( bool allowBreak ) +{ + FormFile *ff = pro->findFormFile( filename, this ); + if ( ff ) + TQMessageBox::warning( MainWindow::self, i18n( "Invalid Filename" ), + i18n( "The project already contains a form with a\n" + "filename of '%1'. Please choose a new filename." ).arg( filename ) ); + while ( ff ) { + TQString fn; + while ( fn.isEmpty() ) { + fn = KFileDialog::getSaveFileName( pro->makeAbsolute( fileName() ), + i18n( "*.ui|TQt User-Interface Files" ) + "\n" + + i18n( "*|All Files" ), MainWindow::self,/* 0,*/ + i18n( "Save Form '%1' As"). + arg( formWindow()->name() )/*, + MainWindow::self ? &MainWindow::self->lastSaveFilter : 0 */); + if ( allowBreak && fn.isEmpty() ) + return FALSE; + } + filename = pro->makeRelative( fn ); + ff = pro->findFormFile( filename, this ); + } + return TRUE; +} + +void FormFile::addConnection( const TQString &sender, const TQString &signal, + const TQString &receiver, const TQString &slot ) +{ + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( iface ) + iface->addConnection( sender, signal, receiver, slot, &cod ); + if ( ed ) + ed->editorInterface()->setText( cod ); +} + +void FormFile::removeConnection( const TQString &sender, const TQString &signal, + const TQString &receiver, const TQString &slot ) +{ + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + if ( iface ) + iface->removeConnection( sender, signal, receiver, slot, &cod ); + if ( ed ) + ed->editorInterface()->setText( cod ); +} + +void FormFile::notifyFormWindowChange() +{ + if ( fw ) + pro->formOpened( fw ); +} + +void FormFile::emitNewStatus(FormFile *file) +{ + fw->mainWindow()->part()->emitNewStatus(fileName(), isModified()); +} diff --git a/kdevdesigner/designer/formfile.h b/kdevdesigner/designer/formfile.h new file mode 100644 index 00000000..79f92d16 --- /dev/null +++ b/kdevdesigner/designer/formfile.h @@ -0,0 +1,146 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef FORMFILE_H +#define FORMFILE_H + +#include <tqobject.h> +#include "timestamp.h" +#include "metadatabase.h" + +class Project; +class FormWindow; +class SourceEditor; + +class FormFile : public TQObject +{ + Q_OBJECT + + friend class SourceEditor; + +public: + enum Who { + WFormWindow = 1, + WFormCode = 2, + WAnyOrAll = WFormWindow | WFormCode + }; + + enum UihState { None, Ok, Deleted }; + + FormFile( const TQString &fn, bool temp, Project *p, const char *name = 0 ); + ~FormFile(); + + void setFormWindow( FormWindow *f ); + void setEditor( SourceEditor *e ); + void setFileName( const TQString &fn ); + void setCode( const TQString &c ); + void setModified( bool m, int who = WAnyOrAll ); + void setCodeEdited( bool b ); + + FormWindow *formWindow() const; + SourceEditor *editor() const; + TQString fileName() const; + TQString absFileName() const; + + bool supportsCodeFile() const { return !codeExtension().isEmpty(); } + TQString codeComment() const; + TQString codeFile() const; + TQString code(); + bool isCodeEdited() const; + + bool loadCode(); + void load(); + bool save( bool withMsgBox = TRUE, bool ignoreModified = FALSE ); + bool saveAs( bool ignoreModified = FALSE ); + bool close(); + bool closeEvent(); + bool isModified( int who = WAnyOrAll ); + bool hasFormCode() const; + void createFormCode(); + void syncCode(); + void checkTimeStamp(); + bool isUihFileUpToDate(); + void addFunctionCode( MetaDataBase::Function function ); + void removeFunctionCode( MetaDataBase::Function function ); + void functionNameChanged( const TQString &oldName, const TQString &newName ); + void functionRetTypeChanged( const TQString &fuName, const TQString &oldType, const TQString &newType ); + + void showFormWindow(); + SourceEditor *showEditor( bool askForUih = TRUE ); + + static TQString createUnnamedFileName(); + TQString formName() const; + + bool isFake() const { return fake; } + + void parseCode( const TQString &txt, bool allowModify ); + + void addConnection( const TQString &sender, const TQString &signal, + const TQString &receiver, const TQString &slot ); + void removeConnection( const TQString &sender, const TQString &signal, + const TQString &receiver, const TQString &slot ); + + bool hasTempFileName() const { return fileNameTemp; } + void setCodeFileState( UihState ); + int codeFileState() const; + bool setupUihFile( bool askForUih = TRUE ); + + Project *project() const { return pro; } + +signals: + void somethingChanged( FormFile* ); + +private slots: + void formWindowChangedSomehow(); + void notifyFormWindowChange(); + void emitNewStatus(FormFile* file); + +private: + bool isFormWindowModified() const; + bool isCodeModified() const; + void setFormWindowModified( bool m ); + void setCodeModified( bool m ); + TQString codeExtension() const; + bool checkFileName( bool allowBreak ); + +private: + TQString filename; + bool fileNameTemp; + Project *pro; + FormWindow *fw; + SourceEditor *ed; + TQString cod; + TimeStamp timeStamp; + bool codeEdited; + TQString cachedFormName; + bool fake; + bool pkg; + bool cm; + UihState codeFileStat; + +}; + +#endif diff --git a/kdevdesigner/designer/formsettings.ui b/kdevdesigner/designer/formsettings.ui new file mode 100644 index 00000000..6337e8cf --- /dev/null +++ b/kdevdesigner/designer/formsettings.ui @@ -0,0 +1,549 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>FormSettingsBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>FormSettingsBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>597</width> + <height>458</height> + </rect> + </property> + <property name="caption"> + <string>Form Settings</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Form Settings</b><p>Change settings for the form. Settings like <b>Comment</b> and <b>Author</b> are for your own use and are not required.</p></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQButtonGroup" row="1" column="0"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Pixmaps</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton" row="0" column="0"> + <property name="name"> + <cstring>radioPixmapInline</cstring> + </property> + <property name="text"> + <string>Save in&line</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Save pixmaps in the .ui files</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Save Inline</b><p>Saves the pixmaps as binary data in the .ui files. Pixmaps saved like this are not shared between forms. We recommend using Project image files instead.</string> + </property> + </widget> + <widget class="TQRadioButton" row="2" column="0"> + <property name="name"> + <cstring>radioProjectImageFile</cstring> + </property> + <property name="text"> + <string>Project &image file</string> + </property> + <property name="toolTip" stdset="0"> + <string>Use the Project's Image file for pixmaps</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Use the Project's Image file for pixmaps</b> +<p>Each project may have a collection of pixmaps. If you use a project, we recommend that you use this option since it shares the images and is the fastest and most efficient way to use pixmaps in your forms.</p></string> + </property> + </widget> + <widget class="KLineEdit" row="1" column="1"> + <property name="name"> + <cstring>editPixmapFunction</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Specify Pixmap-Loader function (only the function's name, no parentheses.)</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Specify Pixmap-Loader function</b><p>Specify the function which should be used for loading a pixmap in the generated code. <em>Only enter the function's name, without parentheses.</em></string> + </property> + </widget> + <widget class="TQRadioButton" row="1" column="0"> + <property name="name"> + <cstring>radioPixmapFunction</cstring> + </property> + <property name="text"> + <string>Use &function:</string> + </property> + <property name="toolTip" stdset="0"> + <string>Use the given function for pixmaps</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Use a given function for pixmaps</b><p>If you choose this option you must define a function in the line edit at the right which will be used in the generated code for loading pixmaps. When choosing a pixmap in <i>Qt Designer</i> you will be asked to specify the arguments which will be passed to the function in the generated code.<p> This approach makes it possible to use your own icon-loader function for loading pixmaps. <i>Qt Designer</i> cannot preview the correct image if you use your own function.</string> + </property> + </widget> + </grid> + </widget> + <widget class="TQGroupBox" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="frameShape"> + <enum>Box</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="title"> + <string>Settings</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="KLineEdit" row="0" column="1"> + <property name="name"> + <cstring>editClassName</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change class name</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Enter the name of the class that will be created.</b><p><em>classname.h</em> and <em>classname.cpp</em> will be generated as C++ output when it is compiled by uic.</p></string> + </property> + </widget> + <widget class="TQLabel" row="3" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>A&uthor:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editAuthor</cstring> + </property> + </widget> + <widget class="KLineEdit" row="3" column="1"> + <property name="name"> + <cstring>editAuthor</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Enter your name</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Enter your name.</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>Class &name:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editClassName</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Co&mment:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editComment</cstring> + </property> + </widget> + <widget class="TQMultiLineEdit" row="1" column="1" rowspan="2" colspan="1"> + <property name="name"> + <cstring>editComment</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>Enter a comment about the form.</string> + </property> + </widget> + <spacer row="2" column="0"> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + </spacer> + </grid> + </widget> + <widget class="TQGroupBox" row="1" column="1"> + <property name="name"> + <cstring>GroupBox2</cstring> + </property> + <property name="title"> + <string>La&youts</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQSpinBox" row="0" column="2"> + <property name="name"> + <cstring>spinMargin</cstring> + </property> + <property name="value"> + <number>11</number> + </property> + </widget> + <spacer row="0" column="3"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + </spacer> + <widget class="TQLabel" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>TextLabel2_2</cstring> + </property> + <property name="text"> + <string>D&efault spacing:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>spinSpacing</cstring> + </property> + </widget> + <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>checkLayoutFunctions</cstring> + </property> + <property name="text"> + <string>Use func&tions:</string> + </property> + <property name="toolTip" stdset="0"> + <string>Use functions to get the margin and spacing</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Use a given function for margin and/or spacing</b><p>If you choose this option you must define functions in the line edit below which will be used in the generated code for getting the margin and spacing value. <i>Qt Designer</i> cannot preview the correct margin or spacing if you use your own function. Instead, the default values will be used for preview.</string> + </property> + </widget> + <widget class="TQSpinBox" row="1" column="2"> + <property name="name"> + <cstring>spinSpacing</cstring> + </property> + <property name="value"> + <number>6</number> + </property> + </widget> + <spacer row="1" column="3"> + <property name="name"> + <cstring>Spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + </spacer> + <widget class="TQLabel" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>TextLabel1_3</cstring> + </property> + <property name="text"> + <string>Default mar&gin:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>spinMargin</cstring> + </property> + </widget> + <widget class="TQLabel" row="4" column="0"> + <property name="name"> + <cstring>spaFuLabel</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>S&pacing:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editSpacingFunction</cstring> + </property> + </widget> + <widget class="TQLabel" row="3" column="0"> + <property name="name"> + <cstring>marFuLabel</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Ma&rgin:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editMarginFunction</cstring> + </property> + </widget> + <spacer row="2" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + </spacer> + <widget class="KLineEdit" row="4" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>editSpacingFunction</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Specify spacing function (only the function's name, no parentheses.)</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Specify spacing function</b><p>Specify the function which should be used for getting the spacing in the generated code. <em>Only enter the function's name, without parentheses.</em></string> + </property> + </widget> + <widget class="KLineEdit" row="3" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>editMarginFunction</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" stdset="0"> + <string>Specify margin function (only the function's name, no parentheses.)</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Specify margin function</b><p>Specify the function which should be used for getting the margin in the generated code. <em>Only enter the function's name, without parentheses.</em></string> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>FormSettingsBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>FormSettingsBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>radioPixmapFunction</sender> + <signal>toggled(bool)</signal> + <receiver>editPixmapFunction</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>checkLayoutFunctions</sender> + <signal>toggled(bool)</signal> + <receiver>editSpacingFunction</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>checkLayoutFunctions</sender> + <signal>toggled(bool)</signal> + <receiver>editMarginFunction</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>checkLayoutFunctions</sender> + <signal>toggled(bool)</signal> + <receiver>marFuLabel</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>checkLayoutFunctions</sender> + <signal>toggled(bool)</signal> + <receiver>spaFuLabel</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>editClassName</tabstop> + <tabstop>editComment</tabstop> + <tabstop>editAuthor</tabstop> + <tabstop>radioPixmapInline</tabstop> + <tabstop>radioPixmapFunction</tabstop> + <tabstop>editPixmapFunction</tabstop> + <tabstop>radioProjectImageFile</tabstop> + <tabstop>spinMargin</tabstop> + <tabstop>spinSpacing</tabstop> + <tabstop>checkLayoutFunctions</tabstop> + <tabstop>editMarginFunction</tabstop> + <tabstop>editSpacingFunction</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>buttonHelp</tabstop> +</tabstops> +<Q_SLOTS> + <slot>okClicked()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/formsettingsimpl.cpp b/kdevdesigner/designer/formsettingsimpl.cpp new file mode 100644 index 00000000..e29ea157 --- /dev/null +++ b/kdevdesigner/designer/formsettingsimpl.cpp @@ -0,0 +1,118 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formsettingsimpl.h" +#include "formwindow.h" +#include "metadatabase.h" +#include "command.h" +#include "asciivalidator.h" +#include "mainwindow.h" +#include "project.h" + +#include <tqmultilineedit.h> +#include <tqpushbutton.h> +#include <tqcombobox.h> +#include <tqradiobutton.h> +#include <klineedit.h> +#include <tqspinbox.h> +#include <tqcheckbox.h> + +FormSettings::FormSettings( TQWidget *parent, FormWindow *fw ) + : FormSettingsBase( parent, 0, TRUE ), formwindow( fw ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + MetaDataBase::MetaInfo info = MetaDataBase::metaInfo( TQT_TQOBJECT(fw) ); + if ( info.classNameChanged && !info.className.isEmpty() ) + editClassName->setText( info.className ); + else + editClassName->setText( fw->name() ); + editComment->setText( info.comment ); + editAuthor->setText( info.author ); + + editClassName->setValidator( new AsciiValidator( TQString( ":" ), TQT_TQOBJECT(editClassName) ) ); + editPixmapFunction->setValidator( new AsciiValidator( TQString( ":" ), TQT_TQOBJECT(editPixmapFunction) ) ); + + if ( formwindow->savePixmapInline() ) + radioPixmapInline->setChecked( TRUE ); + else if ( formwindow->savePixmapInProject() ) + radioProjectImageFile->setChecked( TRUE ); + else + radioPixmapFunction->setChecked( TRUE ); + editPixmapFunction->setText( formwindow->pixmapLoaderFunction() ); + radioProjectImageFile->setEnabled( !fw->project()->isDummy() ); + spinSpacing->setValue( formwindow->layoutDefaultSpacing() ); + spinMargin->setValue( formwindow->layoutDefaultMargin() ); + editSpacingFunction->setValidator( new AsciiValidator( TQString( ":" ), TQT_TQOBJECT(editSpacingFunction) ) ); + editMarginFunction->setValidator( new AsciiValidator( TQString( ":" ), TQT_TQOBJECT(editMarginFunction) ) ); + checkLayoutFunctions->setChecked( formwindow->hasLayoutFunctions() ); + editSpacingFunction->setText( formwindow->spacingFunction() ); + editMarginFunction->setText( formwindow->marginFunction() ); +} + +void FormSettings::okClicked() +{ + MetaDataBase::MetaInfo info; + info.className = editClassName->text(); + info.classNameChanged = info.className != TQString( formwindow->name() ); + info.comment = editComment->text(); + info.author = editAuthor->text(); + MetaDataBase::setMetaInfo( TQT_TQOBJECT(formwindow), info ); + + formwindow->commandHistory()->setModified( TRUE ); + + if ( formwindow->savePixmapInline() ) { + MetaDataBase::clearPixmapArguments( TQT_TQOBJECT(formwindow) ); + MetaDataBase::clearPixmapKeys( TQT_TQOBJECT(formwindow) ); + } else if ( formwindow->savePixmapInProject() ) { + MetaDataBase::clearPixmapArguments( TQT_TQOBJECT(formwindow) ); + } else { + MetaDataBase::clearPixmapKeys( TQT_TQOBJECT(formwindow) ); + } + + if ( radioPixmapInline->isChecked() ) { + formwindow->setSavePixmapInline( TRUE ); + formwindow->setSavePixmapInProject( FALSE ); + } else if ( radioProjectImageFile->isChecked() ){ + formwindow->setSavePixmapInline( FALSE ); + formwindow->setSavePixmapInProject( TRUE ); + } else { + formwindow->setSavePixmapInline( FALSE ); + formwindow->setSavePixmapInProject( FALSE ); + } + + if ( checkLayoutFunctions->isChecked() ) + formwindow->hasLayoutFunctions( TRUE ); + else + formwindow->hasLayoutFunctions( FALSE ); + + formwindow->setPixmapLoaderFunction( editPixmapFunction->text() ); + formwindow->setLayoutDefaultSpacing( spinSpacing->value() ); + formwindow->setSpacingFunction( editSpacingFunction->text() ); + formwindow->setLayoutDefaultMargin( spinMargin->value() ); + formwindow->setMarginFunction( editMarginFunction->text() ); + + accept(); +} diff --git a/kdevdesigner/designer/formsettingsimpl.h b/kdevdesigner/designer/formsettingsimpl.h new file mode 100644 index 00000000..3dcb6dd7 --- /dev/null +++ b/kdevdesigner/designer/formsettingsimpl.h @@ -0,0 +1,50 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef FORMSETTINGSIMPL_H +#define FORMSETTINGSIMPL_H + +#include "formsettings.h" + +class FormWindow; + +class FormSettings : public FormSettingsBase +{ + Q_OBJECT + + +public: + FormSettings( TQWidget *parent, FormWindow *fw ); + +protected slots: + void okClicked(); + +private: + FormWindow *formwindow; + +}; + +#endif diff --git a/kdevdesigner/designer/formwindow.cpp b/kdevdesigner/designer/formwindow.cpp new file mode 100644 index 00000000..4e5bc09d --- /dev/null +++ b/kdevdesigner/designer/formwindow.cpp @@ -0,0 +1,2773 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formwindow.h" +#include "defs.h" +#include "mainwindow.h" +#include "widgetfactory.h" +#include "sizehandle.h" +#include "metadatabase.h" +#include "resource.h" +#include "tqlayout.h" +#include "connectiondialog.h" +#include <widgetdatabase.h> +#include "pixmapchooser.h" +#include "orderindicator.h" +#include "hierarchyview.h" +#include "designerappiface.h" +#include "menubareditor.h" +#define NO_STATIC_COLORS +#include "globaldefs.h" + +#include <stdlib.h> + +#include <kiconloader.h> +#include <tdelocale.h> +#include "kdevdesigner_part.h" + +#include <tqevent.h> +#include <tqpainter.h> +#include <tqpen.h> +#include <tqlabel.h> +#include <tqobjectlist.h> +#include <tqtimer.h> +#include <tqapplication.h> +#include <tqlayout.h> +#include <tqspinbox.h> +#include <tqstatusbar.h> +#include <tqapplication.h> +#include <tqpalette.h> +#include <tqmessagebox.h> +#include <tqpopupmenu.h> +#include <tqsizegrip.h> +#include <tqpushbutton.h> +#include <tqwhatsthis.h> +#include <tqmetaobject.h> +#include <tqtooltip.h> +#include <tqfeatures.h> +#include <tqaccel.h> +#include <tqpixmapcache.h> +#include <tqbitmap.h> +#include <tqsplitter.h> + +// FormWindow should be able to work to some limited degree +// (existance, loading) without a MainWindow. Functions which require +// a MainWindow in theory should never be called if no MainWindow +// exists. These macros are used to let us know if that happens anyway +// and to ensure that we don't crash +#define CHECK_MAINWINDOW Q_ASSERT( mainWindow() ); if ( !mainWindow() ) return +#define CHECK_MAINWINDOW_VALUE( v ) Q_ASSERT( mainWindow() ); if ( !mainWindow() ) return v + +static void setCursorToAll( const TQCursor &c, TQWidget *start ) +{ + start->setCursor( c ); + TQObjectList l = start->childrenListObject(); + if ( !l.isEmpty() ) { + for ( TQObject *o = l.first(); o; o = l.next() ) { + if ( o->isWidgetType() && !::tqqt_cast<SizeHandle*>(o) ) + setCursorToAll( c, ( (TQWidget*)o ) ); + } + } +} + +static void restoreCursors( TQWidget *start, FormWindow *fw ) +{ + if ( fw->widgets()->find( start ) ) + start->setCursor( MetaDataBase::cursor( start ) ); + else + start->setCursor( TQt::ArrowCursor ); + TQObjectList l = start->childrenListObject(); + if ( !l.isEmpty() ) { + for ( TQObject *o = l.first(); o; o = l.next() ) { + if ( o->isWidgetType() && !::tqqt_cast<SizeHandle*>(o) ) + restoreCursors( ( (TQWidget*)o ), fw ); + } + } +} + +#if defined(TQ_WS_WIN32) // #### needed for the workaround for repaint problem on windows +#include <tqt_windows.h> +static void flickerfree_update( TQWidget *w ) +{ + InvalidateRect( w->winId(), 0, FALSE ); +} +#endif + +/*! + \class FormWindow formwindow.h + \brief Editor window for a form + + The FormWindow is the widget which is used as editor for forms. It + handles inserting, deleting, moving, resizing, etc. of widgets. + + Normally multiple formwindows are used at the same time in the + Designer. So each formwindow has its own undo/redo buffer, etc. + + Also the formwindow has some signals to inform e.g. about selection + changes which is interesting for the PropertyEditor. + + For handling the events of the child widgets (moving, etc.) the + handleMousePress(), etc. functions are called from the application + event filter which is implemented in MainWindow::eventFilter(). +*/ + +FormWindow::FormWindow( FormFile *f, MainWindow *mw, TQWidget *parent, const char *name ) + : TQWidget( parent, name, WDestructiveClose ), mainwindow( mw ), + commands( 100 ), pixInline( TRUE ), pixProject( FALSE ) +{ + ff = f; + init(); + initSlots(); +} + +FormWindow::FormWindow( FormFile *f, TQWidget *parent, const char *name ) + : TQWidget( parent, name, WDestructiveClose ), mainwindow( 0 ), + commands( 100 ), pixInline( TRUE ) +{ + ff = f; + init(); +} + +void FormWindow::init() +{ + setWFlags(getWFlags() & TQt::WStyle_Maximize); + + fake = qstrcmp( name(), "qt_fakewindow" ) == 0; + MetaDataBase::addEntry( TQT_TQOBJECT(this) ); + ff->setFormWindow( this ); + iface = 0; + proj = 0; + propertyWidget = 0; + toolFixed = FALSE; + checkedSelectionsForMove = FALSE; + mContainer = 0; + startWidget = endWidget = 0; + currTool = POINTER_TOOL; + unclippedPainter = 0; + widgetPressed = FALSE; + drawRubber = FALSE; + setFocusPolicy( TQ_ClickFocus ); + sizePreviewLabel = 0; + checkSelectionsTimer = new TQTimer( this, "checkSelectionsTimer" ); + connect( checkSelectionsTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( invalidCheckedSelections() ) ); + updatePropertiesTimer = new TQTimer( this ); + connect( updatePropertiesTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( updatePropertiesTimerDone() ) ); + showPropertiesTimer = new TQTimer( this ); + //!!!! + connect( showPropertiesTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( showPropertiesTimerDone() ) ); + selectionChangedTimer = new TQTimer( this ); + connect( selectionChangedTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( selectionChangedTimerDone() ) ); + windowsRepaintWorkaroundTimer = new TQTimer( this ); + connect( windowsRepaintWorkaroundTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( windowsRepaintWorkaroundTimerTimeout() ) ); + insertParent = 0; + connect( &commands, TQT_SIGNAL( undoRedoChanged( bool, bool, const TQString &, const TQString & ) ), + this, TQT_SIGNAL( undoRedoChanged( bool, bool, const TQString &, const TQString & ) ) ); + propShowBlocked = FALSE; + + setIcon( SmallIcon( "designer_form.png" , KDevDesignerPartFactory::instance()) ); + + connect( &commands, TQT_SIGNAL( modificationChanged( bool ) ), + this, TQT_SLOT( modificationChanged( bool ) ) ); + buffer = 0; + + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQFRAME_OBJECT_NAME_STRING ), this ); + setMainContainer( w ); + propertyWidget = TQT_TQOBJECT(w); + targetContainer = 0; + hadOwnPalette = FALSE; + + defSpacing = BOXLAYOUT_DEFAULT_SPACING; + defMargin = BOXLAYOUT_DEFAULT_MARGIN; + hasLayoutFunc = FALSE; +} + +void FormWindow::setMainWindow( MainWindow *w ) +{ + mainwindow = w; + MetaDataBase::addEntry( TQT_TQOBJECT(this) ); + initSlots(); +} + +void FormWindow::initSlots() +{ + if ( isFake() ) + return; + Q_ASSERT( project() || MainWindow::self ); + if ( !project() && !MainWindow::self ) + return; + Project *p = project() ? project() : MainWindow::self->currProject(); + if ( p && p->isCpp() ) { + TQString code = formFile()->code(); + if ( code.isEmpty() ) + formFile()->setCode( formFile()->codeComment() ); + } +} + +FormWindow::~FormWindow() +{ + if ( MainWindow::self && MainWindow::self->objectHierarchy()->formWindow() == this ) + MainWindow::self->objectHierarchy()->setFormWindow( 0, 0 ); + + MetaDataBase::clear( TQT_TQOBJECT(this) ); + if ( ff ) + ff->setFormWindow( 0 ); + delete iface; +} + +void FormWindow::closeEvent( TQCloseEvent *e ) +{ + TQGuardedPtr<FormWindow> that = this; + if ( ff->closeEvent() && ( !that || ( mainwindow && mainwindow->unregisterClient( this ) ) ) ) + e->accept(); + else + e->ignore(); +} + +void FormWindow::paintGrid( TQWidget *w, TQPaintEvent *e ) +{ + if ( !mainWindow() || !mainWindow()->showGrid() ) + return; + TQPixmap grid; + TQString grid_name; + grid_name.sprintf("FormWindowGrid_%d_%d", mainWindow()->grid().x(), mainWindow()->grid().y()); + if( !TQPixmapCache::find( grid_name, grid ) ) { + grid = TQPixmap( 350 + ( 350 % mainWindow()->grid().x() ), 350 + ( 350 % mainWindow()->grid().y() ) ); + grid.fill( colorGroup().color( TQColorGroup::Foreground ) ); + TQBitmap mask( grid.width(), grid.height() ); + mask.fill( color0 ); + TQPainter p( &mask ); + p.setPen( color1 ); + for ( int y = 0; y < grid.width(); y += mainWindow()->grid().y()) { + for ( int x = 0; x < grid.height(); x += mainWindow()->grid().x() ) { + p.drawPoint( x, y ); + } + } + grid.setMask( mask ); + TQPixmapCache::insert( grid_name, grid ); + } + TQPainter p( w ); + p.setClipRegion( e->rect() ); + p.drawTiledPixmap( TQRect( 0, 0, width(), height() ), grid ); +} + +/*! For operations like drawing a rubber band or drawing the rect + when inserting a new widget, a unclipped painter (which draws also + on child widgets) is needed. This method does all the initialization. +*/ + +void FormWindow::beginUnclippedPainter( bool doNot ) +{ + endUnclippedPainter(); + bool unclipped = testWFlags( WPaintUnclipped ); + setWFlags( WPaintUnclipped ); + unclippedPainter = new TQPainter; + unclippedPainter->begin( this ); + if ( !unclipped ) + clearWFlags( WPaintUnclipped ); + if ( doNot ) { + unclippedPainter->setPen( TQPen( color0, 2 ) ); + unclippedPainter->setRasterOp( NotROP ); + } +} + +/*! + Gets rid of an open unclipped painter. + + \sa beginUnclippedPainter() +*/ + +void FormWindow::endUnclippedPainter() +{ + if ( unclippedPainter ) + unclippedPainter->end(); + delete unclippedPainter; + unclippedPainter = 0; +} + +TQPoint FormWindow::gridPoint( const TQPoint &p ) +{ + return TQPoint( ( p.x() / grid().x() ) * grid().x(), + ( p.y() / grid().y() ) * grid().y() ); +} + +void FormWindow::drawSizePreview( const TQPoint &pos, const TQString& text ) +{ + unclippedPainter->save(); + unclippedPainter->setPen( TQPen( colorGroup().foreground(), 1 )); + unclippedPainter->setRasterOp( CopyROP ); + if ( !sizePreviewPixmap.isNull() ) + unclippedPainter->drawPixmap( sizePreviewPos, sizePreviewPixmap ); + if ( text.isNull() ) { + sizePreviewPixmap = TQPixmap(); // set null again + unclippedPainter->restore(); + return; + } + TQRect r = fontMetrics().boundingRect( 0, 0, 0, 0, AlignCenter, text ); + r = TQRect( pos + TQPoint( 10, 10 ), r.size() + TQSize( 5, 5 ) ); + + checkPreviewGeometry( r ); + + sizePreviewPos = r.topLeft(); + sizePreviewPixmap = TQPixmap::grabWindow( winId(), r.x(), r.y(), r.width(), r.height() ); + unclippedPainter->setBrush( TQColor( 255, 255, 128 ) ); + unclippedPainter->drawRect( r ); + unclippedPainter->drawText( r, AlignCenter, text ); + unclippedPainter->restore(); +} + +void FormWindow::insertWidget() +{ + CHECK_MAINWINDOW; + if ( !insertParent ) + return; + + if ( currTool == POINTER_TOOL ) + return; + + bool useSizeHint = !oldRectValid || ( currRect.width() < 2 && currRect.height() < 2 ); + Qt::Orientation orient =Qt::Horizontal; + TQString n = WidgetDatabase::className( currTool ); + if ( useSizeHint && ( n == "Spacer" || n == TQSLIDER_OBJECT_NAME_STRING || n == "Line" || n == TQSCROLLBAR_OBJECT_NAME_STRING ) ) { + TQPopupMenu m( mainWindow() ); + m.insertItem( i18n( "&Horizontal" ) ); + int ver = m.insertItem( i18n( "&Vertical" ) ); + int r = m.exec( TQCursor::pos() ); + if ( r == ver ) + orient =Qt::Vertical; + } + + + TQWidget *w = WidgetFactory::create( currTool, insertParent, 0, TRUE, &currRect, orient ); + if ( !w ) + return; + + if ( !savePixmapInline() && currTool == WidgetDatabase::idFromClassName( "PixmapLabel" ) ) { // ### what to do for pixmaps in project + TQPixmap pix; + // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that + pix.convertFromImage( SmallIcon( "designer_image.png" , KDevDesignerPartFactory::instance()).convertToImage() ); + ( (TQLabel*)w )->setPixmap( pix ); + } + int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf(TQT_TQOBJECT(w)) ); + if ( WidgetDatabase::isCustomWidget( id ) ) { + TQWhatsThis::add( w, i18n("<b>A %1 (custom widget)</b> " + "<p>Click <b>Edit Custom Widgets...</b> in the <b>Tools|Custom</b> " + "menu to add and change custom widgets. You can add " + "properties as well as signals and slots to integrate custom widgets into " + "<i>TQt Designer</i>, and provide a pixmap which will be used to represent " + "the widget on the form.</p>") + .arg(WidgetDatabase::toolTip( id )) ); + TQToolTip::add( w, i18n("A %1 (custom widget)").arg(WidgetDatabase::toolTip( id )) ); + } else { + TQString tt = WidgetDatabase::toolTip( id ); + TQString wt = WidgetDatabase::whatsThis( id ); + if ( !wt.isEmpty() && !tt.isEmpty() ) + TQWhatsThis::add( w, TQString("<b>A %1</b><p>%2</p>").arg( tt ).arg( wt ) ); + } + + TQString s = w->name(); + unify( TQT_TQOBJECT(w), s, TRUE ); + w->setName( s ); + insertWidget( w ); + TQRect r( currRect ); + if ( !oldRectValid || + ( currRect.width() < 2 && currRect.height() < 2 ) ) + r = TQRect( rectAnchor, TQSize( 0, 0 ) ); + + TQPoint p = r.topLeft(); + p = mapToGlobal( p ); + p = insertParent->mapFromGlobal( p ); + r = TQRect( p, r.size() ); + + if ( useSizeHint ) { + if ( n == "Spacer" ) { + if ( orient ==Qt::Vertical ) { + r.setWidth( 20 ); + r.setHeight( 40 ); + } else { + r.setWidth( 40 ); + r.setHeight( 20 ); + } + } else { + r.setWidth( w->sizeHint().width() ); + r.setHeight( w->sizeHint().height() ); + } + } + + if ( r.width() < 2 * grid().x() ) + r.setWidth( 2 * grid().x() ); + if ( r.height() < 2 * grid().y() ) + r.setHeight( 2 * grid().y() ); + + const TQObjectList l = insertParent->childrenListObject(); + TQObjectListIt it( l ); + TQWidgetList lst; + if ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) ) { + for ( ; it.current(); ) { + TQObject *o = it.current(); + ++it; + if ( o->isWidgetType() && + ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets.find( TQT_TQWIDGET(o) ) && TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(w) ) { + TQRect r2( ( (TQWidget*)o )->pos(), + ( (TQWidget*)o )->size() ); + if ( r.contains( r2 ) ) + lst.append( (TQWidget*)o ); + } + } + } + + if ( !lst.isEmpty() ) { + TQWidget *pw = WidgetFactory::containerOfWidget( w ); + if (pw) { + TQValueList<TQPoint> op, np; + for ( TQWidget *i = lst.first(); i; i = lst.next() ) { + op.append( i->pos() ); + TQPoint pos = pw->mapFromGlobal( i->mapToGlobal( TQPoint( 0, 0 ) ) ); + pos -= r.topLeft(); + np.append( pos ); + } + + MoveCommand *mv = new MoveCommand( i18n( "Reparent Widgets" ), this, + lst, op, np, insertParent, pw ); + + if ( !toolFixed ) + mainwindow->resetTool(); + else + setCursorToAll( CrossCursor, w ); + + InsertCommand *cmd = new InsertCommand( i18n( "Insert %1" ).arg( w->name() ), this, w, r ); + + TQPtrList<Command> commands; + commands.append( mv ); + commands.append( cmd ); + + MacroCommand *mc = new MacroCommand( i18n( "Insert %1" ).arg( w->name() ), this, commands ); + commandHistory()->addCommand( mc ); + mc->execute(); + } + } else { + if ( !toolFixed ) + mainwindow->resetTool(); + else + setCursorToAll( CrossCursor, w ); + + InsertCommand *cmd = new InsertCommand( i18n( "Insert %1" ).arg( w->name() ), this, w, r ); + commandHistory()->addCommand( cmd ); + cmd->execute(); + } + + TemplateWizardInterface *iface = mainWindow()->templateWizardInterface( w->className() ); + if ( iface ) { + iface->setup( w->className(), w, iFace(), mainWindow()->designerInterface() ); + iface->release(); + } +} + +void FormWindow::insertWidget( TQWidget *w, bool checkName ) +{ + if ( !w ) + return; + if ( checkName ) { + TQString s = w->name(); + unify( TQT_TQOBJECT(w), s, TRUE ); + w->setName( s ); + } + + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf(TQT_TQOBJECT(w)) ); + if ( WidgetDatabase::isCustomWidget( id ) ) { + TQWhatsThis::add( w, i18n("<b>A %1 (custom widget)</b> " + "<p>Click <b>Edit Custom Widgets...</b> in the <b>Tools|Custom</b> " + "menu to add and change custom widgets. You can add " + "properties as well as signals and slots to integrate custom widgets into " + "<i>TQt Designer</i>, and provide a pixmap which will be used to represent " + "the widget on the form.</p>") + .arg(WidgetDatabase::toolTip( id )) ); + TQToolTip::add( w, i18n("A %1 (custom widget)").arg(WidgetDatabase::toolTip( id )) ); + } else { + TQString tt = WidgetDatabase::toolTip( id ); + TQString wt = WidgetDatabase::whatsThis( id ); + if ( !wt.isEmpty() && !tt.isEmpty() ) + TQWhatsThis::add( w, TQString("<b>A %1</b><p>%2</p>").arg( tt ).arg( wt ) ); + } + + restoreCursors( w, this ); + widgets()->insert( w, w ); + w->show(); +} + +void FormWindow::removeWidget( TQWidget *w ) +{ + MetaDataBase::removeEntry( TQT_TQOBJECT(w) ); + widgets()->take( w ); +} + +void FormWindow::handleContextMenu( TQContextMenuEvent *e, TQWidget *w ) +{ + CHECK_MAINWINDOW; + switch ( currTool ) { + case POINTER_TOOL: { + if ( !isMainContainer( TQT_TQOBJECT(w) ) && qstrcmp( w->name(), "central widget" ) != 0 ) { // press on a child widget + raiseChildSelections( w ); // raise selections and select widget + selectWidget( TQT_TQOBJECT(w) ); + // if widget is laid out, find the first non-laid out super-widget + TQWidget *realWidget = w; // but store the original one + while ( w->parentWidget() && + ( WidgetFactory::layoutType( w->parentWidget()) != WidgetFactory::NoLayout || + !insertedWidgets.find(w) ) ) + w = w->parentWidget(); + if ( ::tqqt_cast<TQMainWindow*>(mainContainer()) && ((TQMainWindow*)mainContainer())->centralWidget() == realWidget ) { + e->accept(); + mainwindow->popupFormWindowMenu( e->globalPos(), this ); + } else { + e->accept(); + mainwindow->popupWidgetMenu( e->globalPos(), this, realWidget); + } + } else { + e->accept(); + clearSelection(); + mainwindow->popupFormWindowMenu( e->globalPos(), this ); + } + break; } + default: + break; + } +} + +void FormWindow::handleMousePress( TQMouseEvent *e, TQWidget *w ) +{ + CHECK_MAINWINDOW; + checkedSelectionsForMove = FALSE; + checkSelectionsTimer->stop(); + if ( !sizePreviewLabel ) { + sizePreviewLabel = new TQLabel( this ); + sizePreviewLabel->hide(); + sizePreviewLabel->setBackgroundColor( TQColor( 255, 255, 128 ) ); + sizePreviewLabel->setFrameStyle( TQFrame::Plain | TQFrame::Box ); + } + + switch ( currTool ) { + case POINTER_TOOL: + if ( !isMainContainer( TQT_TQOBJECT(w) ) && qstrcmp( w->name(), "central widget" ) != 0 ) { // press on a child widget + // if the clicked widget is not in a layout, raise it + if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) + w->raise(); + if ( ( e->state() & ControlButton ) ) { // with control pressed, always start rubber band selection + drawRubber = TRUE; + currRect = TQRect( 0, 0, -1, -1 ); + startRectDraw( mapFromGlobal( e->globalPos() ), e->globalPos(), this, Rubber ); + break; + } + + bool sel = isWidgetSelected( TQT_TQOBJECT(w) ); + if ( !( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) ) { // control not pressed... + if ( !sel ) { // ...and widget no selectted: unselect all + clearSelection( FALSE ); + } else { // ...widget selected + // only if widget has a layout (it is a layout meta widget or a laid out container!), unselect its childs + if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout ) { + TQObjectList *l = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + setPropertyShowingBlocked( TRUE ); + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( !o->isWidgetType() ) + continue; + if ( insertedWidgets.find( (TQWidget*)o ) ) + selectWidget( TQT_TQOBJECT(o), FALSE ); + } + setPropertyShowingBlocked( FALSE ); + delete l; + } + } + tqApp->processEvents(); + } + if ( ( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) && + sel && e->button() == Qt::LeftButton ) { // control pressed and selected, unselect widget + selectWidget( TQT_TQOBJECT(w), FALSE ); + break; + } + + raiseChildSelections( w ); // raise selections and select widget + selectWidget( TQT_TQOBJECT(w) ); + + // if widget is laid out, find the first non-laid out super-widget + while ( w->parentWidget() && + ( WidgetFactory::layoutType( w->parentWidget()) != WidgetFactory::NoLayout || !insertedWidgets.find(w) ) ) + w = w->parentWidget(); + + if ( e->button() == Qt::LeftButton ) { // left button: store original geometry and more as the widget might start moving + widgetPressed = TRUE; + widgetGeom = TQRect( w->pos(), w->size() ); + oldPressPos = w->mapFromGlobal( e->globalPos() ); + origPressPos = oldPressPos; + checkedSelectionsForMove = FALSE; + moving.clear(); + if ( w->parentWidget() && !isMainContainer( TQT_TQOBJECT(w->parentWidget()) ) && !isCentralWidget( TQT_TQOBJECT(w->parentWidget()) ) ) { + targetContainer = w->parentWidget(); + hadOwnPalette = w->parentWidget()->ownPalette(); + restorePalette = w->parentWidget()->palette(); + } + } + } else { // press was on the formwindow + if ( e->button() == Qt::LeftButton ) { // left button: start rubber selection and show formwindow properties + drawRubber = TRUE; + if ( !( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) ) { + clearSelection( FALSE ); + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(mainContainer()); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + } + currRect = TQRect( 0, 0, -1, -1 ); + startRectDraw( mapFromGlobal( e->globalPos() ), e->globalPos(), this, Rubber ); + } + } + break; + case CONNECT_TOOL: + case BUDDY_TOOL: + if ( e->button() != Qt::LeftButton ) + break; + validForBuddy = FALSE; + if ( currTool == BUDDY_TOOL ) { + if ( !::tqqt_cast<TQLabel*>(w) ) + break; + clearSelection( FALSE ); + validForBuddy = TRUE; + mainWindow()->statusMessage( i18n( "Set buddy for '%1' to..." ).arg( w->name() ) ); + } else { + mainWindow()->statusMessage( i18n( "Connect '%1' with..." ).arg( w->name() ) ); + } + saveBackground(); + startPos = mapFromGlobal( e->globalPos() ); + currentPos = startPos; + startWidget = designerWidget( TQT_TQOBJECT(w) ); + endWidget = startWidget; + beginUnclippedPainter( FALSE ); + drawConnectionLine(); + break; + case ORDER_TOOL: + if ( !isMainContainer( TQT_TQOBJECT(w) ) ) { // press on a child widget + orderedWidgets.removeRef( w ); + orderedWidgets.append( w ); + for ( TQWidget *wid = orderedWidgets.last(); wid; wid = orderedWidgets.prev() ) { + int i = stackedWidgets.findRef( wid ); + if ( i != -1 ) { + stackedWidgets.removeRef( wid ); + stackedWidgets.insert( 0, wid ); + } + } + TQWidgetList oldl = MetaDataBase::tabOrder( this ); + TabOrderCommand *cmd = new TabOrderCommand( i18n( "Change Tab Order" ), this, oldl, stackedWidgets ); + cmd->execute(); + commandHistory()->addCommand( cmd, TRUE ); + updateOrderIndicators(); + } + break; + default: // any insert widget tool + if ( e->button() == Qt::LeftButton ) { + insertParent = WidgetFactory::containerOfWidget( mainContainer() ); // default parent for new widget is the formwindow + if ( !isMainContainer( TQT_TQOBJECT(w) ) ) { // press was not on formwindow, check if we can find another parent + TQWidget *wid = w; + for (;;) { + int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(wid) ) ); + if ( ( WidgetDatabase::isContainer( id ) || wid == mainContainer() ) && + !::tqqt_cast<TQLayoutWidget*>(wid) && !::tqqt_cast<TQSplitter*>(wid) ) { + insertParent = WidgetFactory::containerOfWidget( wid ); // found another parent, store it + break; + } else { + wid = wid->parentWidget(); + if ( !wid ) + break; + } + } + } + startRectDraw( w->mapFromGlobal( e->globalPos() ), e->globalPos(), w, Insert ); + } + break; + } +} + +void FormWindow::handleMouseDblClick( TQMouseEvent *, TQWidget *w ) +{ + CHECK_MAINWINDOW; + switch ( currTool ) { + case ORDER_TOOL: + if ( !isMainContainer( TQT_TQOBJECT(w) ) ) { // press on a child widget + orderedWidgets.clear(); + orderedWidgets.append( w ); + for ( TQWidget *wid = orderedWidgets.last(); wid; wid = orderedWidgets.prev() ) { + int i = stackedWidgets.findRef( wid ); + if ( i != -1 ) { + stackedWidgets.removeRef( wid ); + stackedWidgets.insert( 0, wid ); + } + } + TQWidgetList oldl = MetaDataBase::tabOrder( this ); + TabOrderCommand *cmd = new TabOrderCommand( i18n( "Change Tab Order" ), this, oldl, stackedWidgets ); + cmd->execute(); + commandHistory()->addCommand( cmd, TRUE ); + updateOrderIndicators(); + } + default: + if ( !WidgetFactory::isPassiveInteractor( TQT_TQOBJECT(w) ) && + ( isMainContainer( TQT_TQOBJECT(w) ) || TQT_BASE_OBJECT(w) == TQT_BASE_OBJECT(this) ) ) + mainWindow()->editSource(); + break; + } +} + +void FormWindow::handleMouseMove( TQMouseEvent *e, TQWidget *w ) +{ + CHECK_MAINWINDOW; + if ( ( e->state() & Qt::LeftButton ) != Qt::LeftButton ) + return; + + TQWidget *newendWidget = endWidget, *oldendWidget = endWidget, *wid; + bool drawRecRect; + switch ( currTool ) { + case POINTER_TOOL: + if ( widgetPressed && allowMove( w ) ) { // we are prepated for a move + + // if widget is laid out, find the first non-laid out super-widget + while ( w->parentWidget() && + ( WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout || !insertedWidgets.find(w ) ) ) + w = w->parentWidget(); + + // calc correct position + TQPoint pos = w->mapFromGlobal( e->globalPos() ); + +#if 0 + TQPoint mpos = w->mapToParent( pos ); + // check if we are not outside the visible area, else correct coords + if ( mpos.x() < 0 ) + pos.setX( w->mapFromParent( TQPoint( 0, mpos.y() ) ).x() ); + if ( mpos.y() < 0 ) + pos.setY( w->mapFromParent( TQPoint( mpos.x(), 0 ) ).y() ); + if ( mpos.x() > w->parentWidget()->width() ) + pos.setX( w->mapFromParent( TQPoint( w->parentWidget()->width(), mpos.y() ) ).x() ); + if ( mpos.y() > w->parentWidget()->height() ) + pos.setY( w->mapFromParent( TQPoint( mpos.x(), w->parentWidget()->height() ) ).y() ); +#endif + + // calc move distance and store it + TQPoint d = oldPressPos - pos; + if ( TQABS( d.x() ) < grid().x() ) + d.setX( 0 ); + if ( TQABS( d.y() ) < grid().y() ) + d.setY( 0 ); + if ( d.x() == 0 ) + pos.setX( oldPressPos.x() ); + if ( d.y() == 0 ) + pos.setY( oldPressPos.y() ); + oldPressPos = pos; + + // snap to grid + int x = widgetGeom.x() - d.x(); + widgetGeom.setX( x ); + x = ( x / grid().x() ) * grid().x(); + int y = widgetGeom.y() - d.y(); + widgetGeom.setY( y ); + y = ( y / grid().y() ) * grid().y(); + TQPoint p = w->pos(); + + if ( x - p.x() != 0 || y - p.y() != 0 ) { // if we actually have to move + if ( !checkedSelectionsForMove ) { // if not checked yet, check if the correct widget are selected... + if ( !isWidgetSelected( TQT_TQOBJECT(w) ) ) { // and unselect others. Only siblings can be moved at the same time + setPropertyShowingBlocked( TRUE ); + selectWidget( TQT_TQOBJECT(w) ); + setPropertyShowingBlocked( FALSE ); + } + checkSelectionsForMove( w ); + } + + // check whether we would have to reparent the selection and highlight the possible new parent container + TQMapConstIterator<TQWidget*, TQPoint> it = moving.begin(); + TQWidget* wa = containerAt( e->globalPos(), it.key() ); + if ( wa && !isMainContainer( TQT_TQOBJECT(wa) ) && !isCentralWidget( TQT_TQOBJECT(wa) ) ) { + wa = WidgetFactory::containerOfWidget( wa ); + // ok, looks like we moved onto a container + + if ( wa != targetContainer ) { + if ( targetContainer ) { + if ( hadOwnPalette ) + targetContainer->setPalette( restorePalette ); + else + targetContainer->unsetPalette(); + } + targetContainer = wa; + hadOwnPalette = wa->ownPalette(); + restorePalette = wa->palette(); + wa->setPaletteBackgroundColor( wa->colorGroup().midlight() ); + } + } + else if ( targetContainer ) { + if( hadOwnPalette ) + targetContainer->setPalette( restorePalette ); + else + targetContainer->unsetPalette(); + targetContainer = 0; + } + + // finally move the selected widgets and show/update preview label + moveSelectedWidgets( x - p.x(), y - p.y() ); + sizePreviewLabel->setText( i18n( "%1/%2" ).arg( w->pos().x() ).arg( w->pos().y() ) ); + sizePreviewLabel->adjustSize(); + TQRect lg( mapFromGlobal( e->globalPos() ) + TQPoint( 16, 16 ), sizePreviewLabel->size() ); + checkPreviewGeometry( lg ); + sizePreviewLabel->setGeometry( lg ); + sizePreviewLabel->raise(); + sizePreviewLabel->show(); +#if defined(TQ_WS_WIN32) + windowsRepaintWorkaroundTimer->start( 100, TRUE ); +#endif + } else { // if we don't need to move, do some indication + TQRect lg( mapFromGlobal( e->globalPos() ) + TQPoint( 16, 16 ), sizePreviewLabel->size() ); + checkPreviewGeometry( lg ); + sizePreviewLabel->move( lg.x(), lg.y() ); + } + + oldPressPos += ( p - w->pos() ); + } else if ( drawRubber ) { // draw rubber if we are in rubber-selection mode + continueRectDraw( mapFromGlobal( e->globalPos() ), e->globalPos(), this, Rubber ); + } + break; + case CONNECT_TOOL: + restoreConnectionLine(); + wid = tqApp->widgetAt( e->globalPos(), TRUE ); + if ( wid ) + wid = designerWidget( TQT_TQOBJECT(wid) ); + if ( wid && ( isMainContainer( TQT_TQOBJECT(wid) ) || insertedWidgets.find( wid ) ) && wid->isVisibleTo( this ) ) + newendWidget = wid; + if ( ::tqqt_cast<TQLayoutWidget*>(newendWidget) || ::tqqt_cast<Spacer*>(newendWidget) ) + newendWidget = (TQWidget*)endWidget; + drawRecRect = newendWidget != endWidget; + if ( newendWidget && + ( isMainContainer( TQT_TQOBJECT(newendWidget) ) || insertedWidgets.find( newendWidget ) ) && !isCentralWidget( TQT_TQOBJECT(newendWidget) ) ) + endWidget = newendWidget; + mainWindow()->statusMessage( i18n( "Connect '%1' to '%2'" ).arg( startWidget->name() ). + arg( endWidget->name() ) ); + currentPos = mapFromGlobal( e->globalPos() ); + tqApp->processEvents(); + if ( drawRecRect ) + restoreRect( TQRect( mapToForm( ( (TQWidget*)oldendWidget )->parentWidget(), ( (TQWidget*)oldendWidget )->pos() ), + ( (TQWidget*)oldendWidget )->size() ) ); + drawConnectionLine(); + break; + case BUDDY_TOOL: + if ( !validForBuddy ) + break; + restoreConnectionLine(); + wid = tqApp->widgetAt( e->globalPos(), TRUE ); + if ( wid ) + wid = designerWidget( TQT_TQOBJECT(wid) ); + if ( wid && canBeBuddy( wid ) && wid->isVisibleTo( this ) ) + newendWidget = wid; + else + newendWidget = 0; + if ( ::tqqt_cast<TQLayoutWidget*>(newendWidget) || ::tqqt_cast<Spacer*>(newendWidget) ) + newendWidget = (TQWidget*)endWidget; + drawRecRect = newendWidget != endWidget; + if ( !newendWidget ) + endWidget = newendWidget; + else if ( insertedWidgets.find( newendWidget ) && !isCentralWidget( TQT_TQOBJECT(newendWidget) ) ) + endWidget = newendWidget; + if ( endWidget ) + mainWindow()->statusMessage( i18n( "Set buddy '%1' to '%2'" ).arg( startWidget->name() ). + arg( endWidget->name() ) ); + else + mainWindow()->statusMessage( i18n( "Set buddy '%1' to ..." ).arg( startWidget->name() ) ); + currentPos = mapFromGlobal( e->globalPos() ); + tqApp->processEvents(); + if ( drawRecRect && oldendWidget ) + restoreRect( TQRect( mapToForm( ( (TQWidget*)oldendWidget )->parentWidget(), ( (TQWidget*)oldendWidget )->pos() ), + ( (TQWidget*)oldendWidget )->size() ) ); + drawConnectionLine(); + break; + case ORDER_TOOL: + break; + default: // we are in an insert-widget tool + if ( insertParent ) // draw insert rect + continueRectDraw( w->mapFromGlobal( e->globalPos() ), e->globalPos(), w, Insert ); + break; + } +} + +void FormWindow::handleMouseRelease( TQMouseEvent *e, TQWidget *w ) +{ + CHECK_MAINWINDOW; + if ( e->button() != Qt::LeftButton ) + return; + + switch ( currTool ) { + case POINTER_TOOL: + if ( widgetPressed && allowMove( w ) ) { // we moved the widget + sizePreviewLabel->hide(); + + if ( moving.isEmpty() || w->pos() == *moving.find(w) ) + break; + + // restore targetContainer + if ( targetContainer ) { + if( hadOwnPalette ) + targetContainer->setPalette( restorePalette ); + else + targetContainer->unsetPalette(); + } + + // tell property editor to update + if ( propertyWidget && propertyWidget->isWidgetType() && !isMainContainer( propertyWidget ) ) + emitUpdateProperties( propertyWidget ); + + TQMapConstIterator<TQWidget*,TQPoint> it = moving.begin(); + TQWidget *oldParent = it.key()->parentWidget(); + TQWidget *newParent = oldParent; + // check whether we have to reparent the selection + TQWidget* wa = containerAt( e->globalPos(), it.key() ); + if ( wa ) { + wa = WidgetFactory::containerOfWidget( wa ); + // ok, looks like we moved onto a container + + // check whether we really have different parents. + if ( wa == it.key()->parentWidget() ) + goto make_move_command; + + // break layout if necessary + if ( WidgetFactory::layoutType( wa ) != WidgetFactory::NoLayout ) { + if ( TQMessageBox::information( mainWindow(), i18n( "Inserting Widget" ), + i18n( "You tried to insert a widget into the " + "layout Container Widget '%1'.\n" + "This is not possible. " + "In order to insert the widget, the layout of '%1'\n" + "must first be broken.\n" + "Break the layout or cancel the operation?" ). + arg( wa->name() ). + arg( wa->name() ), i18n( "&Break Layout" ), i18n( "&Cancel" ) ) ) + goto make_move_command; // cancel + breakLayout( wa ); + } + + // doesn't need to be a command, the MoveCommand does reparenting too + bool emitSelChanged = FALSE; + for ( TQMap<TQWidget*, TQPoint>::Iterator it = moving.begin(); it != moving.end(); ++it ) { + TQWidget *i = it.key(); + if ( !emitSelChanged && ::tqqt_cast<TQButton*>(i) ) { + if ( ::tqqt_cast<TQButtonGroup*>(i->parentWidget()) || ::tqqt_cast<TQButtonGroup*>(wa) ) + emitSelChanged = TRUE; + if ( !::tqqt_cast<TQButtonGroup*>(wa) ) { + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(i), "buttonGroupId", FALSE ); + if ( ::tqqt_cast<TQButtonGroup*>(i->parentWidget()) ) + ( (TQButtonGroup*)i->parentWidget() )->remove( (TQButton*)i ); + } + } + TQPoint pos = wa->mapFromGlobal( i->mapToGlobal( TQPoint(0,0) ) ); + i->reparent( wa, pos, TRUE ); + raiseSelection( i ); + raiseChildSelections( i ); + widgetChanged( TQT_TQOBJECT(i) ); + mainWindow()->objectHierarchy()->widgetRemoved( i ); + mainWindow()->objectHierarchy()->widgetInserted( i ); + } + if ( emitSelChanged ) { + emit showProperties( TQT_TQOBJECT(wa) ); + emit showProperties( propertyWidget ); + } + newParent = wa; + } + + make_move_command: + TQWidgetList widgets; // collect the widgets and its old and new positions which have been moved + TQValueList<TQPoint> oldPos, newPos; + for ( it = moving.begin(); it != moving.end(); ++it ) { + widgets.append( it.key() ); + oldPos.append( *it ); + newPos.append( it.key()->pos() ); + } + // add move command, don't execute it, this is just a summary of the operations we did during the move-event handling + commandHistory()->addCommand( new MoveCommand( i18n( "Move" ), + this, widgets, + oldPos, newPos, oldParent, newParent ) ); + } else if ( drawRubber ) { // we were drawing a rubber selection + endRectDraw(); // get rid of the rectangle + blockSignals( TRUE ); + selectWidgets(); // select widgets which intersect the rect + blockSignals( FALSE ); + emitSelectionChanged(); // inform about selection changes + if ( propertyWidget ) + emitShowProperties( propertyWidget ); + } + break; + case CONNECT_TOOL: + case BUDDY_TOOL: + restoreConnectionLine(); + if ( startWidget ) + restoreRect( TQRect( mapToForm( ( (TQWidget*)startWidget )->parentWidget(), + ( (TQWidget*)startWidget )->pos() ), + ((TQWidget*)startWidget )->size() ) ); + if ( endWidget ) + restoreRect( TQRect( mapToForm( ( (TQWidget*)endWidget )->parentWidget(), + ( (TQWidget*)endWidget )->pos() ), + ( (TQWidget*)endWidget )->size() ) ); + endUnclippedPainter(); + tqApp->processEvents(); + + if ( startWidget && endWidget ) { + if ( currTool == CONNECT_TOOL ) + editConnections(); + else if ( currTool == BUDDY_TOOL && validForBuddy && startWidget != endWidget ) { + TQString oldBuddy = startWidget->property( "buddy" ).toString(); + if ( oldBuddy.isNull() ) + oldBuddy = ""; + SetPropertyCommand *cmd = new SetPropertyCommand( i18n( "Set Buddy for %1" ).arg( startWidget->name() ), + this, TQT_TQOBJECT(startWidget), mainWindow()->propertyeditor(), + "buddy", startWidget->property( "buddy" ), + endWidget->name(), endWidget->name(), + oldBuddy ); + commandHistory()->addCommand( cmd, TRUE ); + cmd->execute(); + emitUpdateProperties( TQT_TQOBJECT(startWidget) ); + } + } + if ( !toolFixed ) + mainwindow->resetTool(); + startWidget = endWidget = 0; + mainWindow()->statusBar()->clear(); + break; + case ORDER_TOOL: + break; + default: // any insert widget tool is active + if ( insertParent ) { // we should insert the new widget now + endRectDraw(); + if ( WidgetFactory::layoutType( insertParent ) != WidgetFactory::NoLayout ) { + if ( TQMessageBox::information( mainWindow(), i18n( "Inserting Widget" ), + i18n( "You tried to insert a widget into the " + "layout Container Widget '%1'.\n" + "This is not possible. " + "In order to insert the widget, the layout of '%1'\n" + "must first be broken.\n" + "Break the layout or cancel the operation?" ). + arg( insertParent->name() ). + arg( insertParent->name() ), i18n( "&Break Layout" ), i18n( "&Cancel" ) ) == 0 ) { + breakLayout( insertParent ); + } else { + if ( !toolFixed ) + mainWindow()->resetTool(); + break; + } + } + insertWidget(); // so do it + } + break; + } + widgetPressed = FALSE; + drawRubber = FALSE; + insertParent = 0; + delete buffer; + buffer = 0; +} + +void FormWindow::handleKeyPress( TQKeyEvent *e, TQWidget *w ) +{ + CHECK_MAINWINDOW; + e->ignore(); + checkSelectionsTimer->stop(); + if ( !checkedSelectionsForMove && + ( e->key() == Key_Left || + e->key() == Key_Right || + e->key() == Key_Up || + e->key() == Key_Down ) && + propertyWidget->isWidgetType() ) + checkSelectionsForMove( (TQWidget*)propertyWidget ); + checkSelectionsTimer->start( 1000, TRUE ); + if ( e->key() == Key_Left || e->key() == Key_Right || + e->key() == Key_Up || e->key() == Key_Down ) { + TQWidgetList widgets; + TQValueList<TQPoint> oldPos, newPos; + for ( WidgetSelection *s = selections.first(); s; s = selections.next() ) { + if ( s->isUsed() ) { + int dx = 0, dy = 0; + bool control = e->state() & ControlButton; + + switch ( e->key() ) { + case Key_Left: { + e->accept(); + if ( control ) + dx = -1; + else + dx = -grid().x(); + } break; + case Key_Right: { + e->accept(); + if ( control ) + dx = 1; + else + dx = grid().x(); + } break; + case Key_Up: { + e->accept(); + if ( control ) + dy = -1; + else + dy = -grid().y(); + } break; + case Key_Down: { + e->accept(); + if ( control ) + dy = 1; + else + dy = grid().y(); + } break; + default: + break; + } + + widgets.append( s->widget() ); + oldPos.append( s->widget()->pos() ); + newPos.append( s->widget()->pos() + TQPoint( dx, dy ) ); + } + } + if ( !widgets.isEmpty() ) { + MoveCommand *cmd = new MoveCommand( i18n( "Move" ), this, + widgets, oldPos, newPos, 0, 0 ); + commandHistory()->addCommand( cmd, TRUE ); + cmd->execute(); + } + } + if ( !e->isAccepted() ) { + TQObjectList *l = queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( !l ) + return; + if ( l->find( TQT_TQOBJECT(w) ) != -1 ) + e->accept(); + delete l; + } + +} + +void FormWindow::handleKeyRelease( TQKeyEvent *e, TQWidget * ) +{ + e->ignore(); +} + +void FormWindow::selectWidget( TQObject *o, bool select ) +{ + CHECK_MAINWINDOW; + if ( !o->isWidgetType() ) { + // ########### do TQObject stuff + return; + } + + TQWidget *w = (TQWidget*)o; + + if ( isMainContainer( TQT_TQOBJECT(w) ) ) { + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(mainContainer()); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + emitShowProperties( propertyWidget ); + return; + } + + if ( ::tqqt_cast<TQMainWindow*>(mainContainer()) && w == ( (TQMainWindow*)mainContainer() )->centralWidget() ) { + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(mainContainer()); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + emitShowProperties( propertyWidget ); + return; + } + + if ( ::tqqt_cast<QDesignerToolBar*>(o) ) + return; + + if ( select ) { + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(w); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + if ( !isPropertyShowingBlocked() ) + emitShowProperties( propertyWidget ); + WidgetSelection *s = usedSelections.find( w ); + if ( s ) { + s->show(); + return; + } + + for ( WidgetSelection *s2 = selections.first(); s2; s2 = selections.next() ) { + if ( !s2->isUsed() ) { + s = s2; + } + } + + if ( !s ) { + s = new WidgetSelection( this, &usedSelections ); + selections.append( s ); + } + + s->setWidget( w ); + emitSelectionChanged(); + } else { + WidgetSelection *s = usedSelections.find( w ); + if ( s ) + s->setWidget( 0 ); + TQObject *opw = propertyWidget; + if ( !usedSelections.isEmpty() ) + propertyWidget = TQT_TQOBJECT(TQPtrDictIterator<WidgetSelection>( usedSelections ).current()->widget()); + else + propertyWidget = TQT_TQOBJECT(mainContainer()); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + if ( !isPropertyShowingBlocked() ) + emitShowProperties( propertyWidget ); + emitSelectionChanged(); + } +} + +TQPoint FormWindow::grid() const +{ + if ( !mainWindow() || !mainWindow()->snapGrid() ) + return TQPoint( 1, 1 ); + return mainWindow()->grid(); +} + +void FormWindow::updateSelection( TQWidget *w ) +{ + WidgetSelection *s = usedSelections.find( w ); + if ( !w->isVisibleTo( this ) ) + selectWidget( TQT_TQOBJECT(w), FALSE ); + else if ( s ) + s->updateGeometry(); +} + +void FormWindow::raiseSelection( TQWidget *w ) +{ + WidgetSelection *s = usedSelections.find( w ); + if ( s ) + s->show(); +} + +void FormWindow::repaintSelection( TQWidget *w ) +{ + WidgetSelection *s = usedSelections.find( w ); + if ( s ) + s->update(); +} + +void FormWindow::clearSelection( bool changePropertyDisplay ) +{ + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) + it.current()->setWidget( 0, FALSE ); + + usedSelections.clear(); + if ( changePropertyDisplay ) { + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(mainContainer()); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + emitShowProperties( propertyWidget ); + } + emitSelectionChanged(); +} + +void FormWindow::startRectDraw( const TQPoint &p, const TQPoint &global, TQWidget *, RectType t ) +{ + TQPoint pos( p ); + pos = mapFromGlobal( global ); + oldRectValid = FALSE; + beginUnclippedPainter( TRUE ); + if ( t == Rubber ) + unclippedPainter->setPen( TQPen( color0, 1 ) ); + if ( t == Insert ) + rectAnchor = gridPoint( pos ); + else if ( t == Rubber ) + rectAnchor = pos; + currRect = TQRect( rectAnchor, TQPoint( 0, 0 ) ); + if ( t == Insert ) + drawSizePreview( pos, i18n("Use Size Hint") ); +} + +void FormWindow::continueRectDraw( const TQPoint &p, const TQPoint &global, TQWidget *, RectType t ) +{ + TQPoint pos =p; + pos = mapFromGlobal( global ); + TQPoint p2; + if ( t == Insert ) + p2 = gridPoint( pos ); + else if ( t == Rubber ) + p2 = pos; + TQRect r( rectAnchor, p2 ); + r = r.normalize(); + + if ( currRect == r ) { + TQString t = i18n( "%1/%2" ); + t = t.arg( r.width() - 1 ).arg( r.height() - 1 ); + drawSizePreview( pos, t ); + return; + } + + if ( oldRectValid ) + unclippedPainter->drawRect( currRect ); + if ( r.width() > 1 || r.height() > 1 ) { + oldRectValid = TRUE; + currRect = r; + if ( t == Insert ) { + TQString t = i18n( "%1/%2" ); + t = t.arg( r.width() - 1 ).arg( r.height() - 1 ); + drawSizePreview( pos, t ); + } + unclippedPainter->setClipRegion( TQRegion( rect() ).subtract( TQRect( sizePreviewPos, sizePreviewPixmap.size() ) ) ); + unclippedPainter->drawRect( currRect ); + unclippedPainter->setClipping( FALSE ); + } else { + oldRectValid = FALSE; + if ( t == Insert ) + drawSizePreview( pos, i18n("Use Size Hint") ); + } +} + +void FormWindow::endRectDraw() +{ + if ( !unclippedPainter ) + return; + + if ( oldRectValid ) + unclippedPainter->drawRect( currRect ); + drawSizePreview( TQPoint(-1,-1), TQString() ); + endUnclippedPainter(); +} + +void FormWindow::selectWidgets() +{ + TQObjectList *l = mainContainer()->queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( l ) { + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets[ (void*)o ] ) { + TQPoint p = ( (TQWidget*)o )->mapToGlobal( TQPoint(0,0) ); + p = mapFromGlobal( p ); + TQRect r( p, ( (TQWidget*)o )->size() ); + if ( r.intersects( currRect ) && !r.contains( currRect ) ) + selectWidget( TQT_TQOBJECT(o) ); + } + } + delete l; + } + emitSelectionChanged(); +} + +bool FormWindow::isWidgetSelected( TQObject *w ) +{ + if ( w->isWidgetType() ) + return usedSelections.find( (TQWidget*)w ) != 0; + return FALSE; // #### do stuff for TQObjects +} + +void FormWindow::moveSelectedWidgets( int dx, int dy ) +{ + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) { + WidgetSelection *s = it.current(); + TQWidget *w = s->widget(); + if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) + continue; + w->move( w->x() + dx, w->y() + dy ); + s->updateGeometry(); + updateChildSelections( w ); + } +} + +CommandHistory *FormWindow::commandHistory() +{ + return &commands; +} + +void FormWindow::undo() +{ + commandHistory()->undo(); +} + +void FormWindow::redo() +{ + commandHistory()->redo(); +} + +void FormWindow::raiseChildSelections( TQWidget *w ) +{ + TQObjectList *l = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( !l || !l->first() ) { + delete l; + return; + } + + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) { + if ( l->findRef( TQT_TQOBJECT(it.current()->widget()) ) != -1 ) + it.current()->show(); + } + delete l; +} + +void FormWindow::updateChildSelections( TQWidget *w ) +{ + TQObjectList *l = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( l ) { + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( o->isWidgetType() && + insertedWidgets.find( (TQWidget*)o ) ) + updateSelection( (TQWidget*)o ); + } + delete l; + } +} + +void FormWindow::checkSelectionsForMove( TQWidget *w ) +{ + checkedSelectionsForMove = TRUE; + + TQObjectList *l = w->parentWidget()->queryList( TQWIDGET_OBJECT_NAME_STRING, 0, FALSE, FALSE ); + moving.clear(); + if ( l ) { + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + WidgetSelection *sel; + while ( ( sel = it.current() ) != 0 ) { + if ( it.current()->widget() == mainContainer() ) + continue; + ++it; + if ( l->find( TQT_TQOBJECT(sel->widget()) ) == -1 ) { + if ( WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout ) + sel->setWidget( 0 ); + } else { + if ( WidgetFactory::layoutType( sel->widget()->parentWidget() ) == WidgetFactory::NoLayout ) { + moving.insert( sel->widget(), sel->widget()->pos() ); + sel->widget()->raise(); + raiseChildSelections( sel->widget() ); + raiseSelection( sel->widget() ); + } + } + } + delete l; + } +} + +void FormWindow::deleteWidgets() +{ + CHECK_MAINWINDOW; + TQWidgetList widgets; + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) { + TQWidget *tb = 0; + if ( !( tb = mainWindow()->isAToolBarChild( TQT_TQOBJECT(it.current()->widget()) ) ) ) + widgets.append( it.current()->widget() ); + else + ( (QDesignerToolBar*)tb )->removeWidget( it.current()->widget() ); + } + + if ( widgets.isEmpty() ) + return; + + DeleteCommand *cmd = new DeleteCommand( i18n( "Delete" ), this, widgets ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::editAdjustSize() +{ + TQPtrList<Command> commands; + TQWidgetList widgets = selectedWidgets(); + if ( widgets.isEmpty() ) { + TQRect oldr = geometry(); + mainContainer()->adjustSize(); + resize( mainContainer()->size() ); + // check whether our own size constraint hit us + if ( size() != mainContainer()->size() ) + mainContainer()->resize( size() ); + TQRect nr = geometry(); + if ( oldr != nr ) { + ResizeCommand *cmd = new ResizeCommand( i18n( "Adjust Size" ), this, this, oldr, nr ); + commandHistory()->addCommand( cmd ); + } + return; + } + for ( TQWidget* w = widgets.first(); w; w = widgets.next() ) { + if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) + continue; + TQRect oldr = w->geometry(); + w->adjustSize(); + TQRect nr = w->geometry(); + if ( oldr != nr ) + commands.append( new ResizeCommand( i18n("Adjust Size"), this, w, oldr, nr ) ); + } + + if ( commands.isEmpty() ) + return; + for ( WidgetSelection *s = selections.first(); s; s = selections.next() ) + s->updateGeometry(); + + MacroCommand *cmd = new MacroCommand( i18n( "Adjust Size" ), this, commands ); + commandHistory()->addCommand( cmd ); +} + + +TQWidgetList FormWindow::selectedWidgets() const +{ + TQWidgetList widgets; + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) + widgets.append( it.current()->widget() ); + return widgets; +} + +void FormWindow::widgetChanged( TQObject *w ) +{ + if ( w->isWidgetType() ) + updateSelection( (TQWidget*)w ); + // ########## do TQObject stuff +} + +TQLabel *FormWindow::sizePreview() const +{ + if ( !sizePreviewLabel ) { + ( (FormWindow*)this )->sizePreviewLabel = new TQLabel( (FormWindow*)this ); + ( (FormWindow*)this )->sizePreviewLabel->hide(); + ( (FormWindow*)this )->sizePreviewLabel->setBackgroundColor( TQColor( 255, 255, 128 ) ); + ( (FormWindow*)this )->sizePreviewLabel->setFrameStyle( TQFrame::Plain | TQFrame::Box ); + } + return sizePreviewLabel; +} + +void FormWindow::invalidCheckedSelections() +{ + checkedSelectionsForMove = FALSE; +} + +void FormWindow::checkPreviewGeometry( TQRect &r ) +{ + if ( !TQT_TQRECT_OBJECT(rect()).contains( r ) ) { + if ( r.left() < rect().left() ) + r.moveTopLeft( TQPoint( 0, r.top() ) ); + if ( r.right() > rect().right() ) + r.moveBottomRight( TQPoint( rect().right(), r.bottom() ) ); + if ( r.top() < rect().top() ) + r.moveTopLeft( TQPoint( r.left(), rect().top() ) ); + if ( r.bottom() > rect().bottom() ) + r.moveBottomRight( TQPoint( r.right(), rect().bottom() ) ); + } +} + +void FormWindow::focusInEvent( TQFocusEvent * ){ + + if (ff) + ff->checkTimeStamp(); +} + +void FormWindow::focusOutEvent( TQFocusEvent * ) +{ + if ( propertyWidget && !isMainContainer( propertyWidget ) && !isWidgetSelected( propertyWidget ) ) { + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(mainContainer()); + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + } +} + +void FormWindow::resizeEvent( TQResizeEvent *e ) +{ + TQWidget::resizeEvent( e ); + if ( currTool == ORDER_TOOL ) + repositionOrderIndicators(); + if ( isVisible() ) + formFile()->setModified( TRUE, FormFile::WFormWindow ); + +#if defined(TQ_WS_WIN32) + windowsRepaintWorkaroundTimer->start( 100, TRUE ); +#endif +} + +void FormWindow::windowsRepaintWorkaroundTimerTimeout() +{ +#if defined(TQ_WS_WIN32) + TQObjectList *l = queryList( TQWIDGET_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) { + flickerfree_update( (TQWidget*)o ); + } + flickerfree_update( this ); + delete l; +#endif +} + +TQPtrDict<TQWidget> *FormWindow::widgets() +{ + return &insertedWidgets; +} + +TQWidget *FormWindow::designerWidget( TQObject *o ) const +{ + if ( !o || !o->isWidgetType() ) + return 0; + TQWidget *w = (TQWidget*)o; + while ( w && !isMainContainer( TQT_TQOBJECT(w) ) && !insertedWidgets[ (void*)w ] || isCentralWidget( TQT_TQOBJECT(w) ) ) + w = (TQWidget*)w->parent(); + return w; +} + +void FormWindow::emitShowProperties( TQObject *w ) +{ + if ( w ) { + TQObject *opw = propertyWidget; + propertyWidget = w; + if ( opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + } + showPropertiesTimer->stop(); +// showPropertiesTimer->start( 0, TRUE ); + showPropertiesTimerDone(); +} + +void FormWindow::emitUpdateProperties( TQObject *w ) +{ + if ( w == propertyWidget ) { + updatePropertiesTimer->stop(); + updatePropertiesTimer->start( 0, TRUE ); + } +} + +void FormWindow::emitSelectionChanged() +{ + selectionChangedTimer->stop(); + selectionChangedTimer->start( 0, TRUE ); +} + +void FormWindow::updatePropertiesTimerDone() +{ + CHECK_MAINWINDOW; + if ( propertyWidget && mainWindow()->formWindow() == this ) + emit updateProperties( propertyWidget ); +} + +void FormWindow::showPropertiesTimerDone() +{ + CHECK_MAINWINDOW; + if ( propertyWidget && mainWindow()->formWindow() == this ) + emit showProperties( propertyWidget ); +} + +void FormWindow::selectionChangedTimerDone() +{ + emit selectionChanged(); +} + +void FormWindow::currentToolChanged() +{ + CHECK_MAINWINDOW; + toolFixed = FALSE; + int t = mainwindow->currentTool(); + if ( currTool == t && t != ORDER_TOOL ) + return; + + // tool cleanup + switch ( currTool ) { + case ORDER_TOOL: + hideOrderIndicators(); + break; + case CONNECT_TOOL: + case BUDDY_TOOL: + restoreConnectionLine(); + if ( startWidget ) + restoreRect( TQRect( mapToForm( ( (TQWidget*)startWidget )->parentWidget(), + ( (TQWidget*)startWidget )->pos() ), + ( (TQWidget*)startWidget )->size() ) ); + if ( endWidget ) + restoreRect( TQRect( mapToForm( ( (TQWidget*)endWidget )->parentWidget(), + ( (TQWidget*)endWidget )->pos() ), + ( (TQWidget*)endWidget )->size() ) ); + endUnclippedPainter(); + break; + case POINTER_TOOL: + break; + default: + if ( insertParent ) + endRectDraw(); + break; + } + + startWidget = endWidget = 0; + widgetPressed = FALSE; + drawRubber = FALSE; + insertParent = 0; + delete buffer; + buffer = 0; + + currTool = t; + + if ( hasFocus() ) + clearSelection( FALSE ); + + mainWindow()->statusBar()->clear(); + + // tool setup + switch ( currTool ) { + case POINTER_TOOL: + if ( propertyWidget && !isMainContainer( propertyWidget ) && !isWidgetSelected( propertyWidget ) ) + emitShowProperties( TQT_TQOBJECT(mainContainer()) ); + restoreCursors( this, this ); + break; + case ORDER_TOOL: + if ( mainWindow()->formWindow() == this ) { + mainWindow()->statusMessage( i18n( "Click widgets to change the tab order...") ); + orderedWidgets.clear(); + showOrderIndicators(); + if ( mainWindow()->formWindow() == this ) + emitShowProperties( TQT_TQOBJECT(mainContainer()) ); + setCursorToAll( ArrowCursor, this ); + } + break; + case CONNECT_TOOL: + case BUDDY_TOOL: + if ( currTool == CONNECT_TOOL ) + mainWindow()->statusMessage( i18n( "Drag a line to create a connection...") ); + else + mainWindow()->statusMessage( i18n( "Drag a line to set a buddy...") ); + setCursorToAll( CrossCursor, this ); + if ( mainWindow()->formWindow() == this ) + emitShowProperties( TQT_TQOBJECT(mainContainer()) ); + break; + default: + mainWindow()->statusMessage( i18n( "Click on the form to insert a %1..." ).arg( WidgetDatabase::toolTip( currTool ).lower() ) ); + setCursorToAll( CrossCursor, this ); + if ( mainWindow()->formWindow() == this ) + emitShowProperties( TQT_TQOBJECT(mainContainer()) ); + break; + } +} + +void FormWindow::showOrderIndicators() +{ + hideOrderIndicators(); + orderIndicators.setAutoDelete( TRUE ); + TQObjectList *l = mainContainer()->queryList( TQWIDGET_OBJECT_NAME_STRING ); + stackedWidgets = MetaDataBase::tabOrder( this ); + if ( l ) { + int order = 1; + for ( TQObject *o = l->first(); o; o = l->next() ) { + TQWidget* w = (TQWidget*) o; + if ( w->isShown() && + insertedWidgets[ (void*)w ] && + w->focusPolicy() != TQ_NoFocus ) { + OrderIndicator* ind = new OrderIndicator( order++, w, this ); + orderIndicators.append( ind ); + if ( stackedWidgets.findRef( w ) == -1 ) + stackedWidgets.append( w ); + } + } + delete l; + } + updateOrderIndicators(); +} + +void FormWindow::hideOrderIndicators() +{ + orderIndicators.clear(); +} + +void FormWindow::updateOrderIndicators() +{ + int order = 1; + for ( TQWidget *w = stackedWidgets.first(); w; w = stackedWidgets.next() ) { + for ( OrderIndicator* i = orderIndicators.first(); i; i = orderIndicators.next() ) + i->setOrder( order, w ); + order++; + } +} + +void FormWindow::repositionOrderIndicators() +{ + for ( OrderIndicator* i = orderIndicators.first(); i; i = orderIndicators.next() ) + i->reposition(); +} + + +void FormWindow::updateUndoInfo() +{ + commandHistory()->emitUndoRedo(); +} + +bool FormWindow::checkCustomWidgets() +{ + TQStringList missingCustomWidgets; + TQPtrDictIterator<TQWidget> it( insertedWidgets ); + for ( ; it.current(); ++it ) { + if ( it.current()->isA( "CustomWidget" ) ) { + TQString className = WidgetFactory::classNameOf( TQT_TQOBJECT(it.current()) ); + if ( !MetaDataBase::hasCustomWidget( className ) ) + missingCustomWidgets << className; + } + } + + if ( !missingCustomWidgets.isEmpty() ) { + TQString txt = i18n( "The following custom widgets are used in '%1',\n" + "but are not known to TQt Designer:\n" ).arg( name() ); + for ( TQStringList::Iterator sit = missingCustomWidgets.begin(); sit != missingCustomWidgets.end(); ++sit ) + txt += " " + *sit + "\n"; + txt += i18n( "If you save this form and generate code for it using uic, \n" + "the generated code will not compile.\n" + "Do you want to save this form now?" ); + if ( TQMessageBox::information( mainWindow(), i18n( "Save Form" ), txt ) == 1 ) + return FALSE; + } + return TRUE; +} + +void FormWindow::setPropertyShowingBlocked( bool b ) +{ + propShowBlocked = b; +} + +bool FormWindow::isPropertyShowingBlocked() const +{ + return propShowBlocked; +} + +int FormWindow::numSelectedWidgets() const +{ + return usedSelections.count(); +} + +TQString FormWindow::copy() +{ + CHECK_MAINWINDOW_VALUE( TQString() ); + Resource resource( mainWindow() ); + resource.setWidget( this ); + return resource.copy(); +} + +void FormWindow::lowerWidgets() +{ + TQWidgetList widgets; + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) + widgets.append( it.current()->widget() ); + + LowerCommand *cmd = new LowerCommand( i18n( "Lower" ), this, widgets ); + cmd->execute(); + commandHistory()->addCommand( cmd ); +} + +void find_accel( const TQString &txt, TQMap<TQChar, TQWidgetList > &accels, TQWidget *w ) +{ + int i = txt.find( "&" ); + if ( i == -1 ) + return; + TQChar c = txt[ i + 1 ]; + if ( c.isNull() || c == '&' ) + return; + c = c.lower(); + TQMap<TQChar, TQWidgetList >::Iterator it = accels.find( c ); + if ( it == accels.end() ) { + TQWidgetList wl; + wl.append( w ); + accels.insert( c, wl ); + } else { + TQWidgetList *wl = &*it; + wl->append( w ); + } +} + +void FormWindow::checkAccels() +{ + CHECK_MAINWINDOW; + TQMap<TQChar, TQWidgetList > accels; + TQObjectList *l = mainContainer()->queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( l ) { + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets[ (void*)o ] ) { + TQWidget *w = (TQWidget*)o; + const TQMetaProperty* text = + w->metaObject()->property( w->metaObject()->findProperty( "text", TRUE ), TRUE ); + const TQMetaProperty* title = + w->metaObject()->property( w->metaObject()->findProperty( "title", TRUE ), TRUE ); + const TQMetaProperty* pageTitle = + w->metaObject()->property( w->metaObject()->findProperty( "pageTitle", TRUE ), TRUE ); + if ( text ) + find_accel( w->property( "text" ).toString(), accels, w ); + if ( title ) + find_accel( w->property( "title" ).toString(), accels, w ); + if ( pageTitle ) + find_accel( w->property( "pageTitle" ).toString(), accels, w ); + } else if ( ::tqqt_cast<MenuBarEditor*>(o) ) { + ((MenuBarEditor *)o)->checkAccels( accels ); + } + } + delete l; + } + + bool ok = TRUE; + TQWidget *wid; + for ( TQMap<TQChar, TQWidgetList >::Iterator it = accels.begin(); it != accels.end(); ++it ) { + if ( (*it).count() > 1 ) { + ok = FALSE; + switch ( TQMessageBox::information( mainWindow(), i18n( "Check Accelerators" ), + i18n( "Accelerator '%1' is used once.", "Accelerator '%1' is used %n times.", (*it).count() + ).arg( it.key().upper() ), + i18n( "&Select" ), + i18n( "&Cancel" ), TQString(), 2 ) ) { + case 0: // select + clearSelection( FALSE ); + for ( wid = (*it).first(); wid; wid = (*it).next() ) + selectWidget( TQT_TQOBJECT(wid), TRUE ); + return; + case 1: // cancel + return; + } + } + } + + if ( ok ) + TQMessageBox::information( mainWindow(), i18n( "Check Accelerators" ), + i18n( "No accelerator is used more than once." ) ); +} + +void FormWindow::raiseWidgets() +{ + TQWidgetList widgets; + TQPtrDictIterator<WidgetSelection> it( usedSelections ); + for ( ; it.current(); ++it ) + widgets.append( it.current()->widget() ); + + RaiseCommand *cmd = new RaiseCommand( i18n( "Raise" ), this, widgets ); + cmd->execute(); + commandHistory()->addCommand( cmd ); +} + +void FormWindow::paste( const TQString &cb, TQWidget *parent ) +{ + CHECK_MAINWINDOW; + Resource resource( mainWindow() ); + resource.setWidget( this ); + resource.paste( cb, parent ); +} + +void FormWindow::selectAll() +{ + checkedSelectionsForMove = FALSE; + blockSignals( TRUE ); + TQObjectList *l = mainContainer()->queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( l ) { + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets[ (void*)o ] ) { + selectWidget( TQT_TQOBJECT(o) ); + } + } + delete l; + } + + blockSignals( FALSE ); + emitSelectionChanged(); + if ( propertyWidget ) + emitShowProperties( propertyWidget ); + emitSelectionChanged(); +} + +void FormWindow::layoutHorizontal() +{ + TQWidgetList widgets( selectedWidgets() ); + LayoutHorizontalCommand *cmd = new LayoutHorizontalCommand( i18n( "Lay OutQt::Horizontally" ), + this, mainContainer(), 0, widgets ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutVertical() +{ + TQWidgetList widgets( selectedWidgets() ); + LayoutVerticalCommand *cmd = new LayoutVerticalCommand( i18n( "Lay OutQt::Vertically" ), + this, mainContainer(), 0, widgets ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutHorizontalSplit() +{ + TQWidgetList widgets( selectedWidgets() ); + LayoutHorizontalSplitCommand *cmd = new LayoutHorizontalSplitCommand( i18n( "Lay OutQt::Horizontally (in splitter)" ), + this, mainContainer(), 0, widgets ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutVerticalSplit() +{ + TQWidgetList widgets( selectedWidgets() ); + LayoutVerticalSplitCommand *cmd = new LayoutVerticalSplitCommand( i18n( "Lay OutQt::Vertically (in splitter)" ), + this, mainContainer(), 0, widgets ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutGrid() +{ + int xres = grid().x(); + int yres = grid().y(); + + TQWidgetList widgets( selectedWidgets() ); + LayoutGridCommand *cmd = new LayoutGridCommand( i18n( "Lay Out in a Grid" ), + this, mainContainer(), 0, widgets, xres, yres ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutHorizontalContainer( TQWidget *w ) +{ + if ( w == this ) + w = mainContainer(); + TQObjectList l = WidgetFactory::containerOfWidget(w)->childrenListObject(); + if ( l.isEmpty() ) + return; + TQWidgetList widgets; + for ( TQObject *o = l.first(); o; o = l.next() ) { + if ( o->isWidgetType() && + ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets.find( (TQWidget*)o ) ) + widgets.append( (TQWidget*)o ); + } + LayoutHorizontalCommand *cmd = new LayoutHorizontalCommand( i18n( "Lay Out ChildrenQt::Horizontally" ), + this, mainContainer(), w, widgets ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutVerticalContainer( TQWidget *w ) +{ + if ( w == this ) + w = mainContainer(); + TQObjectList l = WidgetFactory::containerOfWidget(w)->childrenListObject(); + if ( l.isEmpty() ) + return; + TQWidgetList widgets; + for ( TQObject *o = l.first(); o; o = l.next() ) { + if ( o->isWidgetType() && + ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets.find( (TQWidget*)o ) ) + widgets.append( (TQWidget*)o ); + } + LayoutVerticalCommand *cmd = new LayoutVerticalCommand( i18n( "Lay Out ChildrenQt::Vertically" ), + this, mainContainer(), w, widgets ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::layoutGridContainer( TQWidget *w ) +{ + if ( w == this ) + w = mainContainer(); + int xres = grid().x(); + int yres = grid().y(); + + TQObjectList l = WidgetFactory::containerOfWidget(w)->childrenListObject(); + if ( l.isEmpty() ) + return; + TQWidgetList widgets; + for ( TQObject *o = l.first(); o; o = l.next() ) { + if ( o->isWidgetType() && + ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets.find( (TQWidget*)o ) ) + widgets.append( (TQWidget*)o ); + } + LayoutGridCommand *cmd = new LayoutGridCommand( i18n( "Lay Out Children in a Grid" ), + this, mainContainer(), w, widgets, xres, yres ); + clearSelection( FALSE ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void FormWindow::breakLayout( TQWidget *w ) +{ + if ( w == this ) + w = mainContainer(); + w = WidgetFactory::containerOfWidget( w ); + TQPtrList<Command> commands; + + for (;;) { + if ( !w || w == this ) + break; + if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout && + WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) ) { + Command *cmd = breakLayoutCommand( w ); + if ( cmd ) + commands.insert( 0, cmd ); + if ( !::tqqt_cast<TQLayoutWidget*>(w) && !::tqqt_cast<TQSplitter*>(w) ) + break; + } + w = w->parentWidget(); + } + + if ( commands.isEmpty() ) + return; + + clearSelection( FALSE ); + MacroCommand *cmd = new MacroCommand( i18n( "Break Layout" ), this, commands ); + commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +BreakLayoutCommand *FormWindow::breakLayoutCommand( TQWidget *w ) +{ + CHECK_MAINWINDOW_VALUE( 0 ); + TQObjectList l = w->childrenListObject(); + if ( l.isEmpty() ) + return 0; + + TQWidgetList widgets; + for ( TQObject *o = l.first(); o; o = l.next() ) { + if ( o->isWidgetType() && + !mainWindow()->isAToolBarChild( TQT_TQOBJECT(o) ) && + ( (TQWidget*)o )->isVisibleTo( this ) && + insertedWidgets.find( (TQWidget*)o ) ) + widgets.append( (TQWidget*)o ); + } + return new BreakLayoutCommand( i18n( "Break Layout" ), this, WidgetFactory::widgetOfContainer( w ), widgets ); +} + +int FormWindow::numVisibleWidgets() const +{ + TQPtrDictIterator<TQWidget> it( insertedWidgets ); + int visible = 0; + for ( ; it.current(); ++it ) { + if ( it.current()->isVisibleTo( (FormWindow*)this ) ) + visible++; + } + return visible; +} + +bool FormWindow::hasInsertedChildren( TQWidget *w ) const +{ + if ( !w ) + return FALSE; + w = WidgetFactory::containerOfWidget( w ); + if ( !w ) + return FALSE; + TQObjectList *l = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + if ( !l || !l->first() ) { + delete l; + return FALSE; + } + + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( o->isWidgetType() && + ( (TQWidget*)o )->isVisibleTo( (FormWindow*)this ) && + insertedWidgets.find( (TQWidget*)o ) ) { + delete l; + return TRUE; + } + } + + delete l; + return FALSE; +} + +bool FormWindow::allowMove( TQWidget *w ) +{ + w = w->parentWidget(); + while ( w ) { + if ( ( isMainContainer( TQT_TQOBJECT(w) ) || insertedWidgets.find( w ) ) && WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout ) + return TRUE; + w = w->parentWidget(); + } + return FALSE; +} + + +void FormWindow::editConnections() +{ + CHECK_MAINWINDOW; + buffer = 0; + if ( !startWidget || !endWidget ) + return; + + ConnectionDialog dlg( mainwindow ); + mainWindow()->statusMessage( i18n( "Edit connections...") ); + dlg.addConnection( TQT_TQOBJECT(startWidget), TQT_TQOBJECT(endWidget), TQString(), TQString() ); + TQTimer::singleShot( 0, &dlg, TQT_SLOT(ensureConnectionVisible()) ); + dlg.exec(); +} + +void FormWindow::saveBackground() +{ + if ( buffer ) + delete buffer; + buffer = new TQPixmap( width(), height() ); + *buffer = TQPixmap::grabWindow( winId() ); +} + +void FormWindow::restoreConnectionLine() +{ + if (!unclippedPainter || !buffer) // designer will occasionally crash if buffer is not tested to be non-zero + return; + + int a =TQABS( startPos.x() - currentPos.x() ); + int b = TQABS( startPos.y() - currentPos.y() ); + TQRect r( startPos, currentPos ); + + if ( a < 32 || b < 32 ) { // special case: vertical or horizontal line + r = r.normalize(); + unclippedPainter->drawPixmap( r.x() - 2, r.y() - 2, *buffer, + r.x() - 2, r.y() - 2, r.width() + 4, r.height() + 4 ); + return; + } + + if ( a <= 0 ) + a = 1; + if ( b <= 0 ) + b = 1; + int w, h; + if ( b > a ) { + h = 64; + w = ( a * h ) / b; + } else { + w = 64; + h = ( b * w ) / a; + } + + int dx = 2 * w / 3; + int dy = 2 * h / 3; + TQPoint p( startPos ); + + if ( r.x() > r.right() ) { + dx = dx * -1; + p.setX( p.x() - 64 ); + r.moveBy( -64, 0 ); + } + if ( r.y() > r.bottom() ) { + dy = dy * -1; + p.setY( p.y() - 64 ); + r.moveBy( 0, -64 ); + } + + w = h = 64; + r = r.normalize(); + while ( r.contains( p ) ) { + unclippedPainter->drawPixmap( p, *buffer, TQRect( p, TQSize( w, h ) ) ); + unclippedPainter->setPen( red ); + p.setX( p.x() + dx ); + p.setY( p.y() + dy ); + } + + unclippedPainter->drawPixmap( startPos.x() - 10, startPos.y() - 10, *buffer, + startPos.x() - 10, startPos.y() - 10, 20, 20 ); +} + +void FormWindow::restoreRect( const TQRect &rect ) +{ + if (!unclippedPainter || !buffer) + return; + + TQRect r( rect ); + r = r.normalize(); + + r = TQRect( r.x() + 2, r.y() + 2, r.width() - 4, r.height() - 4 ); + + unclippedPainter->drawPixmap( r.x() - 2, r.y() - 2, *buffer, r.x() - 2, r.y() - 2, r.width() + 4, 4 ); + unclippedPainter->drawPixmap( r.x() - 2, r.y() - 2, *buffer, r.x() - 2, r.y() - 2, 4, r.height() + 4 ); + unclippedPainter->drawPixmap( r.x() - 2, r.y() + r.height() - 3, *buffer, r.x() - 2, r.y() + r.height() - 3, r.width() + 4, 5 ); + unclippedPainter->drawPixmap( r.x() + r.width() - 2, r.y(), *buffer, r.x() + r.width() - 2, r.y(), 4, r.height() + 4 ); +} + +void FormWindow::drawConnectionLine() +{ + if ( !unclippedPainter ) + return; + + unclippedPainter->setPen( TQPen( white, 2 ) ); + unclippedPainter->drawLine( startPos, currentPos ); + if ( validForBuddy ) + unclippedPainter->setPen( TQPen( darkRed, 1 ) ); + else + unclippedPainter->setPen( TQPen( darkCyan, 1 ) ); + unclippedPainter->drawLine( startPos, currentPos ); + + if ( validForBuddy ) + unclippedPainter->setPen( TQPen( darkGreen, 1 ) ); + else + unclippedPainter->setPen( TQPen( magenta, 1 ) ); + if ( startWidget ) { + TQWidget *s = (TQWidget*)startWidget; + TQPoint p = mapToForm( s, TQPoint(0,0) ); + unclippedPainter->drawRect( TQRect( p + TQPoint( 2, 2 ), s->size() - TQSize( 4, 4 ) ) ); + } + if ( endWidget ) { + TQWidget *e = (TQWidget*)endWidget; + TQPoint p = mapToForm( e, TQPoint(0,0) ); + unclippedPainter->drawRect( TQRect( p + TQPoint( 2, 2 ), e->size() - TQSize( 4, 4 ) ) ); + } +} + +TQString FormWindow::fileName() const +{ + return ff->absFileName(); +} + +void FormWindow::setFileName( const TQString &fn ) +{ + ff->setFileName( fn ); + emit fileNameChanged( ff->fileName(), this ); +} + +void FormWindow::modificationChanged( bool m ) +{ + emit modificationChanged( m, this ); + emit modificationChanged( m, ff->fileName() ); +} + +bool FormWindow::unify( TQObject *w, TQString &s, bool changeIt ) +{ + bool found = !isMainContainer( w ) && qstrcmp( name(), s.latin1() ) == 0; + if ( !found ) { + TQString orig = s; + int num = 1; + TQPtrDictIterator<TQWidget> it( insertedWidgets ); + for ( ; it.current();) { + if ( TQT_BASE_OBJECT(it.current()) != TQT_BASE_OBJECT(w) && + qstrcmp( it.current()->name(), s.latin1() ) == 0 ) { + found = TRUE; + if ( !changeIt ) + break; + s = orig + "_" + TQString::number( ++num ); + it.toFirst(); + } else { + ++it; + } + } + if ( !found ) { + TQPtrList<TQAction> al; + TQAction *a = 0; + for ( a = actions.first(); a; a = actions.next() ) { + TQObjectList *l = a->queryList( TQACTION_OBJECT_NAME_STRING ); + al.append( a ); + for ( TQObject *ao = l->first(); ao; ao = l->next() ) + al.append( (TQAction*)ao ); + delete l; + } + for ( a = al.first(); a; a = al.next() ) { + if ( a != w && + qstrcmp( a->name(), s.latin1() ) == 0 ) { + found = TRUE; + if ( !changeIt ) + break; + s = orig + "_" + TQString::number( ++num ); + a = actions.first(); + } + } + } + if ( ::tqqt_cast<TQMainWindow*>(mainContainer()) && !found ) { + TQObjectList *l = mainContainer()->queryList( "PopupMenuEditor" ); + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( o != w && + qstrcmp ( o->name(), s.latin1() ) == 0 ) { + found = TRUE; + if ( !changeIt ) + break; + s = orig + "_" + TQString::number( ++num ); + o = l->first(); + } + } + delete l; + } + if ( ::tqqt_cast<TQMainWindow*>(mainContainer()) ) { + if ( !found ) { + TQObjectList *l = mainContainer()->queryList( TQDOCKWINDOW_OBJECT_NAME_STRING, 0, TRUE ); + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( o != w && + qstrcmp( o->name(), s.latin1() ) == 0 ) { + found = TRUE; + if ( !changeIt ) + break; + s = orig + "_" + TQString::number( ++num ); + o = l->first(); + } + } + delete l; + } + } + } + + if ( !found ) + return TRUE; + return FALSE; +} + +bool FormWindow::isCustomWidgetUsed( MetaDataBase::CustomWidget *w ) +{ + TQPtrDictIterator<TQWidget> it( insertedWidgets ); + for ( ; it.current(); ++it ) { + if ( it.current()->isA( "CustomWidget" ) ) { + if ( qstrcmp( WidgetFactory::classNameOf( TQT_TQOBJECT(it.current()) ), w->className.utf8() ) == 0 ) + return TRUE; + } + } + + return FALSE; +} + +bool FormWindow::isDatabaseWidgetUsed() const +{ +#ifndef TQT_NO_SQL + TQStringList dbClasses; + dbClasses << TQDATATABLE_OBJECT_NAME_STRING; // add more here + TQPtrDictIterator<TQWidget> it( insertedWidgets ); + for ( ; it.current(); ++it ) { + TQString c( it.current()->className() ); + if ( dbClasses.contains( c ) > 0 ) { + return TRUE; + } + } +#endif + return FALSE; +} + +bool FormWindow::isDatabaseAware() const +{ +#ifndef TQT_NO_SQL + if ( TQString(mContainer->className()) == "QDesignerDataBrowser" || TQString(mContainer->className()) == "QDesignerDataView" ) + return TRUE; + return isDatabaseWidgetUsed(); +#else + return FALSE; +#endif +} + +void FormWindow::visibilityChanged() +{ + if ( currTool != ORDER_TOOL ) { + emitUpdateProperties( TQT_TQOBJECT(currentWidget()) ); + } else { + updateOrderIndicators(); + repositionOrderIndicators(); + } +} + + +/*! + Maps \a pos in \a w's coordinates to the form's coordinate system. + + This is the equivalent to mapFromGlobal(w->mapToGlobal(pos) ) but + avoids the two roundtrips to the X-Server on Unix/X11. + */ +TQPoint FormWindow::mapToForm( const TQWidget* w, const TQPoint& pos ) const +{ + TQPoint p = pos; + const TQWidget* i = w; + while ( i && !i->isTopLevel() && !isMainContainer( TQT_TQOBJECT(const_cast<TQWidget*>(i)) ) ) { + p = i->mapToParent( p ); + i = i->parentWidget(); + } + return mapFromGlobal( w->mapToGlobal( pos ) ); +} + +static int widgetDepth( TQWidget *w ) +{ + int d = -1; + while ( w && !w->isTopLevel() ) { + d++; + w = w->parentWidget(); + } + + return d; +} + +static bool isChildOf( TQWidget *c, TQWidget *p ) +{ + while ( c && !c->isTopLevel() ) { + if ( c == p ) + return TRUE; + c = c->parentWidget(); + } + return FALSE; +} + +TQWidget *FormWindow::containerAt( const TQPoint &pos, TQWidget *notParentOf ) +{ + TQPtrDictIterator<TQWidget> it( insertedWidgets ); + TQWidget *container = 0; + int depth = -1; + TQWidgetList selected = selectedWidgets(); + if ( TQT_TQRECT_OBJECT(rect()).contains( mapFromGlobal( pos ) ) ) { + container = mainContainer(); + depth = widgetDepth( container ); + } + + for ( ; it.current(); ++it ) { + if ( ::tqqt_cast<TQLayoutWidget*>(it.current()) + || ::tqqt_cast<TQSplitter*>(it.current()) ) + continue; + if ( !it.current()->isVisibleTo( this ) ) + continue; + if ( selected.find( it.current() ) != -1 ) + continue; + if ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(it.current()) ) ) ) && + it.current() != mainContainer() ) + continue; + + // the rectangles of all ancestors of the container must contain the insert position + TQWidget *w = it.current(); + while ( w && !w->isTopLevel() ) { + if ( !TQT_TQRECT_OBJECT(w->rect()).contains( ( w->mapFromGlobal( pos ) ) ) ) + break; + w = w->parentWidget(); + } + if ( !( w == 0 || w->isTopLevel() ) ) continue; // we did not get through the full while loop + + int wd = widgetDepth( it.current() ); + if ( wd == depth && container ) { + if ( ( it.current()->parentWidget()->childrenListObject() ).find( TQT_TQOBJECT(it.current()) ) > + ( container->parentWidget()->childrenListObject() ).find( TQT_TQOBJECT(container) ) ) + wd++; + } + if ( wd > depth && !isChildOf( it.current(), notParentOf ) ) { + depth = wd; + container = it.current(); + } + } + + return container; +} + +bool FormWindow::isMainContainer( TQObject *w ) const +{ + return w && w->isWidgetType() && ( TQT_BASE_OBJECT(w) == this || TQT_BASE_OBJECT(w) == mainContainer() ); +} + +void FormWindow::setMainContainer( TQWidget *w ) +{ + bool resetPropertyWidget = isMainContainer( propertyWidget ); + if ( mContainer ) + insertedWidgets.remove( mContainer ); + if ( TQT_BASE_OBJECT(propertyWidget) == TQT_BASE_OBJECT(mContainer) ) + propertyWidget = 0; + delete mContainer; + mContainer = w; + insertedWidgets.insert( mContainer, mContainer ); + delete layout(); + TQHBoxLayout *l = new TQHBoxLayout( this ); + l->addWidget( w ); + if ( resetPropertyWidget ) { + TQObject *opw = propertyWidget; + propertyWidget = TQT_TQOBJECT(mContainer); + if ( opw && opw->isWidgetType() ) + repaintSelection( (TQWidget*)opw ); + } + if ( project() ) { + LanguageInterface *iface = MetaDataBase::languageInterface( project()->language() ); + if ( iface && !project()->isCpp() && !isFake() ) { + if ( !MetaDataBase::hasFunction( TQT_TQOBJECT(this), "init()" ) ) + MetaDataBase::addFunction( TQT_TQOBJECT(this), "init()", "", "private", "function", + project()->language(), "void" ); + if ( !MetaDataBase::hasFunction( TQT_TQOBJECT(this), "destroy()" ) ) + MetaDataBase::addFunction( TQT_TQOBJECT(this), "destroy()", "", "private", "function", + project()->language(), "void" ); + if ( !MetaDataBase::hasConnection( TQT_TQOBJECT(this), TQT_TQOBJECT(mainContainer()), "shown()", TQT_TQOBJECT(mainContainer()), "init" ) ) + MetaDataBase::addConnection( TQT_TQOBJECT(this), TQT_TQOBJECT(mainContainer()), "shown()", TQT_TQOBJECT(mainContainer()), "init" ); + if ( !MetaDataBase::hasConnection( TQT_TQOBJECT(this), TQT_TQOBJECT(mainContainer()), "destroyed()", TQT_TQOBJECT(mainContainer()), "destroy" ) ) + MetaDataBase::addConnection( TQT_TQOBJECT(this), TQT_TQOBJECT(mainContainer()), "destroyed()", + TQT_TQOBJECT(mainContainer()), "destroy" ); + } + } +} + +bool FormWindow::savePixmapInline() const +{ + return pixInline; +} + +bool FormWindow::savePixmapInProject() const +{ + return pixProject; +} + +TQString FormWindow::pixmapLoaderFunction() const +{ + return pixLoader; +} + +void FormWindow::setSavePixmapInline( bool b ) +{ + pixInline = b; + if ( b ) + pixProject = FALSE; +} + +void FormWindow::setSavePixmapInProject( bool b ) +{ + pixProject = b; + if ( b ) + pixInline = FALSE; +} + +void FormWindow::setPixmapLoaderFunction( const TQString &func ) +{ + pixLoader = func; +} + +void FormWindow::setActiveObject( TQObject *o ) +{ + emitShowProperties( o ); + propertyWidget = o; +} + +void FormWindow::setProject( Project *pro ) +{ + proj = pro; +} + +Project *FormWindow::project() const +{ + return proj; +} + +TQAction *FormWindow::findAction( const TQString &name ) +{ + for ( TQAction *a = actionList().first(); a; a = actionList().next() ) { + if ( TQString( a->name() ) == name ) + return a; + TQAction *ac = (TQAction*)a->child( name.latin1(), TQACTION_OBJECT_NAME_STRING ); + if ( ac ) + return ac; + } + return 0; +} + +void FormWindow::killAccels( TQObject *top ) +{ + TQObjectList *l = top->queryList( TQACCEL_OBJECT_NAME_STRING ); + if ( !l ) + return; + for ( TQObject *o = l->first(); o; o = l->next() ) + ( (TQAccel*)o )->setEnabled( FALSE ); + delete l; +} + +DesignerFormWindow *FormWindow::iFace() +{ + if ( !iface ) + iface = new DesignerFormWindowImpl( this ); + return iface; +} + +bool FormWindow::isCentralWidget( TQObject *w ) const +{ + if ( !::tqqt_cast<TQMainWindow*>(mainContainer()) ) + return FALSE; + return TQT_BASE_OBJECT(w) == TQT_BASE_OBJECT(( (TQMainWindow*)mainContainer() )->centralWidget()); +} + +int FormWindow::layoutDefaultSpacing() const +{ + return defSpacing; +} + +int FormWindow::layoutDefaultMargin() const +{ + return defMargin; +} + +void FormWindow::setLayoutDefaultSpacing( int s ) +{ + defSpacing = s; +} + +void FormWindow::setLayoutDefaultMargin( int s ) +{ + defMargin = s; +} + +void FormWindow::setSpacingFunction( const TQString &funct ) +{ + spacFunction = funct; +} + +TQString FormWindow::spacingFunction() const +{ + return spacFunction; +} + +void FormWindow::hasLayoutFunctions( bool b ) +{ + hasLayoutFunc = b; +} + +bool FormWindow::hasLayoutFunctions() const +{ + return hasLayoutFunc; +} + +void FormWindow::setMarginFunction( const TQString &funct ) +{ + margFunction = funct; +} + +TQString FormWindow::marginFunction() const +{ + return margFunction; +} + +FormFile *FormWindow::formFile() const +{ + return ff; +} + +void FormWindow::setFormFile( FormFile *f ) +{ + ff = f; + if ( ff ) + connect( this, TQT_SIGNAL( modificationChanged(bool, const TQString&) ), ff, TQT_SLOT( formWindowChangedSomehow() ) ); +} + +bool FormWindow::canBeBuddy( const TQWidget *w ) const +{ + return w->focusPolicy() != TQ_NoFocus; +} + +bool FormWindow::event( TQEvent *e ) +{ + if (e->type() == TQEvent::ShowMaximized) + { + if ( isMaximized() ) + setWindowState( windowState() & ~WindowMaximized | WindowActive); + return true; + } + return TQWidget::event(e); +} diff --git a/kdevdesigner/designer/formwindow.h b/kdevdesigner/designer/formwindow.h new file mode 100644 index 00000000..d4295e7e --- /dev/null +++ b/kdevdesigner/designer/formwindow.h @@ -0,0 +1,323 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef FORMWINDOW_H +#define FORMWINDOW_H + +#include "command.h" +#include "metadatabase.h" +#include "sizehandle.h" +#include "actiondnd.h" + +#include <tqwidget.h> +#include <tqptrdict.h> +#include <tqpixmap.h> +#include <tqwidgetlist.h> +#include <tqmap.h> + +class TQPaintEvent; +class TQMouseEvent; +class TQKeyEvent; +class TQPainter; +class TQLabel; +class MainWindow; +class TQTimer; +class TQFocusEvent; +class TQCloseEvent; +class Resource; +class TQResizeEvent; +class BreakLayoutCommand; +class TQPixmap; +class TQSizeGrip; +class Project; +struct DesignerFormWindow; +class FormFile; + +#if defined(TQ_CC_MSVC) || defined(TQ_FULL_TEMPLATE_INSTANTIATION) +#include "orderindicator.h" +#else +class OrderIndicator; +#endif + +class FormWindow : public TQWidget +{ + Q_OBJECT + + TQ_PROPERTY( TQString fileName READ fileName WRITE setFileName ) + +public: + FormWindow( FormFile *f, MainWindow *mw, TQWidget *parent, const char *name = 0 ); + FormWindow( FormFile *f, TQWidget *parent, const char *name = 0 ); + ~FormWindow(); + + void init(); + virtual void setMainWindow( MainWindow *w ); + + virtual TQString fileName() const; + virtual void setFileName( const TQString &fn ); + + virtual TQPoint grid() const; + virtual TQPoint gridPoint( const TQPoint &p ); + + virtual CommandHistory *commandHistory(); + + virtual void undo(); + virtual void redo(); + virtual TQString copy(); + virtual void paste( const TQString &cb, TQWidget *parent ); + virtual void lowerWidgets(); + virtual void raiseWidgets(); + virtual void checkAccels(); + + virtual void layoutHorizontal(); + virtual void layoutVertical(); + virtual void layoutHorizontalSplit(); + virtual void layoutVerticalSplit(); + virtual void layoutGrid(); + + virtual void layoutHorizontalContainer( TQWidget *w ); + virtual void layoutVerticalContainer( TQWidget *w ); + virtual void layoutGridContainer( TQWidget *w ); + + virtual void breakLayout( TQWidget *w ); + + virtual void selectWidget( TQObject *w, bool select = TRUE ); + virtual void selectAll(); + virtual void updateSelection( TQWidget *w ); + virtual void raiseSelection( TQWidget *w ); + virtual void repaintSelection( TQWidget *w ); + virtual void clearSelection( bool changePropertyDisplay = TRUE ); + virtual void selectWidgets(); + bool isWidgetSelected( TQObject *w ); + virtual void updateChildSelections( TQWidget *w ); + virtual void raiseChildSelections( TQWidget *w ); + + virtual void emitUpdateProperties( TQObject *w ); + virtual void emitShowProperties( TQObject *w = 0 ); + virtual void emitSelectionChanged(); + + virtual void setPropertyShowingBlocked( bool b ); + bool isPropertyShowingBlocked() const; + + virtual TQLabel *sizePreview() const; + virtual void checkPreviewGeometry( TQRect &r ); + + virtual TQPtrDict<TQWidget> *widgets(); + virtual TQWidgetList selectedWidgets() const; + + virtual TQWidget *designerWidget( TQObject *o ) const; + + virtual void handleContextMenu( TQContextMenuEvent *e, TQWidget *w ); + virtual void handleMousePress( TQMouseEvent *e, TQWidget *w ); + virtual void handleMouseRelease( TQMouseEvent *e, TQWidget *w ); + virtual void handleMouseDblClick( TQMouseEvent *e, TQWidget *w ); + virtual void handleMouseMove( TQMouseEvent *e, TQWidget *w ); + virtual void handleKeyPress( TQKeyEvent *e, TQWidget *w ); + virtual void handleKeyRelease( TQKeyEvent *e, TQWidget *w ); + + virtual void updateUndoInfo(); + + virtual MainWindow *mainWindow() const { return mainwindow; } + + bool checkCustomWidgets(); + virtual void insertWidget( TQWidget *w, bool checkName = FALSE ); + virtual void removeWidget( TQWidget *w ); + virtual void deleteWidgets(); + virtual void editAdjustSize(); + virtual void editConnections(); + + virtual int numSelectedWidgets() const; + virtual int numVisibleWidgets() const; + + virtual bool hasInsertedChildren( TQWidget *w ) const; + + virtual TQWidget *currentWidget() const { return propertyWidget && propertyWidget->isWidgetType() ? (TQWidget*)propertyWidget : 0; } // ##### + virtual bool unify( TQObject *w, TQString &s, bool changeIt ); + + virtual bool isCustomWidgetUsed( MetaDataBase::CustomWidget *w ); + virtual bool isDatabaseWidgetUsed() const; + virtual bool isDatabaseAware() const; + + virtual TQPoint mapToForm( const TQWidget* w, const TQPoint& ) const; + + bool isMainContainer( TQObject *w ) const; + bool isCentralWidget( TQObject *w ) const; + TQWidget *mainContainer() const { return mContainer; } + void setMainContainer( TQWidget *w ); + + void paintGrid( TQWidget *w, TQPaintEvent *e ); + + bool savePixmapInline() const; + TQString pixmapLoaderFunction() const; + void setSavePixmapInline( bool b ); + void setPixmapLoaderFunction( const TQString &func ); + + bool savePixmapInProject() const; + void setSavePixmapInProject( bool b ); + + void setToolFixed() { toolFixed = TRUE; } + + void setActiveObject( TQObject *o ); + + TQPtrList<TQAction> &actionList() { return actions; } + TQAction *findAction( const TQString &name ); + + void setProject( Project *pro ); + Project *project() const; + + void killAccels( TQObject *top ); + + DesignerFormWindow *iFace(); + + int layoutDefaultSpacing() const; + int layoutDefaultMargin() const; + void setLayoutDefaultSpacing( int s ); + void setLayoutDefaultMargin( int s ); + TQString spacingFunction() const; + TQString marginFunction() const; + void setSpacingFunction( const TQString &func ); + void setMarginFunction( const TQString &func ); + bool hasLayoutFunctions() const; + void hasLayoutFunctions( bool b ); + + void initSlots(); + FormFile *formFile() const; + void setFormFile( FormFile *f ); + + bool isFake() const { return fake; } + bool canBeBuddy( const TQWidget* ) const; + +public slots: + virtual void widgetChanged( TQObject *w ); + virtual void currentToolChanged(); + virtual void visibilityChanged(); + virtual void modificationChanged( bool m ); + +signals: + void showProperties( TQObject *w ); + void updateProperties( TQObject *w ); + void undoRedoChanged( bool undoAvailable, bool redoAvailable, + const TQString &undoCmd, const TQString &redoCmd ); + void selectionChanged(); + void modificationChanged( bool m, FormWindow *fw ); + void modificationChanged( bool m, const TQString &s ); + void fileNameChanged( const TQString &s, FormWindow *fw ); + +protected: + virtual void closeEvent( TQCloseEvent *e ); + virtual void focusInEvent( TQFocusEvent *e ); + virtual void focusOutEvent( TQFocusEvent *e ); + virtual void resizeEvent( TQResizeEvent *e ); + void mouseDoubleClickEvent( TQMouseEvent *e ) { handleMouseDblClick( e, mainContainer() ); } + virtual bool event( TQEvent *e ); + +private: + enum RectType { Insert, Rubber }; + + void beginUnclippedPainter( bool doNot ); + void endUnclippedPainter(); + void drawConnectionLine(); + void drawSizePreview( const TQPoint &pos, const TQString& text ); + + void insertWidget(); + void moveSelectedWidgets( int dx, int dy ); + + void startRectDraw( const TQPoint &p, const TQPoint &global, TQWidget *w, RectType t ); + void continueRectDraw( const TQPoint &p, const TQPoint &global, TQWidget *w, RectType t ); + void endRectDraw(); + + void checkSelectionsForMove( TQWidget *w ); + BreakLayoutCommand *breakLayoutCommand( TQWidget *w ); + + bool allowMove( TQWidget *w ); + + void saveBackground(); + void restoreConnectionLine(); + void restoreRect( const TQRect &rect ) ; + + void showOrderIndicators(); + void updateOrderIndicators(); + void repositionOrderIndicators(); + void hideOrderIndicators(); + + TQWidget *containerAt( const TQPoint &pos, TQWidget *notParentOf ); + +private slots: + void invalidCheckedSelections(); + void updatePropertiesTimerDone(); + void showPropertiesTimerDone(); + void selectionChangedTimerDone(); + void windowsRepaintWorkaroundTimerTimeout(); + +private: + int currTool; + bool oldRectValid, widgetPressed, drawRubber, checkedSelectionsForMove; + bool validForBuddy; + TQRect currRect; + TQPoint rectAnchor; + TQPainter *unclippedPainter; + TQPoint sizePreviewPos; + TQPixmap sizePreviewPixmap; + MainWindow *mainwindow; + TQPtrList<WidgetSelection> selections; + TQPtrDict<WidgetSelection> usedSelections; + TQRect widgetGeom, rubber; + TQPoint oldPressPos, origPressPos; + CommandHistory commands; + TQMap<TQWidget*, TQPoint> moving; + TQWidget *insertParent; + TQObject *propertyWidget; + TQLabel *sizePreviewLabel; + TQTimer *checkSelectionsTimer; + TQPtrDict<TQWidget> insertedWidgets; + bool propShowBlocked; + TQTimer* updatePropertiesTimer, *showPropertiesTimer, *selectionChangedTimer, + *windowsRepaintWorkaroundTimer; + TQPoint startPos, currentPos; + TQWidget *startWidget, *endWidget; + TQPixmap *buffer; + TQPtrList<OrderIndicator> orderIndicators; + TQWidgetList orderedWidgets; + TQWidgetList stackedWidgets; + TQWidget *mContainer; + bool pixInline, pixProject; + TQString pixLoader; + bool toolFixed; + TQPtrList<TQAction> actions; + Project *proj; + DesignerFormWindow *iface; + TQWidget* targetContainer; + TQPalette restorePalette; + bool hadOwnPalette; + int defSpacing, defMargin; + TQString spacFunction, margFunction; + bool hasLayoutFunc; + FormFile *ff; + bool fake; + +}; + +#endif diff --git a/kdevdesigner/designer/gotolinedialog.ui b/kdevdesigner/designer/gotolinedialog.ui new file mode 100644 index 00000000..99df35d2 --- /dev/null +++ b/kdevdesigner/designer/gotolinedialog.ui @@ -0,0 +1,169 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>GotoLineDialog</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<include location="local" impldecl="in implementation">../interfaces/editorinterface.h</include> +<include location="local" implDecl="in declaration">gotolinedialog.ui.h</include> +<forward>struct EditorInterface;</forward> +<variable>EditorInterface *editor;</variable> +<layoutdefaults spacing="6" margin="11"/> +<widget class="TQDialog"> + <property name="name"> + <cstring>GotoLineDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>243</width> + <height>85</height> + </rect> + </property> + <property name="caption"> + <string>Goto Line</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>&Line:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>spinLine</cstring> + </property> + </widget> + <widget class="TQSpinBox" row="0" column="1"> + <property name="name"> + <cstring>spinLine</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + </widget> + <widget class="TQLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Goto</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + </widget> + </hbox> + </widget> + <spacer row="1" column="1"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection language="C++"> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>GotoLineDialog</receiver> + <slot>reject()</slot> + </connection> + <connection language="C++"> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>GotoLineDialog</receiver> + <slot>gotoLine()</slot> + </connection> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> + <slot access="public" language="C++" returnType="void">gotoLine()</slot> + <slot access="public" language="C++" returnType="void">setEditor( EditorInterface * e )</slot> +</connections> +</UI> diff --git a/kdevdesigner/designer/gotolinedialog.ui.h b/kdevdesigner/designer/gotolinedialog.ui.h new file mode 100644 index 00000000..4ddf4114 --- /dev/null +++ b/kdevdesigner/designer/gotolinedialog.ui.h @@ -0,0 +1,50 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +void GotoLineDialog::init() +{ + editor = 0; +} + +void GotoLineDialog::destroy() +{ + if ( editor ) + editor->release(); +} + +void GotoLineDialog::gotoLine() +{ + if ( editor ) + editor->gotoLine( spinLine->value() - 1 ); + accept(); +} + +void GotoLineDialog::setEditor( EditorInterface *e ) +{ + editor = e; + editor->addRef(); +} + diff --git a/kdevdesigner/designer/hierarchyview.cpp b/kdevdesigner/designer/hierarchyview.cpp new file mode 100644 index 00000000..c6433cd0 --- /dev/null +++ b/kdevdesigner/designer/hierarchyview.cpp @@ -0,0 +1,1508 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "hierarchyview.h" +#include "formwindow.h" +#include "globaldefs.h" +#include "mainwindow.h" +#include "command.h" +#include "widgetfactory.h" +#include "widgetdatabase.h" +#include "project.h" +#include "sourceeditor.h" +#include "propertyeditor.h" +#include "editfunctionsimpl.h" +#include "listeditor.h" +#include "actiondnd.h" +#include "actioneditorimpl.h" +#include "variabledialogimpl.h" +#include "popupmenueditor.h" +#include "menubareditor.h" + +#include <kiconloader.h> +#include "kdevdesigner_part.h" +#include <tdelocale.h> + +#include <tqpalette.h> +#include <tqobjectlist.h> +#include <tqheader.h> +#include <tqpopupmenu.h> +#include <tqtabwidget.h> +#include <tqwizard.h> +#include <tqwidgetstack.h> +#include <tqtabbar.h> +#include <tqfeatures.h> +#include <tqapplication.h> +#include <tqtimer.h> +#include "../interfaces/languageinterface.h" +#include <tqworkspace.h> +#include <tqaccel.h> +#include <tqmessagebox.h> + +#include <stdlib.h> + +TQListViewItem *newItem = 0; + +static TQPluginManager<ClassBrowserInterface> *classBrowserInterfaceManager = 0; + +HierarchyItem::HierarchyItem( Type type, TQListViewItem *parent, TQListViewItem *after, + const TQString &txt1, const TQString &txt2, const TQString &txt3 ) + : TQListViewItem( parent, after, txt1, txt2, txt3 ), typ( type ) +{ +} + +HierarchyItem::HierarchyItem( Type type, TQListView *parent, TQListViewItem *after, + const TQString &txt1, const TQString &txt2, const TQString &txt3 ) + : TQListViewItem( parent, after, txt1, txt2, txt3 ), typ( type ) +{ +} + +void HierarchyItem::paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align ) +{ + TQColorGroup g( cg ); + g.setColor( TQColorGroup::Base, backgroundColor() ); + g.setColor( TQColorGroup::Foreground, TQt::black ); + g.setColor( TQColorGroup::Text, TQt::black ); + TQString txt = text( 0 ); + if ( rtti() == Function && + MainWindow::self->currProject()->isCpp() && + ( txt == "init()" || txt == "destroy()" ) ) { + listView()->setUpdatesEnabled( FALSE ); + if ( txt == "init()" ) + setText( 0, txt + " " + "(Constructor)" ); + else + setText( 0, txt + " " + "(Destructor)" ); + TQListViewItem::paintCell( p, g, column, width, align ); + setText( 0, txt ); + listView()->setUpdatesEnabled( TRUE ); + } else { + TQListViewItem::paintCell( p, g, column, width, align ); + } + p->save(); + p->setPen( TQPen( cg.dark(), 1 ) ); + if ( column == 0 ) + p->drawLine( 0, 0, 0, height() - 1 ); + if ( listView()->firstChild() != this ) { + if ( nextSibling() != itemBelow() && itemBelow()->depth() < depth() ) { + int d = depth() - itemBelow()->depth(); + p->drawLine( -listView()->treeStepSize() * d, height() - 1, 0, height() - 1 ); + } + } + p->drawLine( 0, height() - 1, width, height() - 1 ); + p->drawLine( width - 1, 0, width - 1, height() ); + p->restore(); +} + +TQColor HierarchyItem::backgroundColor() +{ + updateBackColor(); + return backColor; +} + +void HierarchyItem::updateBackColor() +{ + if ( listView()->firstChild() == this ) { + backColor = *backColor1; + return; + } + + TQListViewItemIterator it( this ); + --it; + if ( it.current() ) { + if ( ( ( HierarchyItem*)it.current() )->backColor == *backColor1 ) + backColor = *backColor2; + else + backColor = *backColor1; + } else { + backColor = *backColor1; + } +} + +void HierarchyItem::setObject( TQObject *o ) +{ + obj = o; +} + +TQObject *HierarchyItem::object() const +{ + return obj; +} + +void HierarchyItem::okRename( int col ) +{ + if ( newItem == this ) + newItem = 0; + TQListViewItem::okRename( col ); +} + +void HierarchyItem::cancelRename( int col ) +{ + if ( newItem == this ) { + newItem = 0; + TQListViewItem::cancelRename( col ); + delete this; + return; + } + TQListViewItem::cancelRename( col ); +} + + + + +HierarchyList::HierarchyList( TQWidget *parent, FormWindow *fw, bool doConnects ) + : TQListView( parent ), formWindow( fw ) +{ + DesignerFormPix = SmallIcon( "designer_form.png" , KDevDesignerPartFactory::instance()); + DesignerLayoutPix = SmallIcon( "designer_layout.png" , KDevDesignerPartFactory::instance()); + DesignerFolderPix = SmallIcon( "designer_folder.png" , KDevDesignerPartFactory::instance()); + DesignerEditSlotsPix = SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()); + + init_colors(); + + setDefaultRenameAction( Accept ); + header()->setMovingEnabled( FALSE ); + header()->setStretchEnabled( TRUE ); + normalMenu = 0; + tabWidgetMenu = 0; + addColumn( i18n( "Name" ) ); + addColumn( i18n( "Class" ) ); + TQPalette p( palette() ); + p.setColor( TQColorGroup::Base, TQColor( *backColor2 ) ); + (void)*selectedBack; // hack + setPalette( p ); + disconnect( header(), TQT_SIGNAL( sectionClicked( int ) ), + this, TQT_SLOT( changeSortColumn( int ) ) ); + setSorting( -1 ); + setHScrollBarMode( AlwaysOff ); + setVScrollBarMode( AlwaysOn ); + if ( doConnects ) { + connect( this, TQT_SIGNAL( clicked( TQListViewItem * ) ), + this, TQT_SLOT( objectClicked( TQListViewItem * ) ) ); + connect( this, TQT_SIGNAL( doubleClicked( TQListViewItem * ) ), + this, TQT_SLOT( objectDoubleClicked( TQListViewItem * ) ) ); + connect( this, TQT_SIGNAL( returnPressed( TQListViewItem * ) ), + this, TQT_SLOT( objectClicked( TQListViewItem * ) ) ); + connect( this, TQT_SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint&, int ) ), + this, TQT_SLOT( showRMBMenu( TQListViewItem *, const TQPoint & ) ) ); + } + deselect = TRUE; + setColumnWidthMode( 1, Manual ); +} + +void HierarchyList::keyPressEvent( TQKeyEvent *e ) +{ + if ( e->key() == Key_Shift || e->key() == Key_Control ) + deselect = FALSE; + else + deselect = TRUE; + TQListView::keyPressEvent( e ); +} + +void HierarchyList::keyReleaseEvent( TQKeyEvent *e ) +{ + deselect = TRUE; + TQListView::keyReleaseEvent( e ); +} + +void HierarchyList::viewportMousePressEvent( TQMouseEvent *e ) +{ + if ( e->state() & ShiftButton || e->state() & ControlButton ) + deselect = FALSE; + else + deselect = TRUE; + TQListView::viewportMousePressEvent( e ); +} + +void HierarchyList::viewportMouseReleaseEvent( TQMouseEvent *e ) +{ + TQListView::viewportMouseReleaseEvent( e ); +} + +TQObject *HierarchyList::handleObjectClick( TQListViewItem *i ) +{ + if ( !i ) + return 0; + + TQObject *o = findObject( i ); + if ( !o ) + return 0; + if ( TQT_BASE_OBJECT(formWindow) == TQT_BASE_OBJECT(o) ) { + if ( deselect ) + formWindow->clearSelection( FALSE ); + formWindow->emitShowProperties( TQT_TQOBJECT(formWindow) ); + return 0; + } + if ( o->isWidgetType() ) { + TQWidget *w = (TQWidget*)o; + if ( !formWindow->widgets()->find( w ) ) { + if ( ::tqqt_cast<TQWidgetStack*>(w->parent()) ) { + if (::tqqt_cast<TQTabWidget*>(w->parent()->parent()) ) { + ((TQTabWidget*)w->parent()->parent())->showPage( w ); + o = TQT_TQOBJECT((TQWidget*)w->parent()->parent()); + formWindow->emitUpdateProperties( TQT_TQOBJECT(formWindow->currentWidget()) ); + } else if ( ::tqqt_cast<TQWizard*>(w->parent()->parent()) ) { + ((QDesignerWizard*)w->parent()->parent())-> + setCurrentPage( ( (QDesignerWizard*)w->parent()->parent() )->pageNum( w ) ); + o = TQT_TQOBJECT((TQWidget*)w->parent()->parent()); + formWindow->emitUpdateProperties( TQT_TQOBJECT(formWindow->currentWidget()) ); + } else { + ( (TQWidgetStack*)w->parent() )->raiseWidget( w ); + if ( (TQWidgetStack*)w->parent()->isA( "QDesignerWidgetStack" ) ) + ( (QDesignerWidgetStack*)w->parent() )->updateButtons(); + } + } else if ( ::tqqt_cast<TQMenuBar*>(w) || ::tqqt_cast<TQDockWindow*>(w) ) { + formWindow->setActiveObject( TQT_TQOBJECT(w) ); + } else if ( ::tqqt_cast<TQPopupMenu*>(w) ) { + return 0; // ### we could try to find our menu bar and change the currentMenu to our index + } else { + return 0; + } + } + } else if ( ::tqqt_cast<TQAction*>(o) ) { + MainWindow::self->actioneditor()->setCurrentAction( (TQAction*)o ); + deselect = TRUE; + } + + if ( deselect ) + formWindow->clearSelection( FALSE ); + + return o; +} + + +void HierarchyList::objectDoubleClicked( TQListViewItem *i ) +{ + TQObject *o = handleObjectClick( i ); + if ( !o ) + return; + if ( o->isWidgetType() && ( (TQWidget*)o )->isVisibleTo( formWindow ) ) { + TQWidget *w = (TQWidget*)o; + if ( !w->parentWidget() || + WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) + w->raise(); + formWindow->selectWidget( TQT_TQOBJECT(w), TRUE ); + } +} + +void HierarchyList::objectClicked( TQListViewItem *i ) +{ + TQObject *o = handleObjectClick( i ); + if ( !o ) + return; + if ( o->isWidgetType() && ( (TQWidget*)o )->isVisibleTo( formWindow ) ) { + TQWidget *w = (TQWidget*)o; + formWindow->selectWidget( TQT_TQOBJECT(w), TRUE ); + } +} + +TQObject *HierarchyList::findObject( TQListViewItem *i ) +{ + return ( (HierarchyItem*)i )->object(); +} + +TQListViewItem *HierarchyList::findItem( TQObject *o ) +{ + TQListViewItemIterator it( this ); + while ( it.current() ) { + if ( ( (HierarchyItem*)it.current() )->object() == o ) + return it.current(); + ++it; + } + return 0; +} + +TQObject *HierarchyList::current() const +{ + if ( currentItem() ) + return ( (HierarchyItem*)currentItem() )->object(); + return 0; +} + +void HierarchyList::changeNameOf( TQObject *o, const TQString &name ) +{ + TQListViewItem *item = findItem( o ); + if ( !item ) + return; + item->setText( 0, name ); +} + + +void HierarchyList::changeDatabaseOf( TQObject *o, const TQString &info ) +{ +#ifndef TQT_NO_SQL + if ( !formWindow->isDatabaseAware() ) + return; + TQListViewItem *item = findItem( o ); + if ( !item ) + return; + item->setText( 2, info ); +#endif +} + +static TQPtrList<TQWidgetStack> *widgetStacks = 0; + +void HierarchyList::setup() +{ + if ( !formWindow || formWindow->isFake() ) + return; + clear(); + TQWidget *w = formWindow->mainContainer(); +#ifndef TQT_NO_SQL + if ( formWindow->isDatabaseAware() ) { + if ( columns() == 2 ) { + addColumn( i18n( "Database" ) ); + header()->resizeSection( 0, 1 ); + header()->resizeSection( 1, 1 ); + header()->resizeSection( 2, 1 ); + header()->adjustHeaderSize(); + } + } else { + if ( columns() == 3 ) { + removeColumn( 2 ); + } + } +#endif + if ( !widgetStacks ) + widgetStacks = new TQPtrList<TQWidgetStack>; + if ( w ) + insertObject( TQT_TQOBJECT(w), 0 ); + widgetStacks->clear(); +} + +void HierarchyList::setOpen( TQListViewItem *i, bool b ) +{ + TQListView::setOpen( i, b ); +} + +void HierarchyList::insertObject( TQObject *o, TQListViewItem *parent ) +{ + if ( TQString( o->name() ).startsWith( "qt_dead_widget_" ) ) + return; + bool fakeMainWindow = FALSE; + if ( ::tqqt_cast<TQMainWindow*>(o) ) { + TQObject *cw = TQT_TQOBJECT(( (TQMainWindow*)o )->centralWidget()); + if ( cw ) { + o = cw; + fakeMainWindow = TRUE; + } + } + TQListViewItem *item = 0; + TQString className = WidgetFactory::classNameOf( o ); + if ( ::tqqt_cast<TQLayoutWidget*>(o) ) { + switch ( WidgetFactory::layoutType( (TQWidget*)o ) ) { + case WidgetFactory::HBox: + className = "HBox"; + break; + case WidgetFactory::VBox: + className = "VBox"; + break; + case WidgetFactory::Grid: + className = "Grid"; + break; + default: + break; + } + } + + TQString dbInfo; +#ifndef TQT_NO_SQL + dbInfo = MetaDataBase::fakeProperty( o, "database" ).toStringList().join("."); +#endif + + TQString name = o->name(); + if ( ::tqqt_cast<TQWidgetStack*>(o->parent()) ) { + if ( ::tqqt_cast<TQTabWidget*>(o->parent()->parent()) ) + name = ( (TQTabWidget*)o->parent()->parent() )->tabLabel( (TQWidget*)o ); + else if ( ::tqqt_cast<TQWizard*>(o->parent()->parent()) ) + name = ( (TQWizard*)o->parent()->parent() )->title( (TQWidget*)o ); + } + + TQToolBox *tb; + if ( o->parent() && o->parent()->parent() && + (tb = ::tqqt_cast<TQToolBox*>(o->parent()->parent()->parent())) ) + name = tb->itemLabel( tb->indexOf((TQWidget*)o) ); + + if ( fakeMainWindow ) { + name = o->parent()->name(); + className = TQMAINWINDOW_OBJECT_NAME_STRING; + } + + if ( !parent ) + item = new HierarchyItem( HierarchyItem::Widget, this, 0, name, className, dbInfo ); + else + item = new HierarchyItem( HierarchyItem::Widget, parent, 0, name, className, dbInfo ); + item->setOpen( TRUE ); + if ( !parent ) + item->setPixmap( 0, DesignerFormPix ); + else if ( ::tqqt_cast<TQLayoutWidget*>(o) ) + item->setPixmap( 0, DesignerLayoutPix ); + else + item->setPixmap( 0, WidgetDatabase::iconSet( + WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( o ) ) ). + pixmap( TQIconSet::Small, TQIconSet::Normal ) ); + if ( ::tqqt_cast<TQAction*>(o) ) + item->setPixmap( 0, ( (TQAction*)o )->iconSet().pixmap() ); + + ( (HierarchyItem*)item )->setObject( o ); + TQObjectList l = o->childrenListObject(); + if ( ::tqqt_cast<QDesignerToolBar*>(o) ) + l.clear(); + if ( !l.isEmpty() ) { + TQObjectListIt it( l ); + it.toLast(); + for ( ; it.current(); --it ) { + if ( !it.current()->isWidgetType() || + ( (TQWidget*)it.current() )->isHidden() ) + continue; + if ( !formWindow->widgets()->find( (TQWidget*)it.current() ) ) { + if ( ::tqqt_cast<TQWidgetStack*>(it.current()->parent()) || + ::tqqt_cast<TQWidgetStack*>(it.current()) ) { + TQObject *obj = it.current(); + QDesignerTabWidget *tw = ::tqqt_cast<QDesignerTabWidget*>(it.current()->parent()); + QDesignerWizard *dw = ::tqqt_cast<QDesignerWizard*>(it.current()->parent()); + TQWidgetStack *stack = 0; + if ( dw || tw || ::tqqt_cast<TQWidgetStack*>(obj) ) + stack = (TQWidgetStack*)obj; + else + stack = (TQWidgetStack*)obj->parent(); + if ( widgetStacks->findRef( stack ) != -1 ) + continue; + widgetStacks->append( stack ); + TQObjectList *l2 = stack->queryList( TQWIDGET_OBJECT_NAME_STRING, 0, TRUE, FALSE ); + for ( obj = l2->last(); obj; obj = l2->prev() ) { + if ( qstrcmp( obj->className(), + "TQWidgetStackPrivate::Invisible" ) == 0 || + ( tw && !tw->tabBar()->tab( stack->id( (TQWidget*)obj ) ) ) || + ( dw && dw->isPageRemoved( (TQWidget*)obj ) ) ) + continue; + if ( qstrcmp( obj->name(), "designer_wizardstack_button" ) == 0 ) + continue; + if ( stack->id( (TQWidget*)obj ) == -1 ) + continue; + insertObject( obj, item ); + } + delete l2; + } else if ( ::tqqt_cast<TQToolBox*>(it.current()->parent()) ) { + if ( !::tqqt_cast<TQScrollView*>(it.current()) ) + continue; + TQToolBox *tb = (TQToolBox*)it.current()->parent(); + for ( int i = tb->count() - 1; i >= 0; --i ) + insertObject( TQT_TQOBJECT(tb->item( i )), item ); + } + continue; + } + insertObject( it.current(), item ); + } + } + + if ( fakeMainWindow ) { + TQObjectList *l = o->parent()->queryList( "QDesignerToolBar" ); + TQObject *obj; + for ( obj = l->first(); obj; obj = l->next() ) + insertObject( obj, item ); + delete l; + l = o->parent()->queryList( "MenuBarEditor" ); + for ( obj = l->first(); obj; obj = l->next() ) + insertObject( obj, item ); + delete l; + } else if ( ::tqqt_cast<QDesignerToolBar*>(o) || ::tqqt_cast<PopupMenuEditor*>(o) ) { + TQPtrList<TQAction> actions; + if ( ::tqqt_cast<QDesignerToolBar*>(o) ) + actions = ( (QDesignerToolBar*)o )->insertedActions(); + else + ( (PopupMenuEditor*)o )->insertedActions( actions ); + + TQPtrListIterator<TQAction> it( actions ); + it.toLast(); + while ( it.current() ) { + TQAction *a = it.current(); + if ( ::tqqt_cast<QDesignerAction*>(a) ) { + QDesignerAction *da = (QDesignerAction*)a; + if ( da->supportsMenu() ) + insertObject( da, item ); + else + insertObject( TQT_TQOBJECT(da->widget()), item ); + } else if ( ::tqqt_cast<QDesignerActionGroup*>(a) ) { + insertObject( a, item ); + } + --it; + } + } else if ( ::tqqt_cast<QDesignerActionGroup*>(o) && !o->childrenListObject().isEmpty() ) { + TQObjectList l = o->childrenListObject(); + for ( TQObject *obj = l.last(); obj; obj = l.prev() ) { + if ( ::tqqt_cast<QDesignerAction*>(obj) ) { + QDesignerAction *da = (QDesignerAction*)obj; + if ( da->supportsMenu() ) + insertObject( da, item ); + else + insertObject( TQT_TQOBJECT(da->widget()), item ); + } else if ( ::tqqt_cast<QDesignerActionGroup*>(obj) ) { + insertObject( obj, item ); + } + } + } else if ( ::tqqt_cast<MenuBarEditor*>(o) ) { + MenuBarEditor *mb = (MenuBarEditor*)o; + for ( int i = mb->count() -1; i >= 0; --i ) { + MenuBarEditorItem *md = mb->item( i ); + if ( !md || !md->menu() ) + continue; + insertObject( TQT_TQOBJECT(md->menu()), item ); + } + } +} + +void HierarchyList::setCurrent( TQObject *o ) +{ + TQListViewItemIterator it( this ); + while ( it.current() ) { + if ( ( (HierarchyItem*)it.current() )->object() == o ) { + blockSignals( TRUE ); + setCurrentItem( it.current() ); + ensureItemVisible( it.current() ); + blockSignals( FALSE ); + return; + } + ++it; + } +} + +void HierarchyList::showRMBMenu( TQListViewItem *i, const TQPoint & p ) +{ + if ( !i ) + return; + + TQObject *o = findObject( i ); + if ( !o ) + return; + + if ( !o->isWidgetType() || + ( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(formWindow) && !formWindow->widgets()->find( (TQWidget*)o ) ) ) + return; + + TQWidget *w = (TQWidget*)o; + if ( w->isVisibleTo( formWindow ) ) { + if ( !::tqqt_cast<TQTabWidget*>(w) && !::tqqt_cast<TQWizard*>(w) ) { + if ( !normalMenu ) + normalMenu = formWindow->mainWindow()->setupNormalHierarchyMenu( this ); + normalMenu->popup( p ); + } else { + if ( !tabWidgetMenu ) + tabWidgetMenu = + formWindow->mainWindow()->setupTabWidgetHierarchyMenu( + this, TQT_SLOT( addTabPage() ), + TQT_SLOT( removeTabPage() ) ); + tabWidgetMenu->popup( p ); + } + } +} + +void HierarchyList::addTabPage() +{ + TQObject *o = current(); + if ( !o || !o->isWidgetType() ) + return; + TQWidget *w = (TQWidget*)o; + if ( ::tqqt_cast<TQTabWidget*>(w) ) { + TQTabWidget *tw = (TQTabWidget*)w; + AddTabPageCommand *cmd = new AddTabPageCommand( i18n( "Add Page to %1" ). + arg( tw->name() ), formWindow, + tw, "Tab" ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( ::tqqt_cast<TQWizard*>(w) ) { + TQWizard *wiz = (TQWizard*)formWindow->mainContainer(); + AddWizardPageCommand *cmd = new AddWizardPageCommand( i18n( "Add Page to %1" ). + arg( wiz->name() ), formWindow, + wiz, "Page" ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +void HierarchyList::removeTabPage() +{ + TQObject *o = current(); + if ( !o || !o->isWidgetType() ) + return; + TQWidget *w = (TQWidget*)o; + if ( ::tqqt_cast<TQTabWidget*>(w) ) { + TQTabWidget *tw = (TQTabWidget*)w; + if ( tw->currentPage() ) { + QDesignerTabWidget *dtw = (QDesignerTabWidget*)tw; + DeleteTabPageCommand *cmd = + new DeleteTabPageCommand( i18n( "Delete Page %1 of %2" ). + arg( dtw->pageTitle() ).arg( tw->name() ), + formWindow, tw, tw->currentPage() ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } else if ( ::tqqt_cast<TQWizard*>(w) ) { + TQWizard *wiz = (TQWizard*)formWindow->mainContainer(); + if ( wiz->currentPage() ) { + QDesignerWizard *dw = (QDesignerWizard*)wiz; + DeleteWizardPageCommand *cmd = + new DeleteWizardPageCommand( i18n( "Delete Page %1 of %2" ). + arg( dw->pageTitle() ).arg( wiz->name() ), + formWindow, wiz, + wiz->indexOf( wiz->currentPage() ), TRUE ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } +} + +// ------------------------------------------------------------ + +FormDefinitionView::FormDefinitionView( TQWidget *parent, FormWindow *fw ) + : HierarchyList( parent, fw, TRUE ) +{ + header()->hide(); + removeColumn( 1 ); + connect( this, TQT_SIGNAL( itemRenamed( TQListViewItem *, int, const TQString & ) ), + this, TQT_SLOT( renamed( TQListViewItem * ) ) ); + popupOpen = FALSE; +} + +void FormDefinitionView::setup() +{ + if ( popupOpen || !formWindow ) + return; + if ( !formWindow->project()->isCpp() ) + return; + TQListViewItem *i = firstChild(); + while ( i ) { + if ( i->rtti() == HierarchyItem::DefinitionParent ) { + TQListViewItem *a = i; + i = i->nextSibling(); + delete a; + continue; + } + i = i->nextSibling(); + } + + LanguageInterface *lIface = MetaDataBase::languageInterface( formWindow->project()->language() ); + if ( lIface ) { + TQStringList defs = lIface->definitions(); + for ( TQStringList::Iterator dit = defs.begin(); dit != defs.end(); ++dit ) { + HierarchyItem *itemDef = new HierarchyItem( HierarchyItem::DefinitionParent, this, 0, + i18n( *dit ), TQString(), TQString() ); + itemDef->setPixmap( 0, DesignerFolderPix ); + itemDef->setOpen( TRUE ); + TQStringList entries = + lIface->definitionEntries( *dit, formWindow->mainWindow()->designerInterface() ); + HierarchyItem *item = 0; + for ( TQStringList::Iterator eit = entries.begin(); eit != entries.end(); ++eit ) { + item = new HierarchyItem( HierarchyItem::Definition, + itemDef, item, *eit, TQString(), TQString() ); + item->setRenameEnabled( 0, TRUE ); + } + } + lIface->release(); + } + setupVariables(); + refresh(); +} + +void FormDefinitionView::setupVariables() +{ + bool pubOpen, protOpen, privOpen; + pubOpen = protOpen = privOpen = TRUE; + TQListViewItem *i = firstChild(); + while ( i ) { + if ( i->rtti() == HierarchyItem::VarParent ) { + TQListViewItem *a = i; + i = i->firstChild(); + while ( i ) { + if ( i->rtti() == HierarchyItem::VarPublic ) + pubOpen = i->isOpen(); + else if ( i->rtti() == HierarchyItem::VarProtected ) + protOpen = i->isOpen(); + else if ( i->rtti() == HierarchyItem::VarPrivate ) + privOpen = i->isOpen(); + i = i->nextSibling(); + } + delete a; + break; + } + i = i->nextSibling(); + } + + HierarchyItem *itemVar = new HierarchyItem( HierarchyItem::VarParent, this, 0, i18n( "Class Variables" ), + TQString(), TQString() ); + itemVar->setPixmap( 0, DesignerFolderPix ); + itemVar->setOpen( TRUE ); + + itemVarPriv = new HierarchyItem( HierarchyItem::VarPrivate, itemVar, 0, i18n( "private" ), + TQString(), TQString() ); + itemVarProt = new HierarchyItem( HierarchyItem::VarProtected, itemVar, 0, i18n( "protected" ), + TQString(), TQString() ); + itemVarPubl = new HierarchyItem( HierarchyItem::VarPublic, itemVar, 0, i18n( "public" ), + TQString(), TQString() ); + + TQValueList<MetaDataBase::Variable> varList = MetaDataBase::variables( TQT_TQOBJECT(formWindow) ); + TQValueList<MetaDataBase::Variable>::Iterator it = --( varList.end() ); + if ( !varList.isEmpty() && itemVar ) { + for (;;) { + TQListViewItem *item = 0; + if ( (*it).varAccess == "public" ) + item = new HierarchyItem( HierarchyItem::Variable, itemVarPubl, 0, (*it).varName, + TQString(), TQString() ); + else if ( (*it).varAccess == "private" ) + item = new HierarchyItem( HierarchyItem::Variable, itemVarPriv, 0, (*it).varName, + TQString(), TQString() ); + else // default is protected + item = new HierarchyItem( HierarchyItem::Variable, itemVarProt, 0, (*it).varName, + TQString(), TQString() ); + item->setPixmap( 0, DesignerEditSlotsPix ); + if ( it == varList.begin() ) + break; + --it; + } + } + itemVar->setOpen( TRUE ); + itemVarPriv->setOpen( privOpen ); + itemVarProt->setOpen( protOpen ); + itemVarPubl->setOpen( pubOpen ); +} + +void FormDefinitionView::refresh() +{ + if ( popupOpen || !formWindow || !formWindow->project()->isCpp() ) + return; + + bool fuPub, fuProt, fuPriv, slPub, slProt, slPriv; + fuPub = fuProt = fuPriv = slPub = slProt = slPriv = TRUE; + TQListViewItem *i = firstChild(); + while ( i ) { + if ( i->rtti() == HierarchyItem::SlotParent || + i->rtti() == HierarchyItem::FunctParent ) { + TQListViewItem *a = i; + i = i->firstChild(); + while ( i ) { + switch( i->rtti() ) { + case HierarchyItem::FunctPublic: + fuPub = i->isOpen(); + case HierarchyItem::FunctProtected: + fuProt = i->isOpen(); + break; + case HierarchyItem::FunctPrivate: + fuPriv = i->isOpen(); + break; + case HierarchyItem::SlotPublic: + slPub = i->isOpen(); + if ( slPub ) + break; + case HierarchyItem::SlotProtected: + slProt = i->isOpen(); + break; + case HierarchyItem::SlotPrivate: + slPriv = i->isOpen(); + } + i = i->nextSibling(); + } + i = a->nextSibling(); + delete a; + continue; + } + i = i->nextSibling(); + } + + + itemFunct = new HierarchyItem( HierarchyItem::FunctParent, + this, 0, i18n( "Functions" ), TQString(), TQString() ); + itemFunct->moveItem( i ); + itemFunct->setPixmap( 0, DesignerFolderPix ); + itemFunctPriv = new HierarchyItem( HierarchyItem::FunctPrivate, itemFunct, 0, + i18n( "private" ), TQString(), TQString() ); + itemFunctProt = new HierarchyItem( HierarchyItem::FunctProtected, itemFunct, 0, + i18n( "protected" ), TQString(), TQString() ); + itemFunctPubl = new HierarchyItem( HierarchyItem::FunctPublic, itemFunct, 0, + i18n( "public" ), TQString(), TQString() ); + + itemSlots = new HierarchyItem( HierarchyItem::SlotParent, + this, 0, i18n( "Slots" ), TQString(), TQString() ); + itemSlots->setPixmap( 0, DesignerFolderPix ); + itemPrivate = new HierarchyItem( HierarchyItem::SlotPrivate, itemSlots, 0, i18n( "private" ), + TQString(), TQString() ); + itemProtected = new HierarchyItem( HierarchyItem::SlotProtected, itemSlots, 0, i18n( "protected" ), + TQString(), TQString() ); + itemPublic = new HierarchyItem( HierarchyItem::SlotPublic, itemSlots, 0, i18n( "public" ), + TQString(), TQString() ); + + TQValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( TQT_TQOBJECT(formWindow) ); + TQValueList<MetaDataBase::Function>::Iterator it = --( functionList.end() ); + if ( !functionList.isEmpty() && itemFunct ) { + for (;;) { + TQListViewItem *item = 0; + if ( (*it).type == "slot" ) { + if ( (*it).access == "protected" ) + item = new HierarchyItem( HierarchyItem::Slot, itemProtected, 0, (*it).function, + TQString(), TQString() ); + else if ( (*it).access == "private" ) + item = new HierarchyItem( HierarchyItem::Slot, itemPrivate, 0, (*it).function, + TQString(), TQString() ); + else // default is public + item = new HierarchyItem( HierarchyItem::Slot, itemPublic, 0, (*it).function, + TQString(), TQString() ); + } else { + if ( (*it).access == "protected" ) + item = new HierarchyItem( HierarchyItem::Function, itemFunctProt, 0, (*it).function, + TQString(), TQString() ); + else if ( (*it).access == "private" ) + item = new HierarchyItem( HierarchyItem::Function, itemFunctPriv, 0, (*it).function, + TQString(), TQString() ); + else // default is public + item = new HierarchyItem( HierarchyItem::Function, itemFunctPubl, 0, (*it).function, + TQString(), TQString() ); + } + item->setPixmap( 0, DesignerEditSlotsPix ); + if ( it == functionList.begin() ) + break; + --it; + } + } + + itemFunct->setOpen( TRUE ); + itemFunctPubl->setOpen( fuPub ); + itemFunctProt->setOpen( fuProt ); + itemFunctPriv->setOpen( fuPriv ); + + itemSlots->setOpen( TRUE ); + itemPublic->setOpen( slPub ); + itemProtected->setOpen( slProt ); + itemPrivate->setOpen( slPriv ); +} + + +void FormDefinitionView::setCurrent( TQWidget * ) +{ +} + +void FormDefinitionView::objectClicked( TQListViewItem *i ) +{ + if ( !i ) + return; + if ( (i->rtti() == HierarchyItem::Slot) || (i->rtti() == HierarchyItem::Function) ) + { + formWindow->clearSelection(false); + formWindow->mainWindow()->part()->emitEditFunction(formWindow->fileName(), i->text( 0 )); + } +// formWindow->mainWindow()->editFunction( i->text( 0 ) ); +} + +static HierarchyItem::Type getChildType( int type ) +{ + switch ( (HierarchyItem::Type)type ) { + case HierarchyItem::Widget: + tqWarning( "getChildType: Inserting childs dynamically to Widget or SlotParent is not allowed!" ); + break; + case HierarchyItem::SlotParent: + case HierarchyItem::SlotPublic: + case HierarchyItem::SlotProtected: + case HierarchyItem::SlotPrivate: + case HierarchyItem::Slot: + return HierarchyItem::Slot; + case HierarchyItem::DefinitionParent: + case HierarchyItem::Definition: + return HierarchyItem::Definition; + case HierarchyItem::Event: + case HierarchyItem::EventFunction: + return HierarchyItem::Event; + case HierarchyItem::FunctParent: + case HierarchyItem::FunctPublic: + case HierarchyItem::FunctProtected: + case HierarchyItem::FunctPrivate: + case HierarchyItem::Function: + return HierarchyItem::Function; + case HierarchyItem::VarParent: + case HierarchyItem::VarPublic: + case HierarchyItem::VarProtected: + case HierarchyItem::VarPrivate: + case HierarchyItem::Variable: + return HierarchyItem::Variable; + } + return (HierarchyItem::Type)type; +} + +void HierarchyList::insertEntry( TQListViewItem *i, const TQPixmap &pix, const TQString &s ) +{ + TQListViewItem *after = i->firstChild(); + while ( after && after->nextSibling() ) + after = after->nextSibling(); + HierarchyItem *item = new HierarchyItem( getChildType( i->rtti() ), i, after, s, + TQString(), TQString() ); + if ( !pix.isNull() ) + item->setPixmap( 0, pix ); + item->setRenameEnabled( 0, TRUE ); + setCurrentItem( item ); + ensureItemVisible( item ); + tqApp->processEvents(); + newItem = item; + item->startRename( 0 ); +} + +void FormDefinitionView::contentsMouseDoubleClickEvent( TQMouseEvent *e ) +{ + TQListViewItem *i = itemAt( contentsToViewport( e->pos() ) ); + if ( !i ) + return; + + if ( i->rtti() == HierarchyItem::SlotParent || i->rtti() == HierarchyItem::FunctParent || + i->rtti() == HierarchyItem::VarParent ) + return; + + HierarchyItem::Type t = getChildType( i->rtti() ); + if ( (int)t == i->rtti() ) + i = i->parent(); + + if ( formWindow->project()->isCpp() ) + switch( i->rtti() ) { + case HierarchyItem::FunctPublic: + execFunctionDialog( "public", "function", TRUE ); + break; + case HierarchyItem::FunctProtected: + execFunctionDialog( "protected", "function", TRUE ); + break; + case HierarchyItem::FunctPrivate: + execFunctionDialog( "private", "function", TRUE ); + break; + case HierarchyItem::SlotPublic: + execFunctionDialog( "public", "slot", TRUE ); + break; + case HierarchyItem::SlotProtected: + execFunctionDialog( "protected", "slot", TRUE ); + break; + case HierarchyItem::SlotPrivate: + execFunctionDialog( "private", "slot", TRUE ); + break; + case HierarchyItem::VarPublic: + case HierarchyItem::VarProtected: + case HierarchyItem::VarPrivate: { + VariableDialog varDia( formWindow, this ); + TQListViewItem *i = selectedItem(); + if ( i ) + varDia.setCurrentItem( i->text( 0 ) ); + varDia.exec(); + break; + } + default: + insertEntry( i ); + } else + insertEntry( i ); +} + +void FormDefinitionView::execFunctionDialog( const TQString &access, const TQString &type, bool addFunc ) +{ + FormFile *formFile = formWindow->formFile(); + if ( !formFile || !formFile->isUihFileUpToDate() ) + return; + + // refresh the functions list in the metadatabase + SourceEditor *editor = formFile->editor(); + if ( editor ) + editor->refresh( TRUE ); + + EditFunctions dlg( this, formWindow ); + if ( addFunc ) + dlg.functionAdd( access, type ); + dlg.exec(); +} + +void FormDefinitionView::showRMBMenu( TQListViewItem *i, const TQPoint &pos ) +{ + if ( !i ) + return; + + const int EDIT = 1; + const int NEW = 2; + const int DEL = 3; + const int PROPS = 4; + const int GOIMPL = 5; + + TQPopupMenu menu; + bool insertDelete = FALSE; + + if ( i->rtti() == HierarchyItem::FunctParent || i->rtti() == HierarchyItem::SlotParent || + i->rtti() == HierarchyItem::VarParent ) { + menu.insertItem( SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()), i18n( "Edit..." ), EDIT ); + } else + menu.insertItem( SmallIcon( "designer_filenew.png" , KDevDesignerPartFactory::instance()), i18n( "New..." ), NEW ); + if ( i->rtti() == HierarchyItem::DefinitionParent || i->rtti() == HierarchyItem::Variable || + i->rtti() == HierarchyItem::Definition ) { + menu.insertItem( SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()), i18n( "Edit..." ), EDIT ); + } + if ( i->rtti() == HierarchyItem::Function || i->rtti() == HierarchyItem::Slot ) { + if ( formWindow->project()->isCpp() ) + menu.insertItem( SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()), i18n( "Properties" ), PROPS ); + if ( MetaDataBase::hasEditor( formWindow->project()->language() ) ) + menu.insertItem( i18n( "Goto Implementation" ), GOIMPL ); + insertDelete = TRUE; + } + if ( insertDelete || i->rtti() == HierarchyItem::Variable || + i->rtti() == HierarchyItem::Function || i->rtti() == HierarchyItem::Slot || + i->rtti() == HierarchyItem::Definition ) { + menu.insertSeparator(); + menu.insertItem( SmallIcon( "designer_editcut.png" , KDevDesignerPartFactory::instance()), i18n( "Delete" ), DEL ); + } + popupOpen = TRUE; + int res = menu.exec( pos ); + popupOpen = FALSE; + if ( res == -1 ) + return; + + if ( res == EDIT ) { + switch( i->rtti() ) { + case HierarchyItem::FunctParent: + execFunctionDialog( "public", "function", FALSE ); + break; + case HierarchyItem::SlotParent: + execFunctionDialog( "public", "slot", FALSE ); + break; + case HierarchyItem::VarParent: + case HierarchyItem::VarPublic: + case HierarchyItem::VarProtected: + case HierarchyItem::VarPrivate: + case HierarchyItem::Variable: { + VariableDialog varDia( formWindow, this ); + TQListViewItem *i = selectedItem(); + if ( i ) + varDia.setCurrentItem( i->text( 0 ) ); + if ( varDia.exec() == TQDialog::Accepted ) + formWindow->commandHistory()->setModified( TRUE ); + break; + } + case HierarchyItem::Definition: + case HierarchyItem::DefinitionParent: + LanguageInterface *lIface = MetaDataBase::languageInterface( formWindow->project()->language() ); + if ( !lIface ) + return; + if ( i->rtti() == HierarchyItem::Definition ) + i = i->parent(); + ListEditor dia( this, 0, TRUE ); + dia.setCaption( i18n( "Edit %1" ).arg( i->text( 0 ) ) ); + TQStringList entries = lIface->definitionEntries( i->text( 0 ), MainWindow::self->designerInterface() ); + dia.setList( entries ); + dia.exec(); + Command *cmd = new EditDefinitionsCommand( i18n( "Edit %1" ).arg( i->text( 0 )), formWindow, + lIface, i->text( 0 ), dia.items() ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } else if ( res == NEW ) { + HierarchyItem::Type t = getChildType( i->rtti() ); + if ( (int)t == i->rtti() ) + i = i->parent(); + switch( i->rtti() ) { + case HierarchyItem::SlotPublic: + execFunctionDialog( "public", "slot", TRUE ); + break; + case HierarchyItem::SlotProtected: + execFunctionDialog( "protected", "slot", TRUE ); + break; + case HierarchyItem::SlotPrivate: + execFunctionDialog( "private" , "slot", TRUE ); + break; + case HierarchyItem::FunctPublic: + execFunctionDialog( "public", "function", TRUE ); + break; + case HierarchyItem::FunctProtected: + execFunctionDialog( "protected", "function", TRUE ); + break; + case HierarchyItem::FunctPrivate: + execFunctionDialog( "private" , "function", TRUE ); + break; + default: + insertEntry( i ); + } + } else if ( res == DEL ) { + if ( i->rtti() == HierarchyItem::Slot || i->rtti() == HierarchyItem::Function ) { + + TQCString funct( MetaDataBase::normalizeFunction( i->text( 0 ) ).latin1() ); + Command *cmd = new RemoveFunctionCommand( i18n( "Remove Function" ), formWindow, funct, + TQString(), TQString(), TQString(), + TQString(), formWindow->project()->language() ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + } else if ( i->rtti() == HierarchyItem::Variable ) { + Command *cmd = new RemoveVariableCommand( i18n( "Remove Variable" ), formWindow, + i->text( 0 ) ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else { + TQListViewItem *p = i->parent(); + delete i; + save( p, 0 ); + } + } else if ( res == PROPS ) { + if ( i->rtti() == HierarchyItem::Slot || + i->rtti() == HierarchyItem::Function ) { + EditFunctions dlg( this, formWindow ); + dlg.setCurrentFunction( MetaDataBase::normalizeFunction( i->text( 0 ) ) ); + dlg.exec(); + } + } else if ( res == GOIMPL ) { + if ( i->rtti() == HierarchyItem::Slot || + i->rtti() == HierarchyItem::Function ) { + formWindow->clearSelection(false); + formWindow->mainWindow()->part()->emitEditFunction(formWindow->fileName(), i->text( 0 )); +// formWindow->mainWindow()->editFunction( i->text( 0 ) ); + } + } +} + +void FormDefinitionView::renamed( TQListViewItem *i ) +{ + if ( newItem == i ) + newItem = 0; + if ( !i->parent() ) + return; + save( i->parent(), i ); +} + + +void FormDefinitionView::save( TQListViewItem *p, TQListViewItem *i ) +{ + if ( i && i->text( 0 ).isEmpty() ) { + delete i; + return; + } + + if ( i && i->rtti() == HierarchyItem::Variable ) { + i->setRenameEnabled( 0, FALSE ); + TQString varName = i->text( 0 ); + varName = varName.simplifyWhiteSpace(); + if ( varName[(int)varName.length() - 1] != ';' ) + varName += ";"; + if ( MetaDataBase::hasVariable( TQT_TQOBJECT(formWindow), varName ) ) { + TQMessageBox::information( this, i18n( "Edit Variables" ), + i18n( "This variable has already been declared." ) ); + } else { + if ( p->rtti() == HierarchyItem::VarPublic ) + addVariable( varName, "public" ); + else if ( p->rtti() == HierarchyItem::VarProtected ) + addVariable( varName, "protected" ); + else if ( p->rtti() == HierarchyItem::VarPrivate ) + addVariable( varName, "private" ); + } + } else { + LanguageInterface *lIface = MetaDataBase::languageInterface( formWindow->project()->language() ); + if ( !lIface ) + return; + TQStringList lst; + i = p->firstChild(); + while ( i ) { + lst << i->text( 0 ); + i = i->nextSibling(); + } + Command *cmd = new EditDefinitionsCommand( i18n( "Edit %1" ).arg( p->text( 0 ) ), formWindow, + lIface, p->text( 0 ), lst ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +void FormDefinitionView::addVariable( const TQString &varName, const TQString &access ) +{ + Command *cmd = new AddVariableCommand( i18n( "Add Variable" ), formWindow, + varName, access ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +// ------------------------------------------------------------ + +HierarchyView::HierarchyView( TQWidget *parent ) + : TQTabWidget( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | + WStyle_Tool |WStyle_MinMax | WStyle_SysMenu ) +{ + formwindow = 0; + editor = 0; + listview = new HierarchyList( this, formWindow() ); + fView = new FormDefinitionView( this, formWindow() ); + if ( !MainWindow::self->singleProjectMode() ) { + addTab( listview, i18n( "Objects" ) ); + setTabToolTip( listview, i18n( "List of all widgets and objects of the current form in hierarchical order" ) ); + addTab( fView, i18n( "Members" ) ); + setTabToolTip( fView, i18n( "List of all members of the current form" ) ); + } else { + listview->hide(); + fView->hide(); + } + + if ( !classBrowserInterfaceManager ) { + classBrowserInterfaceManager = + new TQPluginManager<ClassBrowserInterface>( IID_ClassBrowser, TQApplication::libraryPaths(), + MainWindow::self->pluginDirectory() ); + } + + classBrowsers = new TQMap<TQString, ClassBrowser>(); + TQStringList langs = MetaDataBase::languages(); + for ( TQStringList::Iterator it = langs.begin(); it != langs.end(); ++it ) { + TQInterfacePtr<ClassBrowserInterface> ciface = 0; + classBrowserInterfaceManager->queryInterface( *it, &ciface ); + if ( ciface ) { + ClassBrowser cb( ciface->createClassBrowser( this ), ciface ); + addTab( cb.lv, i18n( "Class Declarations" ) ); + setTabToolTip( cb.lv, i18n( "List of all classes and its declarations of the current source file" ) ); + ciface->onClick( TQT_TQOBJECT(this), TQT_SLOT( jumpTo( const TQString &, const TQString &, int ) ) ); + classBrowsers->insert( *it, cb ); + setTabEnabled( cb.lv, FALSE ); + } + } +} + +HierarchyView::~HierarchyView() +{ +} + +void HierarchyView::clear() +{ + listview->clear(); + fView->clear(); + for ( TQMap<TQString, ClassBrowser>::Iterator it = classBrowsers->begin(); + it != classBrowsers->end(); ++it ) { + (*it).iface->clear(); + } +} + +void HierarchyView::setFormWindow( FormWindow *fw, TQObject *o ) +{ + bool fake = fw && qstrcmp( fw->name(), "qt_fakewindow" ) == 0; + if ( fw == 0 || o == 0 ) { + listview->clear(); + fView->clear(); + listview->setFormWindow( fw ); + fView->setFormWindow( fw ); + formwindow = 0; + editor = 0; + } + + setTabEnabled( listview, TRUE ); + setTabEnabled( fView, fw && fw->project()->isCpp() ); + + if ( fw == formwindow ) { + if ( fw ) { + if ( !fake ) + listview->setCurrent( TQT_TQOBJECT(o) ); + else + listview->clear(); + if ( MainWindow::self->qWorkspace()->activeWindow() == fw ) + showPage( listview ); + else if ( fw->project()->isCpp() ) + showPage( fView ); + else + showClasses( fw->formFile()->editor() ); + } + } + + formwindow = fw; + if ( !fake ) { + listview->setFormWindow( fw ); + } else { + listview->setFormWindow( 0 ); + listview->clear(); + } + + fView->setFormWindow( fw ); + if ( !fake ) { + listview->setup(); + listview->setCurrent( TQT_TQOBJECT(o) ); + } + fView->setup(); + + for ( TQMap<TQString, ClassBrowser>::Iterator it = classBrowsers->begin(); + it != classBrowsers->end(); ++it ) { + (*it).iface->clear(); + setTabEnabled( (*it).lv, fw && !fw->project()->isCpp() ); + } + + if ( MainWindow::self->qWorkspace()->activeWindow() == fw ) + showPage( listview ); + else if ( fw && fw->project()->isCpp() ) + showPage( fView ); + else if ( fw ) + showClasses( fw->formFile()->editor() ); + + editor = 0; +} + +void HierarchyView::showClasses( SourceEditor *se ) +{ + if ( !se->object() ) + return; + + lastSourceEditor = se; + TQTimer::singleShot( 100, this, TQT_SLOT( showClassesTimeout() ) ); +} + +void HierarchyView::showClassesTimeout() +{ + if ( !lastSourceEditor ) + return; + SourceEditor *se = (SourceEditor*)lastSourceEditor; + if ( !se->object() ) + return; + if ( se->formWindow() && se->formWindow()->project()->isCpp() ) { + setFormWindow( se->formWindow(), TQT_TQOBJECT(se->formWindow()->currentWidget()) ); + MainWindow::self->propertyeditor()->setWidget( TQT_TQOBJECT(se->formWindow()->currentWidget()), + se->formWindow() ); + return; + } + + setTabEnabled( listview, !!se->formWindow() && !se->formWindow()->isFake() ); + setTabEnabled( fView, FALSE ); + + formwindow = 0; + listview->setFormWindow( 0 ); + fView->setFormWindow( 0 ); + listview->clear(); + fView->clear(); + if ( !se->formWindow() ) + MainWindow::self->propertyeditor()->setWidget( 0, 0 ); + editor = se; + + for ( TQMap<TQString, ClassBrowser>::Iterator it = classBrowsers->begin(); + it != classBrowsers->end(); ++it ) { + if ( it.key() == se->project()->language() ) { + (*it).iface->update( se->text() ); + setTabEnabled( (*it).lv, TRUE ); + showPage( (*it).lv ); + } else { + setTabEnabled( (*it).lv, FALSE ); + (*it).iface->clear(); + } + } +} + +void HierarchyView::updateClassBrowsers() +{ + if ( !editor ) + return; + for ( TQMap<TQString, ClassBrowser>::Iterator it = classBrowsers->begin(); + it != classBrowsers->end(); ++it ) { + if ( it.key() == editor->project()->language() ) + (*it).iface->update( editor->text() ); + else + (*it).iface->clear(); + } +} + +FormWindow *HierarchyView::formWindow() const +{ + return formwindow; +} + +void HierarchyView::closeEvent( TQCloseEvent *e ) +{ + emit hidden(); + e->accept(); +} + +void HierarchyView::widgetInserted( TQWidget * ) +{ + listview->setup(); +} + +void HierarchyView::widgetRemoved( TQWidget * ) +{ + listview->setup(); +} + +void HierarchyView::widgetsInserted( const TQWidgetList & ) +{ + listview->setup(); +} + +void HierarchyView::widgetsRemoved( const TQWidgetList & ) +{ + listview->setup(); +} + +void HierarchyView::namePropertyChanged( TQWidget *w, const TQVariant & ) +{ + TQWidget *w2 = w; + if ( ::tqqt_cast<TQMainWindow*>(w) ) + w2 = ( (TQMainWindow*)w )->centralWidget(); + listview->changeNameOf( TQT_TQOBJECT(w2), w->name() ); +} + + +void HierarchyView::databasePropertyChanged( TQWidget *w, const TQStringList& info ) +{ +#ifndef TQT_NO_SQL + TQString i = info.join( "." ); + listview->changeDatabaseOf( TQT_TQOBJECT(w), i ); +#endif +} + + +void HierarchyView::tabsChanged( TQTabWidget * ) +{ + listview->setup(); +} + +void HierarchyView::pagesChanged( TQWizard * ) +{ + listview->setup(); +} + +void HierarchyView::rebuild() +{ + listview->setup(); +} + +void HierarchyView::closed( FormWindow *fw ) +{ + if ( fw == formwindow ) { + listview->clear(); + fView->clear(); + } +} + +void HierarchyView::updateFormDefinitionView() +{ + fView->setup(); +} + +void HierarchyView::jumpTo( const TQString &func, const TQString &clss, int type ) +{ + if ( !editor ) + return; + if ( type == ClassBrowserInterface::Class ) + editor->setClass( func ); + else + editor->setFunction( func, clss ); +} + +HierarchyView::ClassBrowser::ClassBrowser( TQListView *l, ClassBrowserInterface *i ) + : lv( l ), iface( i ) +{ +} + +HierarchyView::ClassBrowser::~ClassBrowser() +{ +} diff --git a/kdevdesigner/designer/hierarchyview.h b/kdevdesigner/designer/hierarchyview.h new file mode 100644 index 00000000..cb21ed50 --- /dev/null +++ b/kdevdesigner/designer/hierarchyview.h @@ -0,0 +1,252 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef HIRARCHYVIEW_H +#define HIRARCHYVIEW_H + +#include <tqvariant.h> +#include <tqlistview.h> +#include <tqtabwidget.h> +#include <tqguardedptr.h> +#include <tqcom_p.h> +#include "../interfaces/classbrowserinterface.h" + +class FormWindow; +class TQCloseEvent; +class TQPopupMenu; +class TQKeyEvent; +class TQMouseEvent; +class TQWizard; +class SourceEditor; + +class HierarchyItem : public TQListViewItem +{ +public: + enum Type { + Widget, + SlotParent, + SlotPublic, + SlotProtected, + SlotPrivate, + Slot, + DefinitionParent, + Definition, + Event, + EventFunction, + FunctParent, + FunctPublic, + FunctProtected, + FunctPrivate, + Function, + VarParent, + VarPublic, + VarProtected, + VarPrivate, + Variable + }; + + HierarchyItem( Type type, TQListViewItem *parent, TQListViewItem *after, + const TQString &txt1, const TQString &txt2, const TQString &txt3 ); + HierarchyItem( Type type, TQListView *parent, TQListViewItem *after, + const TQString &txt1, const TQString &txt2, const TQString &txt3 ); + + void paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align ); + void updateBackColor(); + + void setObject( TQObject *o ); + TQObject *object() const; + + void setText( int col, const TQString &txt ) { if ( !txt.isEmpty() ) TQListViewItem::setText( col, txt ); } + + int rtti() const { return (int)typ; } + +private: + void okRename( int col ); + void cancelRename( int col ); + +private: + TQColor backgroundColor(); + TQColor backColor; + TQObject *obj; + Type typ; + +}; + +class HierarchyList : public TQListView +{ + Q_OBJECT + + +public: + HierarchyList( TQWidget *parent, FormWindow *fw, bool doConnects = TRUE ); + + virtual void setup(); + virtual void setCurrent( TQObject *o ); + void setOpen( TQListViewItem *i, bool b ); + void changeNameOf( TQObject *o, const TQString &name ); + void changeDatabaseOf( TQObject *o, const TQString &info ); + void setFormWindow( FormWindow *fw ) { formWindow = fw; } + void drawContentsOffset( TQPainter *p, int ox, int oy, + int cx, int cy, int cw, int ch ) { + setUpdatesEnabled( FALSE ); + triggerUpdate(); + setUpdatesEnabled( TRUE ); + TQListView::drawContentsOffset( p, ox, oy, cx, cy, cw, ch ); + } + + void insertEntry( TQListViewItem *i, const TQPixmap &pix = TQPixmap(), const TQString &s = TQString() ); + +protected: + void keyPressEvent( TQKeyEvent *e ); + void keyReleaseEvent( TQKeyEvent *e ); + void viewportMousePressEvent( TQMouseEvent *e ); + void viewportMouseReleaseEvent( TQMouseEvent *e ); + +public slots: + void addTabPage(); + void removeTabPage(); + +private: + void insertObject( TQObject *o, TQListViewItem *parent ); + TQObject *findObject( TQListViewItem *i ); + TQListViewItem *findItem( TQObject *o ); + TQObject *current() const; + TQObject *handleObjectClick( TQListViewItem *i ); + +private slots: + virtual void objectClicked( TQListViewItem *i ); + virtual void objectDoubleClicked( TQListViewItem *i ); + virtual void showRMBMenu( TQListViewItem *, const TQPoint & ); + +protected: + FormWindow *formWindow; + TQPopupMenu *normalMenu, *tabWidgetMenu; + bool deselect; + + TQPixmap DesignerFormPix; + TQPixmap DesignerLayoutPix; + TQPixmap DesignerFolderPix; + TQPixmap DesignerEditSlotsPix; + +}; + +class FormDefinitionView : public HierarchyList +{ + Q_OBJECT + + +public: + FormDefinitionView( TQWidget *parent, FormWindow *fw ); + + void setup(); + void setupVariables(); + void refresh(); + void setCurrent( TQWidget *w ); + +protected: + void contentsMouseDoubleClickEvent( TQMouseEvent *e ); + +private: + void save( TQListViewItem *p, TQListViewItem *i ); + void execFunctionDialog( const TQString &access, const TQString &type, bool addFunc ); + void addVariable( const TQString &varName, const TQString &access ); + +private slots: + void objectClicked( TQListViewItem *i ); + void showRMBMenu( TQListViewItem *, const TQPoint & ); + void renamed( TQListViewItem *i ); + +private: + bool popupOpen; + HierarchyItem *itemSlots, *itemPrivate, *itemProtected, *itemPublic; + HierarchyItem *itemFunct, *itemFunctPriv, *itemFunctProt, *itemFunctPubl; + HierarchyItem *itemVar, *itemVarPriv, *itemVarProt, *itemVarPubl; +}; + + +class HierarchyView : public TQTabWidget +{ + Q_OBJECT + + +public: + HierarchyView( TQWidget *parent ); + ~HierarchyView(); + + void setFormWindow( FormWindow *fw, TQObject *o ); + FormWindow *formWindow() const; + SourceEditor *sourceEditor() const { return editor; } + void clear(); + + void showClasses( SourceEditor *se ); + void updateClassBrowsers(); + + void widgetInserted( TQWidget *w ); + void widgetRemoved( TQWidget *w ); + void widgetsInserted( const TQWidgetList &l ); + void widgetsRemoved( const TQWidgetList &l ); + void namePropertyChanged( TQWidget *w, const TQVariant &old ); + void databasePropertyChanged( TQWidget *w, const TQStringList& info ); + void tabsChanged( TQTabWidget *w ); + void pagesChanged( TQWizard *w ); + void rebuild(); + void closed( FormWindow *fw ); + void updateFormDefinitionView(); + + FormDefinitionView *formDefinitionView() const { return fView; } + HierarchyList *hierarchyList() const { return listview; } + +protected slots: + void jumpTo( const TQString &func, const TQString &clss,int type ); + void showClassesTimeout(); + +protected: + void closeEvent( TQCloseEvent *e ); + +signals: + void hidden(); + +private: + struct ClassBrowser + { + ClassBrowser( TQListView * = 0, ClassBrowserInterface * = 0 ); + ~ClassBrowser(); + TQListView *lv; + TQInterfacePtr<ClassBrowserInterface> iface; + + TQ_DUMMY_COMPARISON_OPERATOR( ClassBrowser ) + }; + FormWindow *formwindow; + HierarchyList *listview; + FormDefinitionView *fView; + SourceEditor *editor; + TQMap<TQString, ClassBrowser> *classBrowsers; + TQGuardedPtr<SourceEditor> lastSourceEditor; + +}; + + +#endif diff --git a/kdevdesigner/designer/iconvieweditor.ui b/kdevdesigner/designer/iconvieweditor.ui new file mode 100644 index 00000000..8711bd6b --- /dev/null +++ b/kdevdesigner/designer/iconvieweditor.ui @@ -0,0 +1,461 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>IconViewEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>IconViewEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>567</width> + <height>321</height> + </rect> + </property> + <property name="caption"> + <string>Edit Iconview</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Edit Iconview</b><p>Add, edit or delete items in the icon view.</p><p>Click the <b>New Item</b>-button to create a new item, then enter text and choose a pixmap.</p><p>Select an item from the view and click the <b>Delete Item</b>-button to remove the item from the iconview.</p></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQIconView"> + <property name="name"> + <cstring>preview</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>All items in the iconview.</string> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>itemNew</cstring> + </property> + <property name="text"> + <string>&New Item</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add an item</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Create a new item for the iconview.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>itemDelete</cstring> + </property> + <property name="text"> + <string>&Delete Item</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete item</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Delete the selected item.</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Vertical Spacing1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>&Item Properties</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>Label1</cstring> + </property> + <property name="text"> + <string>&Text:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemText</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="0" column="1"> + <property name="name"> + <cstring>itemText</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="toolTip" stdset="0"> + <string>Change text</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Change the text for the selected item.</string> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label2</cstring> + </property> + <property name="text"> + <string>&Pixmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemChoosePixmap</cstring> + </property> + </widget> + <widget class="TQLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>itemPixmap</cstring> + </property> + <property name="text"> + <string>Label4</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>itemDeletePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Delete the selected item's pixmap.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>itemChoosePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Select a pixmap file for the current item.</string> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonApply</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Apply all changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>itemNew</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>insertNewItem()</slot> + </connection> + <connection> + <sender>itemDelete</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>deleteCurrentItem()</slot> + </connection> + <connection> + <sender>itemText</sender> + <signal>textChanged( const TQString & )</signal> + <receiver>IconViewEditorBase</receiver> + <slot>currentTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>buttonApply</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>applyClicked()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>cancelClicked()</slot> + </connection> + <connection> + <sender>itemChoosePixmap</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>choosePixmap()</slot> + </connection> + <connection> + <sender>preview</sender> + <signal>selectionChanged(TQIconViewItem*)</signal> + <receiver>IconViewEditorBase</receiver> + <slot>currentItemChanged(TQIconViewItem*)</slot> + </connection> + <connection> + <sender>preview</sender> + <signal>currentChanged(TQIconViewItem*)</signal> + <receiver>IconViewEditorBase</receiver> + <slot>currentItemChanged(TQIconViewItem*)</slot> + </connection> + <connection> + <sender>itemDeletePixmap</sender> + <signal>clicked()</signal> + <receiver>IconViewEditorBase</receiver> + <slot>deletePixmap()</slot> + </connection> +</connections> +<tabstops> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>preview</tabstop> + <tabstop>itemNew</tabstop> + <tabstop>itemDelete</tabstop> + <tabstop>itemText</tabstop> + <tabstop>itemDeletePixmap</tabstop> + <tabstop>itemChoosePixmap</tabstop> + <tabstop>buttonHelp</tabstop> + <tabstop>buttonApply</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">applyClicked()</slot> + <slot access="protected">cancelClicked()</slot> + <slot access="protected">choosePixmap()</slot> + <slot access="protected">currentItemChanged( TQIconViewItem * )</slot> + <slot access="protected">currentTextChanged( const TQString & )</slot> + <slot access="protected">deleteCurrentItem()</slot> + <slot access="protected">insertNewItem()</slot> + <slot access="protected">deletePixmap()</slot> + <slot access="protected">okClicked()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/iconvieweditorimpl.cpp b/kdevdesigner/designer/iconvieweditorimpl.cpp new file mode 100644 index 00000000..32a81412 --- /dev/null +++ b/kdevdesigner/designer/iconvieweditorimpl.cpp @@ -0,0 +1,165 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "iconvieweditorimpl.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "pixmapchooser.h" + +#include <tqlineedit.h> +#include <tqlabel.h> +#include <tqiconview.h> +#include <tqpushbutton.h> +#include <tqcheckbox.h> + +#include <tdelocale.h> + +IconViewEditor::IconViewEditor( TQWidget *parent, TQWidget *editWidget, FormWindow *fw ) + : IconViewEditorBase( parent, 0, TRUE ), formwindow( fw ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + iconview = (TQIconView*)editWidget; + + itemText->setText( "" ); + itemText->setEnabled( FALSE ); + itemPixmap->setText( "" ); + itemChoosePixmap->setEnabled( FALSE ); + itemDeletePixmap->setEnabled( FALSE ); + + TQIconViewItem *i = 0; + for ( i = iconview->firstItem(); i; i = i->nextItem() ) { + (void)new TQIconViewItem( preview, i->text(), *i->pixmap() ); + } + + if ( preview->firstItem() ) + preview->setCurrentItem( preview->firstItem() ); +} + +void IconViewEditor::insertNewItem() +{ + TQIconViewItem *i = new TQIconViewItem( preview, i18n( "New Item" ) ); + preview->setCurrentItem( i ); + preview->setSelected( i, TRUE ); + itemText->setFocus(); + itemText->selectAll(); +} + +void IconViewEditor::deleteCurrentItem() +{ + delete preview->currentItem(); + if ( preview->currentItem() ) + preview->setSelected( preview->currentItem(), TRUE ); +} + +void IconViewEditor::currentItemChanged( TQIconViewItem *i ) +{ + itemText->blockSignals( TRUE ); + itemText->setText( "" ); + itemPixmap->setText( "" ); + itemText->blockSignals( FALSE ); + + if ( !i ) { + itemText->setEnabled( FALSE ); + itemChoosePixmap->setEnabled( FALSE ); + return; + } + + itemText->blockSignals( TRUE ); + itemText->setEnabled( TRUE ); + itemChoosePixmap->setEnabled( TRUE ); + itemDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() ); + + itemText->setText( i->text() ); + if ( i->pixmap() ) + itemPixmap->setPixmap( *i->pixmap() ); + itemText->blockSignals( FALSE ); +} + +void IconViewEditor::currentTextChanged( const TQString &txt ) +{ + if ( !preview->currentItem() ) + return; + + preview->currentItem()->setText( txt ); +} + +void IconViewEditor::okClicked() +{ + applyClicked(); + accept(); +} + +void IconViewEditor::cancelClicked() +{ + reject(); +} + +void IconViewEditor::applyClicked() +{ + TQIconViewItem *i = 0; + TQValueList<PopulateIconViewCommand::Item> items; + for ( i = preview->firstItem(); i; i = i->nextItem() ) { + PopulateIconViewCommand::Item item; + if ( i->pixmap() ) + item.pix = *i->pixmap(); + item.text = i->text(); + items.append( item ); + } + + PopulateIconViewCommand *cmd = new PopulateIconViewCommand( i18n( "Edit the Items of '%1'" ).arg( iconview->name() ), + formwindow, iconview, items ); + cmd->execute(); + formwindow->commandHistory()->addCommand( cmd ); +} + +void IconViewEditor::choosePixmap() +{ + if ( !preview->currentItem() ) + return; + + TQPixmap pix; + if ( preview->currentItem()->pixmap() ) + pix = qChoosePixmap( this, formwindow, *preview->currentItem()->pixmap() ); + else + pix = qChoosePixmap( this, formwindow, TQPixmap() ); + + if ( pix.isNull() ) + return; + + preview->currentItem()->setPixmap( pix ); + itemPixmap->setPixmap( pix ); + itemDeletePixmap->setEnabled( TRUE ); +} + +void IconViewEditor::deletePixmap() +{ + if ( !preview->currentItem() ) + return; + + preview->currentItem()->setPixmap( TQPixmap() ); + itemPixmap->setText( "" ); + itemDeletePixmap->setEnabled( FALSE ); +} diff --git a/kdevdesigner/designer/iconvieweditorimpl.h b/kdevdesigner/designer/iconvieweditorimpl.h new file mode 100644 index 00000000..969c9cf4 --- /dev/null +++ b/kdevdesigner/designer/iconvieweditorimpl.h @@ -0,0 +1,59 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ICONVIEWEDITORIMPL_H +#define ICONVIEWEDITORIMPL_H + +#include "iconvieweditor.h" + +class FormWindow; + +class IconViewEditor : public IconViewEditorBase +{ + Q_OBJECT + + +public: + IconViewEditor( TQWidget *parent, TQWidget *editWidget, FormWindow *fw ); + +protected slots: + void insertNewItem(); + void deleteCurrentItem(); + void currentItemChanged( TQIconViewItem * ); + void currentTextChanged( const TQString & ); + void okClicked(); + void cancelClicked(); + void applyClicked(); + void choosePixmap(); + void deletePixmap(); + +private: + TQIconView *iconview; + FormWindow *formwindow; + +}; + +#endif diff --git a/kdevdesigner/designer/kdevdesigner_part.cpp b/kdevdesigner/designer/kdevdesigner_part.cpp new file mode 100644 index 00000000..ac966d00 --- /dev/null +++ b/kdevdesigner/designer/kdevdesigner_part.cpp @@ -0,0 +1,565 @@ +/*************************************************************************** + * Copyright (C) 2004 by Alexander Dymo * + * cloudtemple@mksat.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "kdevdesigner_part.h" + +#include <kinstance.h> +#include <tdeaction.h> +#include <tdeactionclasses.h> +#include <kstdaction.h> +#include <tdefiledialog.h> +#include <kdebug.h> +#include <tdelocale.h> +#include <kiconloader.h> + +#include <tqfile.h> +#include <tqtextstream.h> +#include <tqtoolbar.h> +#include <tqmenubar.h> +#include <tqptrlist.h> +#include <tqstatusbar.h> + +#include "mainwindow.h" +#include "designeraction.h" +#include "formwindow.h" + +KDevDesignerPart::KDevDesignerPart( TQWidget *parentWidget, const char *// widgetName + , + TQObject *parent, const char *name, const TQStringList &args ) + : KInterfaceDesigner::Designer(parent, name) +{ + setInstance( KDevDesignerPartFactory::instance() ); + + m_widget = new MainWindow( this, true ); + m_widget->reparent(parentWidget, TQPoint(0,0)); + setupDesignerWindow(); + + setWidget(m_widget); + + setupActions(); + if (args.contains("in shell")) + setXMLFile("kdevdesigner_part_sh.rc"); + else + setXMLFile("kdevdesigner_part.rc"); + + setReadWrite(true); + setModified(false); + + connect(m_widget, TQT_SIGNAL(formModified(bool )), this, TQT_SLOT(formModified(bool))); +} + +void KDevDesignerPart::setupDesignerWindow() +{ + m_widget->menuBar()->hide(); + m_widget->layoutToolBar->hide(); + m_widget->projectToolBar->hide(); + m_widget->toolsToolBar->hide(); + m_widget->statusBar()->hide(); +} + +static TQIconSet createPartIconSet( const TQString &name ) +{ + TQIconSet ic( BarIcon( "" + name, KDevDesignerPartFactory::instance() ) ); + TQString prefix = "designer_"; + int right = name.length() - prefix.length(); + ic.setPixmap( BarIcon( prefix + "d_" + name.right( right ), KDevDesignerPartFactory::instance() ), + TQIconSet::Small, TQIconSet::Disabled ); + return ic; +} + +void KDevDesignerPart::setupActions( ) +{ + TDEAction *action; + action = KStdAction::openNew(this, TQT_SLOT(fileNew()), actionCollection()); + action = KStdAction::open(this, TQT_SLOT(fileOpen()), actionCollection()); + action = KStdAction::close(this, TQT_SLOT(fileClose()), actionCollection()); + stateSync(action, m_widget->actionFileClose); + action = KStdAction::save(this, TQT_SLOT(save()), actionCollection()); + stateSync(action, m_widget->actionFileSave); + action = KStdAction::saveAs(this, TQT_SLOT(fileSaveAs()), actionCollection()); + stateSync(action, m_widget->actionFileSaveAs); + action = new TDEAction(i18n("Save Al&l"), 0, this, TQT_SLOT(fileSaveAs()), actionCollection(), "file_saveall"); + stateSync(action, m_widget->actionFileSaveAll); + new TDEAction(i18n("Create &Template..."), 0, this, TQT_SLOT(fileCreateTemplate()), actionCollection(), "file_createtemplate"); + + action = KStdAction::undo(this, TQT_SLOT(editUndo()), actionCollection()); + stateSync(action, m_widget->actionEditUndo); + action = KStdAction::redo(this, TQT_SLOT(editRedo()), actionCollection()); + stateSync(action, m_widget->actionEditRedo); + action = KStdAction::cut(this, TQT_SLOT(editCut()), actionCollection()); + stateSync(action, m_widget->actionEditCut); + action = KStdAction::copy(this, TQT_SLOT(editCopy()), actionCollection()); + stateSync(action, m_widget->actionEditCopy); + action = KStdAction::paste(this, TQT_SLOT(editPaste()), actionCollection()); + stateSync(action, m_widget->actionEditPaste); + action = new TDEAction(i18n("&Delete"), Key_Delete, this, TQT_SLOT(editDelete()), actionCollection(), "edit_delete"); + stateSync(action, m_widget->actionEditDelete); + action = KStdAction::selectAll(this, TQT_SLOT(editSelectAll()), actionCollection()); + stateSync(action, m_widget->actionEditSelectAll); + action = new TDEAction(i18n("Chec&k Accelerators"), ALT + Key_R, this, TQT_SLOT(editAccels()), actionCollection(), "edit_accels"); + stateSync(action, m_widget->actionEditAccels); + action = new TDEAction(i18n("S&lots..."), createPartIconSet("designer_editslots.png"), 0, this, TQT_SLOT(editFunctions()), actionCollection(), "edit_functions"); + stateSync(action, m_widget->actionEditFunctions); + action = new TDEAction(i18n("Co&nnections..."), createPartIconSet("designer_connecttool.png"), 0, this, TQT_SLOT(editConnections()), actionCollection(), "edit_connections"); + stateSync(action, m_widget->actionEditConnections); + action = new TDEAction(i18n("&Form Settings..."), 0, this, TQT_SLOT(editFormSettings()), actionCollection(), "edit_formsettings"); + stateSync(action, m_widget->actionEditFormSettings); + + action = new TDEAction(i18n("&Add File..."), 0, this, TQT_SLOT(projectAddFile()), actionCollection(), "project_addfile"); + stateSync(action, m_widget->actionProjectAddFile); + action = new TDEAction(i18n("&Image Collection..."), 0, this, TQT_SLOT(projectImageCollection()), actionCollection(), "project_imagecollection"); + stateSync(action, m_widget->actionEditPixmapCollection); + action = new TDEAction(i18n("&Database Connections..."), 0, this, TQT_SLOT(projectDatabaseCollections()), actionCollection(), "project_databasecollections"); + stateSync(action, m_widget->actionEditDatabaseConnections); + action = new TDEAction(i18n("&Designer Project Settings..."), 0, this, TQT_SLOT(projectSettings()), actionCollection(), "project_settings"); + stateSync(action, m_widget->actionEditProjectSettings); + + TDERadioAction *toggle; + toggle = new TDERadioAction(i18n("&Pointer"), createPartIconSet("designer_pointer.png"), Key_F2, actionCollection(), "tools_pointer"); + setupToolsAction(toggle, m_widget->actionPointerTool); + pointerAction = toggle; + toggle = new TDERadioAction(i18n("&Connect Signal/Slots"), createPartIconSet("designer_connecttool.png"), Key_F3, actionCollection(), "tools_connect"); + setupToolsAction(toggle, m_widget->actionConnectTool); + toggle = new TDERadioAction(i18n("Tab &Order"), createPartIconSet("designer_ordertool.png"), Key_F4, actionCollection(), "tools_taborder"); + setupToolsAction(toggle, m_widget->actionOrderTool); + toggle = new TDERadioAction(i18n("Set &Buddy"), createPartIconSet("designer_setbuddy.png"), Key_F12, actionCollection(), "tools_setbuddy"); + setupToolsAction(toggle, m_widget->actionBuddyTool); + new TDEAction(i18n("Configure Toolbox..."), 0, this, TQT_SLOT(toolsConfigureToolbox()), actionCollection(), "tools_toolbox"); + new TDEAction(i18n("Edit &Custom Widgets..."), 0, this, TQT_SLOT(toolsEditCustomWidgets()), actionCollection(), "tools_editcustomwidgets"); + + action = new TDEAction(i18n("Adjust &Size"), createPartIconSet("designer_adjustsize.png"), CTRL + Key_J, this, TQT_SLOT(layoutAdjustSize()), actionCollection(), "layout_adjustsize"); + stateSync(action, m_widget->actionEditAdjustSize); + action = new TDEAction(i18n("Lay Out &Horizontally"), createPartIconSet("designer_edithlayout.png"), CTRL + Key_H, this, TQT_SLOT(layoutHLayout()), actionCollection(), "layout_h"); + stateSync(action, m_widget->actionEditHLayout); + action = new TDEAction(i18n("Lay Out &Vertically"), createPartIconSet("designer_editvlayout.png"), CTRL + Key_V, this, TQT_SLOT(layoutVLayout()), actionCollection(), "layout_v"); + stateSync(action, m_widget->actionEditVLayout); + action = new TDEAction(i18n("Lay Out in &Grid"), createPartIconSet("designer_editgrid.png"), CTRL + Key_G, this, TQT_SLOT(layoutGridLayout()), actionCollection(), "layout_grid"); + stateSync(action, m_widget->actionEditGridLayout); + action = new TDEAction(i18n("Lay OutQt::Horizontally (in S&plitter)"), createPartIconSet("designer_editvlayoutsplit.png"), 0, this, TQT_SLOT(layoutSplitHLayout()), actionCollection(), "layout_splith"); + stateSync(action, m_widget->actionEditSplitHorizontal); + action = new TDEAction(i18n("Lay OutQt::Vertically (in Sp&litter)"), createPartIconSet("designer_edithlayoutsplit.png"), 0, this, TQT_SLOT(layoutSplitVLayout()), actionCollection(), "layout_splitv"); + stateSync(action, m_widget->actionEditSplitVertical); + action = new TDEAction(i18n("&Break Layout"), createPartIconSet("designer_editbreaklayout.png"), CTRL + Key_B, this, TQT_SLOT(layoutBreak()), actionCollection(), "layout_break"); + stateSync(action, m_widget->actionEditBreakLayout); + toggle = new TDERadioAction(i18n("Add Spacer"), createPartIconSet("designer_spacer.png"), 0, actionCollection(), "layout_spacer"); + setupToolsAction(toggle, m_widget->actionInsertSpacer); + + action = new TDEAction(i18n("Preview &Form"), CTRL + Key_T, this, TQT_SLOT(windowPreview()), actionCollection(), "window_preview"); + stateSync(action, m_widget->actionPreview); + action = new TDEAction(i18n("Ne&xt Form"), CTRL + Key_F6, this, TQT_SLOT(windowNext()), actionCollection(), "window_next"); + stateSync(action, m_widget->actionWindowNext); + action = new TDEAction(i18n("Pre&vious Form"), CTRL + SHIFT + Key_F6, this, TQT_SLOT(windowPrev()), actionCollection(), "window_prev"); + stateSync(action, m_widget->actionWindowPrevious); + + action = KStdAction::preferences(this, TQT_SLOT(editPreferences()), actionCollection()); + action->setText(i18n("Configure &KDevDesigner...")); + stateSync(action, m_widget->actionEditPreferences); +} + +KDevDesignerPart::~KDevDesignerPart() +{ +} + +void KDevDesignerPart::setReadWrite(bool rw) +{ + ReadWritePart::setReadWrite(rw); +} + +void KDevDesignerPart::setModified(bool modified) +{ +/* TDEAction *save = actionCollection()->action(KStdAction::stdName(KStdAction::Save)); + if (!save) + return; + if (modified) + save->setEnabled(true); + else + save->setEnabled(false);*/ + + ReadWritePart::setModified(modified); +} + +bool KDevDesignerPart::openFile() +{ + m_widget->fileOpen("", "", m_file); + return true; +} + +bool KDevDesignerPart::saveFile() +{ + if (isReadWrite() == false) + return false; + m_widget->actionFileSaveAll->activate(); + return true; +} + +void KDevDesignerPart::stateSync( TDEAction * tdeaction, TQAction * qaction ) +{ + if (!qaction) + return; + tdeaction->setEnabled(qaction->isEnabled()); + DesignerAction *ac = dynamic_cast<DesignerAction*>(qaction); + if (!ac) + return; + connect(ac, TQT_SIGNAL(actionEnabled(bool )), tdeaction, TQT_SLOT(setEnabled(bool ))); +} + +void KDevDesignerPart::setupToolsAction( TDERadioAction * toggle, TQAction * action ) +{ + if (!action) + return; + + toggle->setGroup("tools"); + toggle->setExclusiveGroup("tools"); + connect(action, TQT_SIGNAL(toggled(bool )), this, TQT_SLOT(setToggleActionChecked(bool ))); + connect(toggle, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(setToggleActionOn(bool))); + toggle->setChecked(action->isOn()); + m_actionMap[action] = toggle; + m_actionMap2[toggle] = action; +} + + +// It's usually safe to leave the factory code alone.. with the +// notable exception of the TDEAboutData data +#include <tdeaboutdata.h> +#include <tdelocale.h> + +TDEInstance* KDevDesignerPartFactory::s_instance = 0L; +TDEAboutData* KDevDesignerPartFactory::s_about = 0L; + +KDevDesignerPartFactory::KDevDesignerPartFactory() + : KParts::Factory() +{ +} + +KDevDesignerPartFactory::~KDevDesignerPartFactory() +{ + delete s_instance; + delete s_about; + + s_instance = 0L; +} + +KParts::Part* KDevDesignerPartFactory::createPartObject( TQWidget *parentWidget, const char *widgetName, + TQObject *parent, const char *name, + const char *classname, const TQStringList &args ) +{ + // Create an instance of our Part + KDevDesignerPart* obj = new KDevDesignerPart( parentWidget, widgetName, parent, name, args ); + + // See if we are to be read-write or not + if (TQCString(classname) == "KParts::ReadOnlyPart") + obj->setReadWrite(false); + + return obj; +} + +TDEInstance* KDevDesignerPartFactory::instance() +{ + if( !s_instance ) + { + s_about = new TDEAboutData("kdevdesignerpart", I18N_NOOP("KDevDesignerPart"), "0.1"); + s_about->addAuthor("Alexander Dymo", 0, "cloudtemple@mksat.net"); + s_about->addAuthor("Trolltech AS", 0, "info@trolltech.com"); + s_instance = new TDEInstance(s_about); + } + return s_instance; +} + +extern "C" +{ + void* init_libkdevdesignerpart() + { + return new KDevDesignerPartFactory; + } +} + +//actions + +void KDevDesignerPart::fileNew( ) +{ + if (!m_widget->actionNewFile) + { + tqWarning("wrong m_widget->actionNewFile"); + return; + } + m_widget->actionNewFile->activate(); +} + +void KDevDesignerPart::fileOpen() +{ + m_widget->fileOpen(); +} + +void KDevDesignerPart::fileSaveAs() +{ + m_widget->actionFileSaveAs->activate(); +} + +void KDevDesignerPart::fileClose( ) +{ + m_widget->actionFileClose->activate(); +} + +void KDevDesignerPart::fileCreateTemplate( ) +{ + m_widget->fileCreateTemplate(); +} + +void KDevDesignerPart::editUndo( ) +{ + m_widget->actionEditUndo->activate(); +} + +void KDevDesignerPart::editRedo( ) +{ + m_widget->actionEditRedo->activate(); +} + +void KDevDesignerPart::editCut( ) +{ + m_widget->actionEditCut->activate(); +} + +void KDevDesignerPart::editPaste( ) +{ + m_widget->actionEditPaste->activate(); +} + +void KDevDesignerPart::editCopy( ) +{ + m_widget->actionEditCopy->activate(); +} + +void KDevDesignerPart::editDelete( ) +{ + m_widget->actionEditDelete->activate(); +} + +void KDevDesignerPart::editSelectAll( ) +{ + m_widget->actionEditSelectAll->activate(); +} + +void KDevDesignerPart::editAccels( ) +{ + m_widget->actionEditAccels->activate(); +} + +void KDevDesignerPart::editFunctions( ) +{ + m_widget->actionEditFunctions->activate(); +} + +void KDevDesignerPart::editConnections( ) +{ + m_widget->actionEditConnections->activate(); +} + +void KDevDesignerPart::editFormSettings( ) +{ + m_widget->actionEditFormSettings->activate(); +} + +void KDevDesignerPart::editPreferences( ) +{ + m_widget->actionEditPreferences->activate(); +} + +void KDevDesignerPart::projectAddFile( ) +{ + m_widget->actionProjectAddFile->activate(); +} + +void KDevDesignerPart::projectImageCollection( ) +{ + m_widget->actionEditPixmapCollection->activate(); +} + +void KDevDesignerPart::projectDatabaseCollections( ) +{ + m_widget->actionEditDatabaseConnections->activate(); +} + +void KDevDesignerPart::projectSettings( ) +{ + m_widget->actionEditProjectSettings->activate(); +} + +void KDevDesignerPart::toolsConfigureToolbox( ) +{ + m_widget->toolsConfigure(); +} + +void KDevDesignerPart::layoutAdjustSize( ) +{ + m_widget->actionEditAdjustSize->activate(); +} + +void KDevDesignerPart::layoutHLayout( ) +{ + m_widget->actionEditHLayout->activate(); +} + +void KDevDesignerPart::layoutVLayout( ) +{ + m_widget->actionEditVLayout->activate(); +} + +void KDevDesignerPart::layoutGridLayout( ) +{ + m_widget->actionEditGridLayout->activate(); +} + +void KDevDesignerPart::layoutSplitHLayout( ) +{ + m_widget->actionEditSplitHorizontal->activate(); +} + +void KDevDesignerPart::layoutSplitVLayout( ) +{ + m_widget->actionEditSplitVertical->activate(); +} + +void KDevDesignerPart::layoutBreak( ) +{ + m_widget->actionEditBreakLayout->activate(); +} + +void KDevDesignerPart::windowPreview( ) +{ + m_widget->actionPreview->activate(); +} + +void KDevDesignerPart::windowNext( ) +{ + m_widget->actionWindowNext->activate(); +} + +void KDevDesignerPart::windowPrev( ) +{ + m_widget->actionWindowPrevious->activate(); +} + +void KDevDesignerPart::statusMessage( const TQString & msg ) +{ + emit setStatusBarText(msg); +} + +void KDevDesignerPart::setToggleActionChecked( bool b) +{ + if (!sender()) + return; + const TQAction *action = dynamic_cast<const TQAction*>(sender()); + if (!action) + return; + if (b) + { + if (action == m_widget->actionPointerTool) + pointerAction->setChecked(true); + return; + } + TDERadioAction *tdeaction = m_actionMap[action]; + if (!tdeaction) + return; +// kdDebug() << "untoggle action: " << tdeaction->text() << endl; + tdeaction->blockSignals(true); + tdeaction->setChecked(b); + tdeaction->blockSignals(false); +} + +void KDevDesignerPart::setToggleActionOn( bool b ) +{ + if (!sender()) + return; + const TDERadioAction *action = dynamic_cast<const TDERadioAction *>(sender()); + if (!action) + return; +// kdDebug() << (b?TQString("toggle"):TQString("untoggle")) << " action: " << action->text() << endl; + TQAction *qaction = m_actionMap2[action]; + if (!qaction) + return; + disconnect(qaction, TQT_SIGNAL(toggled(bool )), this, TQT_SLOT(setToggleActionChecked(bool ))); + qaction->setOn(b); + connect(qaction, TQT_SIGNAL(toggled(bool )), this, TQT_SLOT(setToggleActionChecked(bool ))); +} + +void KDevDesignerPart::openProject( const TQString & // projectFile + ) +{ + //TODO: implement + return; +} + +KInterfaceDesigner::DesignerType KDevDesignerPart::designerType( ) +{ + return KInterfaceDesigner::TQtDesigner; +} + +void KDevDesignerPart::emitAddedFunction( const TQString & form, KInterfaceDesigner::Function func ) +{ + kdDebug() << "KDevDesignerPart::emitAddedFunction: form " << form << ", function: " << func.function << endl; + emit addedFunction(designerType(), form, func); +} + +void KDevDesignerPart::emitRemovedFunction( const TQString & form, KInterfaceDesigner::Function func ) +{ + kdDebug() << "KDevDesignerPart::emitRemovedFunction: form " << form << ", function: " << func.function << endl; + emit removedFunction(designerType(), form, func); +} + +void KDevDesignerPart::emitEditedFunction( const TQString & form, KInterfaceDesigner::Function oldFunc, KInterfaceDesigner::Function func ) +{ + kdDebug() << "KDevDesignerPart::emitEditedFunction: form " << form + << ", old function: " << oldFunc.function + << ", function: " << func.function << endl; + +// m_widget->formWindow()->clearSelection(false); + emit editedFunction(designerType(), form, oldFunc, func); +} + +void KDevDesignerPart::emitEditFunction(const TQString &formName, const TQString &functionName) +{ + kdDebug() << "KDevDesignerPart::emitEditedFunction: form " << formName + << ", function: " << functionName << endl; + emit editFunction(designerType(), formName, functionName); +} + +void KDevDesignerPart::formModified(bool b) +{ + kdDebug() << "KDevDesignerPart::formModified " << b << endl; + setModified(b); +} + +void KDevDesignerPart::emitEditSource(const TQString &formName) +{ + emit editSource(designerType(), formName); +} + +void KDevDesignerPart::emitNewStatus(const TQString &formName, int status) +{ + emit newStatus(formName, status); +} + +void KDevDesignerPart::toolsEditCustomWidgets( ) +{ + m_widget->toolsCustomWidget(); +} + +#include "kdevdesigner_part.moc" diff --git a/kdevdesigner/designer/kdevdesigner_part.desktop b/kdevdesigner/designer/kdevdesigner_part.desktop new file mode 100644 index 00000000..2928a8ad --- /dev/null +++ b/kdevdesigner/designer/kdevdesigner_part.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Name=KDevDesignerPart +Name[da]=TDevelop Designer-part +Name[el]=ΤμήμαKDevDesigner +Name[nds]=Kdevelop-Makerkomponent +Name[ne]=केडीई विकास डिजाइनर भाग +Name[sv]=TDevelop designerdel +Name[ta]=கேமேம்பாட்டு வடிவமைப்பாளர் பகுதி +Name[tg]=KDevҚисми дизайнгар +Name[zh_TW]=TDevelop 設計元件 +MimeType=application/x-designer +ServiceTypes=KParts/ReadOnlyPart,KParts/ReadWritePart +X-TDE-Library=libkdevdesignerpart +Type=Service +InitialPreference=10 + diff --git a/kdevdesigner/designer/kdevdesigner_part.h b/kdevdesigner/designer/kdevdesigner_part.h new file mode 100644 index 00000000..3006c600 --- /dev/null +++ b/kdevdesigner/designer/kdevdesigner_part.h @@ -0,0 +1,148 @@ +/*************************************************************************** + * Copyright (C) 2004 by Alexander Dymo * + * cloudtemple@mksat.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _KDEVDESIGNERPART_H_ +#define _KDEVDESIGNERPART_H_ + +#include <tqmap.h> + +#include <tdeparts/part.h> +#include <tdeparts/factory.h> + +#include "designer.h" + +class TQWidget; +class TQPainter; +class KURL; +class MainWindow; +class TDEAction; +class TQAction; +class TDERadioAction; + +class KDevDesignerPart : public KInterfaceDesigner::Designer +{ + Q_OBJECT + +public: + KDevDesignerPart(TQWidget *parentWidget, const char *widgetName, + TQObject *parent, const char *name, const TQStringList &args); + virtual ~KDevDesignerPart(); + + virtual void setReadWrite(bool rw); + virtual void setModified(bool modified); + + void statusMessage(const TQString &msg); + + //KInterfaceDesigner::Designer methods + virtual void openProject(const TQString &projectFile); + virtual KInterfaceDesigner::DesignerType designerType(); + + void emitAddedFunction(const TQString &form, KInterfaceDesigner::Function func); + void emitEditedFunction(const TQString &form, KInterfaceDesigner::Function oldFunc, KInterfaceDesigner::Function func); + void emitRemovedFunction(const TQString &form, KInterfaceDesigner::Function func); + + void emitEditFunction(const TQString &formName, const TQString &functionName); + void emitEditSource(const TQString &formName); + + void emitNewStatus(const TQString &formName, int status); + +protected: + virtual bool openFile(); + virtual bool saveFile(); + + void setupDesignerWindow(); + void setupActions(); + + void stateSync(TDEAction *tdeaction, TQAction *qaction); + void setupToolsAction(TDERadioAction *toggle, TQAction *action); + +protected slots: + void setToggleActionChecked(bool b); + void setToggleActionOn(bool b); + + void fileNew(); + void fileOpen(); + void fileClose(); + void fileSaveAs(); + void fileCreateTemplate(); + + void editUndo(); + void editRedo(); + void editCut(); + void editCopy(); + void editPaste(); + void editDelete(); + void editSelectAll(); + void editAccels(); + void editFunctions(); + void editConnections(); + void editFormSettings(); + void editPreferences(); + + void projectAddFile(); + void projectImageCollection(); + void projectDatabaseCollections(); + void projectSettings(); + + void toolsConfigureToolbox(); + void toolsEditCustomWidgets(); + + void layoutAdjustSize(); + void layoutHLayout(); + void layoutVLayout(); + void layoutGridLayout(); + void layoutSplitHLayout(); + void layoutSplitVLayout(); + void layoutBreak(); + + void windowPreview(); + void windowNext(); + void windowPrev(); + + void formModified(bool b); +private: + MainWindow *m_widget; + + TQMap<const TQAction*, TDERadioAction*> m_actionMap; + TQMap<const TDERadioAction*, TQAction*> m_actionMap2; + TDERadioAction* pointerAction; +}; + +class TDEInstance; +class TDEAboutData; + +class KDevDesignerPartFactory : public KParts::Factory +{ + Q_OBJECT + +public: + KDevDesignerPartFactory(); + virtual ~KDevDesignerPartFactory(); + virtual KParts::Part* createPartObject( TQWidget *parentWidget, const char *widgetName, + TQObject *parent, const char *name, + const char *classname, const TQStringList &args ); + static TDEInstance* instance(); + +private: + static TDEInstance* s_instance; + static TDEAboutData* s_about; +}; + +#endif // _KDEVDESIGNERPART_H_ diff --git a/kdevdesigner/designer/kdevdesigner_part.rc b/kdevdesigner/designer/kdevdesigner_part.rc new file mode 100644 index 00000000..71adcdc9 --- /dev/null +++ b/kdevdesigner/designer/kdevdesigner_part.rc @@ -0,0 +1,121 @@ +<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> +<kpartgui name="kdevdesigner_part" version="6"> +<MenuBar> + <Menu name="file" noMerge="1"><text>&File</text> + <Action name="file_createtemplate" group="new_merge"/> + <Action name="file_save" group="save_merge"/> + <Action name="file_save_as" group="save_merge"/> + </Menu> + + <Menu name="edit" noMerge="1"><text>&Edit</text> + <Action name="edit_undo" group="edit_undo_merge"/> + <Action name="edit_redo" group="edit_undo_merge"/> + <Separator group="edit_undo_merge"/> + <Action name="edit_cut" group="edit_paste_merge"/> + <Action name="edit_copy" group="edit_paste_merge"/> + <Action name="edit_paste" group="edit_paste_merge"/> + <Separator group="edit_paste_merge"/> + <Action name="edit_delete" group="edit_select_merge"/> + <Action name="edit_select_all" group="edit_select_merge"/> + <Separator group="edit_select_merge"/> + <Action name="edit_accels" group="edit_select_merge"/> + <Separator group="edit_select_merge"/> + <Action name="edit_functions" group="edit_select_merge"/> + <Action name="edit_connections" group="edit_select_merge"/> + <Action name="edit_formsettings" group="edit_select_merge"/> + <Separator group="edit_select_merge"/> + </Menu> + + <Menu name="project" noMerge="1"><text>&Project</text> + <Action name="project_imagecollection" group="designer_project"/> + <Action name="project_databasecollections" group="designer_project"/> + <Separator group="designer_project"/> + <Action name="project_settings" group="designer_project"/> + <Separator group="designer_project"/> + </Menu> + + <Menu name="tools" noMerge="1"><text>&Tools</text> + <Action name="tools_pointer" group="tools_operations"/> + <Action name="tools_connect" group="tools_operations"/> + <Action name="tools_taborder" group="tools_operations"/> + <Action name="tools_setbuddy" group="tools_operations"/> + <Action name="tools_toolbox" group="tools_operations"/> + <Action name="tools_editcustomwidgets" group="tools_operations"/> + <Separator group="tools_operations"/> + </Menu> + + <Menu name="layout" noMerge="1"><text>&Layout</text> + <Action name="layout_adjustsize"/> + <Separator/> + <Action name="layout_h"/> + <Action name="layout_v"/> + <Action name="layout_grid"/> + <Action name="layout_splith"/> + <Action name="layout_splitv"/> + <Action name="layout_break"/> + <Separator/> + <Action name="layout_spacer"/> + </Menu> + + <Menu name="settings" noMerge="1"><text>&Settings</text> + <Action name="options_configure" group="configure_merge"/> + </Menu> + + <Menu name="window" noMerge="1"><text>&Window</text> + <Action name="window_preview" group="window_operations"/> + <Separator group="window_operations"/> + <Action name="window_next" group="window_operations"/> + <Action name="window_prev" group="window_operations"/> + </Menu> + +</MenuBar> + +<!--<ToolBar name="fileToolBar" noMerge="1"><text>File Toolbar</text> + <Action name="file_new"/> + <Action name="file_open"/> + <Action name="file_save"/> +</ToolBar> + +<ToolBar name="editToolBar" noMerge="1"><text>Edit Toolbar</text> + <Action name="edit_undo"/> + <Action name="edit_redo"/> + <Separator/> + <Action name="edit_cut"/> + <Action name="edit_copy"/> + <Action name="edit_paste"/> +</ToolBar> --> + +<ToolBar name="mainToolBar" noMerge="1"><text>Main Toolbar</text> + <Action name="file_open" group="file_operations"/> + <Action name="file_save" group="file_operations"/> + <Separator group="file_operations"/> + <Action name="edit_undo" group="edit_operations"/> + <Action name="edit_redo" group="edit_operations"/> + <Separator group="edit_operations"/> + <Action name="edit_cut" group="edit_operations"/> + <Action name="edit_copy" group="edit_operations"/> + <Action name="edit_paste" group="edit_operations"/> +</ToolBar> + + +<ToolBar name="layoutToolBar" noMerge="1"><text>Layout Toolbar</text> + <Action name="layout_adjustsize"/> + <Separator/> + <Action name="layout_h"/> + <Action name="layout_v"/> + <Action name="layout_grid"/> + <Action name="layout_splith"/> + <Action name="layout_splitv"/> + <Action name="layout_break"/> + <Separator/> + <Action name="layout_spacer"/> +</ToolBar> + +<ToolBar name="toolsToolBar" noMerge="1"><text>Tools Toolbar</text> + <Action name="tools_pointer"/> + <Action name="tools_connect"/> + <Action name="tools_taborder"/> + <Action name="tools_setbuddy"/> +</ToolBar> + +</kpartgui> diff --git a/kdevdesigner/designer/kdevdesigner_part_sh.rc b/kdevdesigner/designer/kdevdesigner_part_sh.rc new file mode 100644 index 00000000..eb6b503b --- /dev/null +++ b/kdevdesigner/designer/kdevdesigner_part_sh.rc @@ -0,0 +1,116 @@ +<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> +<kpartgui name="kdevdesigner_part" version="4"> +<MenuBar> + <Menu name="file" noMerge="1"><text>&File</text> + <Action name="file_new" group="new_merge"/> + <Action name="file_open" group="open_merge"/> + <Separator/> + <Action name="file_close" group="close_merge"/> + <Separator/> + <Action name="file_save" group="save_merge"/> + <Action name="file_save_as" group="save_merge"/> + <Action name="file_saveall" group="save_merge"/> + <Separator/> + <Action name="file_createtemplate"/> + <Separator/> + </Menu> + + <Menu name="edit" noMerge="1"><text>&Edit</text> + <Action name="edit_undo" group="edit_undo_merge"/> + <Action name="edit_redo" group="edit_undo_merge"/> + <Separator group="edit_undo_merge"/> + <Action name="edit_cut" group="edit_paste_merge"/> + <Action name="edit_copy" group="edit_paste_merge"/> + <Action name="edit_paste" group="edit_paste_merge"/> + <Separator group="edit_paste_merge"/> + <Action name="edit_delete" group="edit_select_merge"/> + <Action name="edit_select_all" group="edit_select_merge"/> + <Separator group="edit_select_merge"/> + <Action name="edit_accels"/> + <Separator/> + <Action name="edit_functions"/> + <Action name="edit_connections"/> + <Action name="edit_formsettings"/> + </Menu> + + <Menu name="project" noMerge="1"><text>&Project</text> + <Action name="project_addfile"/> + <Action name="project_imagecollection"/> + <Action name="project_databasecollections"/> + <Separator/> + <Action name="project_settings"/> + </Menu> + + <Menu name="tools" noMerge="1"><text>&Tools</text> + <Action name="tools_pointer" group="tools_operations"/> + <Action name="tools_connect" group="tools_operations"/> + <Action name="tools_taborder" group="tools_operations"/> + <Action name="tools_setbuddy" group="tools_operations"/> + <Action name="tools_toolbox" group="tools_operations"/> + <Action name="tools_editcustomwidgets" group="tools_operations"/> +<!-- <Separator/> + <Action name="tools_toolbox"/>--> + </Menu> + + <Menu name="layout" noMerge="1"><text>&Layout</text> + <Action name="layout_adjustsize"/> + <Separator/> + <Action name="layout_h"/> + <Action name="layout_v"/> + <Action name="layout_grid"/> + <Action name="layout_splith"/> + <Action name="layout_splitv"/> + <Action name="layout_break"/> + <Separator/> + <Action name="layout_spacer"/> + </Menu> + + <Menu name="settings" noMerge="1"><text>&Settings</text> + <Action name="options_configure"/> + </Menu> + + <Menu name="window" noMerge="1"><text>&Window</text> + <Action name="window_preview" group="window_operations"/> + <Separator/> + <Action name="window_next" group="window_operations"/> + <Action name="window_prev" group="window_operations"/> + </Menu> + +</MenuBar> + +<ToolBar name="fileToolBar" noMerge="1"><text>File Toolbar</text> + <Action name="file_new"/> + <Action name="file_open"/> + <Action name="file_save"/> +</ToolBar> + +<ToolBar name="editToolBar" noMerge="1"><text>Edit Toolbar</text> + <Action name="edit_undo"/> + <Action name="edit_redo"/> + <Separator/> + <Action name="edit_cut"/> + <Action name="edit_copy"/> + <Action name="edit_paste"/> +</ToolBar> + +<ToolBar name="layoutToolBar" noMerge="1"><text>Layout Toolbar</text> + <Action name="layout_adjustsize"/> + <Separator/> + <Action name="layout_h"/> + <Action name="layout_v"/> + <Action name="layout_grid"/> + <Action name="layout_splith"/> + <Action name="layout_splitv"/> + <Action name="layout_break"/> + <Separator/> + <Action name="layout_spacer"/> +</ToolBar> + +<ToolBar name="toolsToolBar" noMerge="1"><text>Tools Toolbar</text> + <Action name="tools_pointer"/> + <Action name="tools_connect"/> + <Action name="tools_taborder"/> + <Action name="tools_setbuddy"/> +</ToolBar> + +</kpartgui> diff --git a/kdevdesigner/designer/layout.cpp b/kdevdesigner/designer/layout.cpp new file mode 100644 index 00000000..b8fb737c --- /dev/null +++ b/kdevdesigner/designer/layout.cpp @@ -0,0 +1,1017 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formwindow.h" +#include "tqlayout.h" +#include <widgetdatabase.h> +#include "widgetfactory.h" + +#include <tqlayout.h> +#include <tqevent.h> +#include <tqpainter.h> +#include <tqpen.h> +#include <tqbitmap.h> +#include <tqsplitter.h> +#include <tqvaluevector.h> +#include <tqmainwindow.h> + +bool operator<( const TQGuardedPtr<TQWidget> &p1, const TQGuardedPtr<TQWidget> &p2 ) +{ + return p1.operator->() < p2.operator->(); +} + +/*! + \class Layout tqlayout.h + \brief Baseclass for layouting widgets in the Designer + + Classes derived from this abstract base class are used for layouting + operations in the Designer. + +*/ + +/*! \a p specifies the parent of the layoutBase \a lb. The parent + might be changed in setup(). If the layoutBase is a + container, the parent and the layoutBase are the same. Also they + always have to be a widget known to the designer (e.g. in the case + of the tabwidget parent and layoutBase are the tabwidget and not the + page which actually gets laid out. For actual usage the correct + widget is found later by Layout.) + */ + +Layout::Layout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, bool doSetup, bool splitter ) + : widgets( wl ), parent( p ), formWindow( fw ), isBreak( !doSetup ), useSplitter( splitter ) +{ + widgets.setAutoDelete( FALSE ); + layoutBase = lb; + if ( !doSetup && layoutBase ) + oldGeometry = layoutBase->geometry(); +} + +/*! The widget list we got in the constructor might contain too much + widgets (like widgets with different parents, already laid out + widgets, etc.). Here we set up the list and so the only the "best" + widgets get laid out. +*/ + +void Layout::setup() +{ + startPoint = TQPoint( 32767, 32767 ); + TQValueList<TQWidgetList> lists; + TQWidget *lastParent = 0; + TQWidgetList *lastList = 0; + TQWidget *w = 0; + + // Go through all widgets of the list we got. As we can only + // layout widgets which have the same parent, we first do some + // sorting which means create a list for each parent containing + // its child here. After that we keep working on the list of + // childs which has the most entries. + // Widgets which are already laid out are thrown away here too + for ( w = widgets.first(); w; w = widgets.next() ) { + if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) + continue; + if ( lastParent != w->parentWidget() ) { + lastList = 0; + lastParent = w->parentWidget(); + TQValueList<TQWidgetList>::Iterator it = lists.begin(); + for ( ; it != lists.end(); ++it ) { + if ( ( *it ).first()->parentWidget() == w->parentWidget() ) + lastList = &( *it ); + } + if ( !lastList ) { + TQWidgetList l; + l.setAutoDelete( FALSE ); + lists.append( l ); + lastList = &lists.last(); + } + } + lastList->append( w ); + } + + // So, now find the list with the most entries + lastList = 0; + TQValueList<TQWidgetList>::Iterator it = lists.begin(); + for ( ; it != lists.end(); ++it ) { + if ( !lastList || ( *it ).count() > lastList->count() ) + lastList = &( *it ); + } + + // If we found no list (because no widget did fit at all) or the + // best list has only one entry and we do not layout a container, + // we leave here. + if ( !lastList || ( lastList->count() < 2 && + ( !layoutBase || + ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(layoutBase) ) ) ) && + layoutBase != formWindow->mainContainer() ) ) + ) ) { + widgets.clear(); + startPoint = TQPoint( 0, 0 ); + return; + } + + // Now we have a new and clean widget list, which makes sense + // to layout + widgets = *lastList; + // Also use the only correct parent later, so store it + parent = WidgetFactory::widgetOfContainer( widgets.first()->parentWidget() ); + // Now calculate the position where the layout-meta-widget should + // be placed and connect to widgetDestroyed() signals of the + // widgets to get informed if one gets deleted to be able to + // handle that and do not crash in this case + for ( w = widgets.first(); w; w = widgets.next() ) { + connect( w, TQT_SIGNAL( destroyed() ), + this, TQT_SLOT( widgetDestroyed() ) ); + startPoint = TQPoint( TQMIN( startPoint.x(), w->x() ), + TQMIN( startPoint.y(), w->y() ) ); + geometries.insert( w, TQRect( w->pos(), w->size() ) ); + // Change the Z-order, as saving/loading uses the Z-order for + // writing/creating widgets and this has to be the same as in + // the layout. Else saving + loading will give different results + w->raise(); + } +} + +void Layout::widgetDestroyed() +{ + if ( sender() && sender()->isWidgetType() ) + widgets.removeRef( (TQWidget*)sender() ); +} + +bool Layout::prepareLayout( bool &needMove, bool &needReparent ) +{ + if ( !widgets.count() ) + return FALSE; + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) + w->raise(); + needMove = !layoutBase; + needReparent = needMove || ::tqqt_cast<TQLayoutWidget*>(layoutBase) || ::tqqt_cast<TQSplitter*>(layoutBase); + if ( !layoutBase ) { + if ( !useSplitter ) + layoutBase = WidgetFactory::create( WidgetDatabase::idFromClassName( TQLAYOUTWIDGET_OBJECT_NAME_STRING ), + WidgetFactory::containerOfWidget( parent ) ); + else + layoutBase = WidgetFactory::create( WidgetDatabase::idFromClassName( TQSPLITTER_OBJECT_NAME_STRING ), + WidgetFactory::containerOfWidget( parent ) ); + } else { + WidgetFactory::deleteLayout( layoutBase ); + } + + return TRUE; +} + +void Layout::finishLayout( bool needMove, TQLayout *layout ) +{ + if ( needMove ) + layoutBase->move( startPoint ); + TQRect g( TQRect( layoutBase->pos(), layoutBase->size() ) ); + if ( WidgetFactory::layoutType( layoutBase->parentWidget() ) == WidgetFactory::NoLayout && !isBreak ) + layoutBase->adjustSize(); + else if ( isBreak ) + layoutBase->setGeometry( oldGeometry ); + oldGeometry = g; + layoutBase->show(); + layout->activate(); + formWindow->insertWidget( layoutBase ); + formWindow->selectWidget( TQT_TQOBJECT(layoutBase) ); + TQString n = layoutBase->name(); + if ( n.find( "qt_dead_widget_" ) != -1 ) { + n.remove( 0, TQString( "qt_dead_widget_" ).length() ); + layoutBase->setName( n ); + } +} + +void Layout::undoLayout() +{ + if ( !widgets.count() ) + return; + TQMap<TQGuardedPtr<TQWidget>, TQRect>::Iterator it = geometries.begin(); + for ( ; it != geometries.end(); ++it ) { + if ( !it.key() ) + continue; + it.key()->reparent( WidgetFactory::containerOfWidget( parent ), 0, ( *it ).topLeft(), it.key()->isVisibleTo( formWindow ) ); + it.key()->resize( ( *it ).size() ); + } + formWindow->selectWidget( TQT_TQOBJECT(layoutBase), FALSE ); + WidgetFactory::deleteLayout( layoutBase ); + if ( parent != layoutBase && !::tqqt_cast<TQMainWindow*>(layoutBase) ) { + layoutBase->hide(); + TQString n = layoutBase->name(); + n.prepend( "qt_dead_widget_" ); + layoutBase->setName( n ); + } else { + layoutBase->setGeometry( oldGeometry ); + } + if ( widgets.first() ) + formWindow->selectWidget( TQT_TQOBJECT(widgets.first()) ); + else + formWindow->selectWidget( TQT_TQOBJECT(formWindow) ); +} + +void Layout::breakLayout() +{ + TQMap<TQWidget*, TQRect> rects; + if ( !widgets.isEmpty() ) { + TQWidget *w; + for ( w = widgets.first(); w; w = widgets.next() ) + rects.insert( w, w->geometry() ); + } + WidgetFactory::deleteLayout( layoutBase ); + bool needReparent = qstrcmp( layoutBase->className(), TQLAYOUTWIDGET_OBJECT_NAME_STRING ) == 0 || + qstrcmp( layoutBase->className(), TQSPLITTER_OBJECT_NAME_STRING ) == 0 || + ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(layoutBase) ) ) ) && + layoutBase != formWindow->mainContainer() ); + bool needResize = qstrcmp( layoutBase->className(), TQSPLITTER_OBJECT_NAME_STRING ) == 0; + bool add = geometries.isEmpty(); + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + if ( needReparent ) + w->reparent( layoutBase->parentWidget(), 0, + layoutBase->pos() + w->pos(), TRUE ); + if ( needResize ) { + TQMap<TQWidget*, TQRect>::Iterator it = rects.find( w ); + if ( it != rects.end() ) + w->setGeometry( TQRect( layoutBase->pos() + (*it).topLeft(), (*it).size() ) ); + } + if ( add ) + geometries.insert( w, TQRect( w->pos(), w->size() ) ); + } + if ( needReparent ) { + layoutBase->hide(); + parent = layoutBase->parentWidget(); + TQString n = layoutBase->name(); + n.prepend( "qt_dead_widget_" ); + layoutBase->setName( n ); + } else { + parent = layoutBase; + } + if ( widgets.first() && widgets.first()->isVisibleTo( formWindow ) ) + formWindow->selectWidget( TQT_TQOBJECT(widgets.first()) ); + else + formWindow->selectWidget( TQT_TQOBJECT(formWindow) ); +} + +class HorizontalLayoutList : public TQWidgetList +{ +public: + HorizontalLayoutList( const TQWidgetList &l ) + : TQWidgetList( l ) {} + + int compareItems( TQPtrCollection::Item item1, TQPtrCollection::Item item2 ) { + TQWidget *w1 = (TQWidget*)item1; + TQWidget *w2 = (TQWidget*)item2; + if ( w1->x() == w2->x() ) + return 0; + if ( w1->x() > w2->x() ) + return 1; + return -1; + } + +}; + +HorizontalLayout::HorizontalLayout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, bool doSetup, bool splitter ) + : Layout( wl, p, fw, lb, doSetup, splitter ) +{ + if ( doSetup ) + setup(); +} + +void HorizontalLayout::setup() +{ + HorizontalLayoutList l( widgets ); + l.sort(); + widgets = l; + Layout::setup(); +} + +void HorizontalLayout::doLayout() +{ + bool needMove, needReparent; + if ( !prepareLayout( needMove, needReparent ) ) + return; + + TQHBoxLayout *layout = (TQHBoxLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::HBox ); + + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + if ( needReparent && TQT_BASE_OBJECT(w->parent()) != TQT_BASE_OBJECT(layoutBase) ) + w->reparent( layoutBase, 0, TQPoint( 0, 0 ), FALSE ); + if ( !useSplitter ) { + if ( qstrcmp( w->className(), "Spacer" ) == 0 ) + layout->addWidget( w, 0, ( (Spacer*)w )->alignment() ); + else + layout->addWidget( w ); + if ( ::tqqt_cast<TQLayoutWidget*>(w) ) + ( (TQLayoutWidget*)w )->updateSizePolicy(); + } + w->show(); + } + + if ( ::tqqt_cast<TQSplitter*>(layoutBase) ) + ( (TQSplitter*)layoutBase )->setOrientation( Qt::Horizontal ); + + finishLayout( needMove, layout ); +} + + + + +class VerticalLayoutList : public TQWidgetList +{ +public: + VerticalLayoutList( const TQWidgetList &l ) + : TQWidgetList( l ) {} + + int compareItems( TQPtrCollection::Item item1, TQPtrCollection::Item item2 ) { + TQWidget *w1 = (TQWidget*)item1; + TQWidget *w2 = (TQWidget*)item2; + if ( w1->y() == w2->y() ) + return 0; + if ( w1->y() > w2->y() ) + return 1; + return -1; + } + +}; + +VerticalLayout::VerticalLayout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, bool doSetup, bool splitter ) + : Layout( wl, p, fw, lb, doSetup, splitter ) +{ + if ( doSetup ) + setup(); +} + +void VerticalLayout::setup() +{ + VerticalLayoutList l( widgets ); + l.sort(); + widgets = l; + Layout::setup(); +} + +void VerticalLayout::doLayout() +{ + bool needMove, needReparent; + if ( !prepareLayout( needMove, needReparent ) ) + return; + + TQVBoxLayout *layout = (TQVBoxLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::VBox ); + + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + if ( needReparent && TQT_BASE_OBJECT(w->parent()) != TQT_BASE_OBJECT(layoutBase) ) + w->reparent( layoutBase, 0, TQPoint( 0, 0 ), FALSE ); + if ( !useSplitter ) { + if ( qstrcmp( w->className(), "Spacer" ) == 0 ) + layout->addWidget( w, 0, ( (Spacer*)w )->alignment() ); + else + layout->addWidget( w ); + if ( ::tqqt_cast<TQLayoutWidget*>(w) ) + ( (TQLayoutWidget*)w )->updateSizePolicy(); + } + w->show(); + } + + if ( ::tqqt_cast<TQSplitter*>(layoutBase) ) + ( (TQSplitter*)layoutBase )->setOrientation( Qt::Vertical ); + + finishLayout( needMove, layout ); +} + + + + + +class Grid +{ +public: + Grid( int rows, int cols ); + ~Grid(); + + TQWidget* cell( int row, int col ) const { return cells[ row * ncols + col]; } + void setCell( int row, int col, TQWidget* w ) { cells[ row*ncols + col] = w; } + void setCells( TQRect c, TQWidget* w ) { + for ( int rows = c.bottom()-c.top(); rows >= 0; rows--) + for ( int cols = c.right()-c.left(); cols >= 0; cols--) { + setCell(c.top()+rows, c.left()+cols, w); + } + } + int numRows() const { return nrows; } + int numCols() const { return ncols; } + + void simplify(); + bool locateWidget( TQWidget* w, int& row, int& col, int& rowspan, int& colspan ); + +private: + void merge(); + int countRow( int r, int c ) const; + int countCol( int r, int c ) const; + void setRow( int r, int c, TQWidget* w, int count ); + void setCol( int r, int c, TQWidget* w, int count ); + bool isWidgetStartCol( int c ) const; + bool isWidgetEndCol( int c ) const; + bool isWidgetStartRow( int r ) const; + bool isWidgetEndRow( int r ) const; + bool isWidgetTopLeft( int r, int c ) const; + void extendLeft(); + void extendRight(); + void extendUp(); + void extendDown(); + TQWidget** cells; + bool* cols; + bool* rows; + int nrows, ncols; + +}; + +Grid::Grid( int r, int c ) + : nrows( r ), ncols( c ) +{ + cells = new TQWidget*[ r * c ]; + memset( cells, 0, sizeof( cells ) * r * c ); + rows = new bool[ r ]; + cols = new bool[ c ]; + +} + +Grid::~Grid() +{ + delete [] cells; + delete [] cols; + delete [] rows; +} + +int Grid::countRow( int r, int c ) const +{ + TQWidget* w = cell( r, c ); + int i = c + 1; + while ( i < ncols && cell( r, i ) == w ) + i++; + return i - c; +} + +int Grid::countCol( int r, int c ) const +{ + TQWidget* w = cell( r, c ); + int i = r + 1; + while ( i < nrows && cell( i, c ) == w ) + i++; + return i - r; +} + +void Grid::setCol( int r, int c, TQWidget* w, int count ) +{ + for (int i = 0; i < count; i++ ) + setCell( r + i, c, w ); +} + +void Grid::setRow( int r, int c, TQWidget* w, int count ) +{ + for (int i = 0; i < count; i++ ) + setCell( r, c + i, w ); +} + +bool Grid::isWidgetStartCol( int c ) const +{ + int r; + for ( r = 0; r < nrows; r++ ) { + if ( cell( r, c ) && ( (c==0) || (cell( r, c) != cell( r, c-1) )) ) { + return TRUE; + } + } + return FALSE; +} + +bool Grid::isWidgetEndCol( int c ) const +{ + int r; + for ( r = 0; r < nrows; r++ ) { + if ( cell( r, c ) && ((c == ncols-1) || (cell( r, c) != cell( r, c+1) )) ) + return TRUE; + } + return FALSE; +} + +bool Grid::isWidgetStartRow( int r ) const +{ + int c; + for ( c = 0; c < ncols; c++ ) { + if ( cell( r, c ) && ( (r==0) || (cell( r, c) != cell( r-1, c) )) ) + return TRUE; + } + return FALSE; +} + +bool Grid::isWidgetEndRow( int r ) const +{ + int c; + for ( c = 0; c < ncols; c++ ) { + if ( cell( r, c ) && ((r == nrows-1) || (cell( r, c) != cell( r+1, c) )) ) + return TRUE; + } + return FALSE; +} + + +bool Grid::isWidgetTopLeft( int r, int c ) const +{ + TQWidget* w = cell( r, c ); + if ( !w ) + return FALSE; + return ( !r || cell( r-1, c) != w ) && (!c || cell( r, c-1) != w); +} + +void Grid::extendLeft() +{ + int r,c,i; + for ( c = 1; c < ncols; c++ ) { + for ( r = 0; r < nrows; r++ ) { + TQWidget* w = cell( r, c ); + if ( !w ) + continue; + int cc = countCol( r, c); + int stretch = 0; + for ( i = c-1; i >= 0; i-- ) { + if ( cell( r, i ) ) + break; + if ( countCol( r, i ) < cc ) + break; + if ( isWidgetEndCol( i ) ) + break; + if ( isWidgetStartCol( i ) ) { + stretch = c - i; + break; + } + } + if ( stretch ) { + for ( i = 0; i < stretch; i++ ) + setCol( r, c-i-1, w, cc ); + } + } + } +} + + +void Grid::extendRight() +{ + int r,c,i; + for ( c = ncols - 2; c >= 0; c-- ) { + for ( r = 0; r < nrows; r++ ) { + TQWidget* w = cell( r, c ); + if ( !w ) + continue; + int cc = countCol( r, c); + int stretch = 0; + for ( i = c+1; i < ncols; i++ ) { + if ( cell( r, i ) ) + break; + if ( countCol( r, i ) < cc ) + break; + if ( isWidgetStartCol( i ) ) + break; + if ( isWidgetEndCol( i ) ) { + stretch = i - c; + break; + } + } + if ( stretch ) { + for ( i = 0; i < stretch; i++ ) + setCol( r, c+i+1, w, cc ); + } + } + } + +} + +void Grid::extendUp() +{ + int r,c,i; + for ( r = 1; r < nrows; r++ ) { + for ( c = 0; c < ncols; c++ ) { + TQWidget* w = cell( r, c ); + if ( !w ) + continue; + int cr = countRow( r, c); + int stretch = 0; + for ( i = r-1; i >= 0; i-- ) { + if ( cell( i, c ) ) + break; + if ( countRow( i, c ) < cr ) + break; + if ( isWidgetEndRow( i ) ) + break; + if ( isWidgetStartRow( i ) ) { + stretch = r - i; + break; + } + } + if ( stretch ) { + for ( i = 0; i < stretch; i++ ) + setRow( r-i-1, c, w, cr ); + } + } + } +} + +void Grid::extendDown() +{ + int r,c,i; + for ( r = nrows - 2; r >= 0; r-- ) { + for ( c = 0; c < ncols; c++ ) { + TQWidget* w = cell( r, c ); + if ( !w ) + continue; + int cr = countRow( r, c); + int stretch = 0; + for ( i = r+1; i < nrows; i++ ) { + if ( cell( i, c ) ) + break; + if ( countRow( i, c ) < cr ) + break; + if ( isWidgetStartRow( i ) ) + break; + if ( isWidgetEndRow( i ) ) { + stretch = i - r; + break; + } + } + if ( stretch ) { + for ( i = 0; i < stretch; i++ ) + setRow( r+i+1, c, w, cr ); + } + } + } + +} + +void Grid::simplify() +{ + extendLeft(); + extendRight(); + extendUp(); + extendDown(); + merge(); +} + + +void Grid::merge() +{ + int r,c; + for ( c = 0; c < ncols; c++ ) + cols[c] = FALSE; + + for ( r = 0; r < nrows; r++ ) + rows[r] = FALSE; + + for ( c = 0; c < ncols; c++ ) { + for ( r = 0; r < nrows; r++ ) { + if ( isWidgetTopLeft( r, c ) ) { + rows[r] = TRUE; + cols[c] = TRUE; + } + } + } +} + +bool Grid::locateWidget( TQWidget* w, int& row, int& col, int& rowspan, int & colspan ) +{ + int r,c, r2, c2; + for ( c = 0; c < ncols; c++ ) { + for ( r = 0; r < nrows; r++ ) { + if ( cell( r, c ) == w ) { + row = 0; + for ( r2 = 1; r2 <= r; r2++ ) { + if ( rows[ r2-1 ] ) + row++; + } + col = 0; + for ( c2 = 1; c2 <= c; c2++ ) { + if ( cols[ c2-1 ] ) + col++; + } + rowspan = 0; + for ( r2 = r ; r2 < nrows && cell( r2, c) == w; r2++ ) { + if ( rows[ r2 ] ) + rowspan++; + } + colspan = 0; + for ( c2 = c; c2 < ncols && cell( r, c2) == w; c2++ ) { + if ( cols[ c2] ) + colspan++; + } + return TRUE; + } + } + } + return FALSE; +} + + + + +GridLayout::GridLayout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, const TQSize &res, bool doSetup ) + : Layout( wl, p, fw, lb, doSetup ), resolution( res ) +{ + grid = 0; + if ( doSetup ) + setup(); +} + +GridLayout::~GridLayout() +{ + delete grid; +} + +void GridLayout::doLayout() +{ + bool needMove, needReparent; + if ( !prepareLayout( needMove, needReparent ) ) + return; + + QDesignerGridLayout *layout = (QDesignerGridLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::Grid ); + + if ( !grid ) + buildGrid(); + + TQWidget* w; + int r, c, rs, cs; + for ( w = widgets.first(); w; w = widgets.next() ) { + if ( grid->locateWidget( w, r, c, rs, cs) ) { + if ( needReparent && TQT_BASE_OBJECT(w->parent()) != TQT_BASE_OBJECT(layoutBase) ) + w->reparent( layoutBase, 0, TQPoint( 0, 0 ), FALSE ); + if ( rs * cs == 1 ) { + layout->addWidget( w, r, c, ::tqqt_cast<Spacer*>(w) ? ( (Spacer*)w )->alignment() : 0 ); + } else { + layout->addMultiCellWidget( w, r, r+rs-1, c, c+cs-1, ::tqqt_cast<Spacer*>(w) ? ( (Spacer*)w )->alignment() : 0 ); + } + if ( ::tqqt_cast<TQLayoutWidget*>(w) ) + ( (TQLayoutWidget*)w )->updateSizePolicy(); + w->show(); + } else { + tqWarning("ooops, widget '%s' does not fit in layout", w->name() ); + } + } + finishLayout( needMove, layout ); +} + +void GridLayout::setup() +{ + Layout::setup(); + buildGrid(); +} + +void GridLayout::buildGrid() +{ + if ( !widgets.count() ) + return; + + // Pixel to cell conversion: + // By keeping a list of start'n'stop values (x & y) for each widget, + // it is possible to create a very small grid of cells to represent + // the widget layout. + // ----------------------------------------------------------------- + + // We need a list of both start and stop values for x- & y-axis + TQValueVector<int> x( widgets.count()*2 ); + TQValueVector<int> y( widgets.count()*2 ); + + // Using push_back would look nicer, but operator[] is much faster + int index = 0; + TQWidget* w = 0; + for ( w = widgets.first(); w; w = widgets.next() ) { + TQRect widgetPos = w->geometry(); + x[index] = widgetPos.left(); + x[index+1] = widgetPos.right(); + y[index] = widgetPos.top(); + y[index+1] = widgetPos.bottom(); + index += 2; + } + + qHeapSort(x); + qHeapSort(y); + + // Remove duplicate x enteries (Remove next, if equal to current) + if ( !x.empty() ) { + for (TQValueVector<int>::iterator current = x.begin() ; + (current != x.end()) && ((current+1) != x.end()) ; ) + if ( (*current == *(current+1)) ) + x.erase(current+1); + else + current++; + } + + // Remove duplicate y enteries (Remove next, if equal to current) + if ( !y.empty() ) { + for (TQValueVector<int>::iterator current = y.begin() ; + (current != y.end()) && ((current+1) != y.end()) ; ) + if ( (*current == *(current+1)) ) + y.erase(current+1); + else + current++; + } + + // Create the smallest grid possible to represent the current layout + // Since no widget will be placed in the last row and column, we'll + // skip them to increase speed even further + delete grid; + grid = new Grid( y.size()-1, x.size()-1 ); + + // Mark the cells in the grid that contains a widget + for ( w = widgets.first(); w; w = widgets.next() ) { + TQRect c(0,0,0,0), widgetPos = w->geometry(); + // From left til right (not including) + for (uint cw=0; cw<x.size(); cw++) { + if ( x[cw] == widgetPos.left() ) + c.setLeft(cw); + if ( x[cw] < widgetPos.right()) + c.setRight(cw); + } + // From top til bottom (not including) + for (uint ch=0; ch<y.size(); ch++) { + if ( y[ch] == widgetPos.top() ) + c.setTop(ch); + if ( y[ch] < widgetPos.bottom() ) + c.setBottom(ch); + } + grid->setCells(c, w); // Mark cellblock + } + grid->simplify(); +} + + + + + + + +Spacer::Spacer( TQWidget *parent, const char *name ) + : TQWidget( parent, name, WMouseNoMask ), + orient(Qt::Vertical ), interactive(TRUE), sh( TQSize(20,20) ) +{ + setSizeType( Expanding ); + setAutoMask( TRUE ); +} + +void Spacer::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + p.setPen( TQt::blue ); + + if ( orient ==Qt::Horizontal ) { + const int dist = 3; + const int amplitude = TQMIN( 3, height() / 3 ); + const int base = height() / 2; + int i = 0; + p.setPen( white ); + for ( i = 0; i < width() / 3 +2; ++i ) + p.drawLine( i * dist, base - amplitude, i * dist + dist / 2, base + amplitude ); + p.setPen( blue ); + for ( i = 0; i < width() / 3 +2; ++i ) + p.drawLine( i * dist + dist / 2, base + amplitude, i * dist + dist, base - amplitude ); + p.drawLine( 0, 0, 0, height() ); + p.drawLine( width() - 1, 0, width() - 1, height()); + } else { + const int dist = 3; + const int amplitude = TQMIN( 3, width() / 3 ); + const int base = width() / 2; + int i = 0; + p.setPen( white ); + for ( i = 0; i < height() / 3 +2; ++i ) + p.drawLine( base - amplitude, i * dist, base + amplitude,i * dist + dist / 2 ); + p.setPen( blue ); + for ( i = 0; i < height() / 3 +2; ++i ) + p.drawLine( base + amplitude, i * dist + dist / 2, base - amplitude, i * dist + dist ); + p.drawLine( 0, 0, width(), 0 ); + p.drawLine( 0, height() - 1, width(), height() - 1 ); + } +} + +void Spacer::resizeEvent( TQResizeEvent* e) +{ + TQWidget::resizeEvent( e ); + if ( !parentWidget() || WidgetFactory::layoutType( parentWidget() ) == WidgetFactory::NoLayout ) + sh = size(); +} + +void Spacer::updateMask() +{ + TQRegion r( rect() ); + if ( orient ==Qt::Horizontal ) { + const int amplitude = TQMIN( 3, height() / 3 ); + const int base = height() / 2; + r = r.subtract( TQRect(1, 0, width() - 2, base - amplitude ) ); + r = r.subtract( TQRect(1, base + amplitude, width() - 2, height() - base - amplitude ) ); + } else { + const int amplitude = TQMIN( 3, width() / 3 ); + const int base = width() / 2; + r = r.subtract( TQRect(0, 1, base - amplitude, height() - 2 ) ); + r = r.subtract( TQRect( base + amplitude, 1, width() - base - amplitude, height() - 2 ) ); + } + setMask( r ); +} + +void Spacer::setSizeType( SizeType t ) +{ + TQSizePolicy sizeP; + if ( orient ==Qt::Vertical ) + sizeP = TQSizePolicy( TQSizePolicy::Minimum, (TQSizePolicy::SizeType)t ); + else + sizeP = TQSizePolicy( (TQSizePolicy::SizeType)t, TQSizePolicy::Minimum ); + setSizePolicy( sizeP ); +} + + +Spacer::SizeType Spacer::sizeType() const +{ + if ( orient ==Qt::Vertical ) + return (SizeType)sizePolicy().verData(); + return (SizeType)sizePolicy().horData(); +} + +int Spacer::alignment() const +{ + if ( orient ==Qt::Vertical ) + return AlignHCenter; + return AlignVCenter; +} + +TQSize Spacer::minimumSize() const +{ + TQSize s = TQSize( 20,20 ); + if ( sizeType() == Expanding ) + if ( orient ==Qt::Vertical ) + s.rheight() = 0; + else + s.rwidth() = 0; + return s; +} + +TQSize Spacer::sizeHint() const +{ + return sh; +} + + +void Spacer::setSizeHint( const TQSize &s ) +{ + sh = s; + if ( !parentWidget() || WidgetFactory::layoutType( parentWidget() ) == WidgetFactory::NoLayout ) + resize( sizeHint() ); + updateGeometry(); +} + +Qt::Orientation Spacer::orientation() const +{ + return orient; +} + +void Spacer::setOrientation( Qt::Orientation o ) +{ + if ( orient == o ) + return; + + SizeType st = sizeType(); + orient = o; + setSizeType( st ); + if ( interactive ) { + sh = TQSize( sh.height(), sh.width() ); + if (!parentWidget() || WidgetFactory::layoutType( parentWidget() ) == WidgetFactory::NoLayout ) + resize( height(), width() ); + } + updateMask(); + update(); + updateGeometry(); +} + + +void QDesignerGridLayout::addWidget( TQWidget *w, int row, int col, int align_ ) +{ + items.insert( w, Item(row, col, 1, 1) ); + TQGridLayout::addWidget( w, row, col, align_ ); +} + +void QDesignerGridLayout::addMultiCellWidget( TQWidget *w, int fromRow, int toRow, + int fromCol, int toCol, int align_ ) +{ + items.insert( w, Item(fromRow, fromCol, toRow - fromRow + 1, toCol - fromCol +1) ); + TQGridLayout::addMultiCellWidget( w, fromRow, toRow, fromCol, toCol, align_ ); +} diff --git a/kdevdesigner/designer/layout.h b/kdevdesigner/designer/layout.h new file mode 100644 index 00000000..d1ea776e --- /dev/null +++ b/kdevdesigner/designer/layout.h @@ -0,0 +1,191 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LAYOUT_H +#define LAYOUT_H + +#include <tqwidget.h> +#include <tqmap.h> +#include <tqguardedptr.h> +#include <tqobject.h> +#include <tqlayout.h> +#include <tqmap.h> +#include <tqwidgetlist.h> + +class FormWindow; +class TQPaintEvent; + +class Layout : public TQObject +{ + Q_OBJECT + + +public: + Layout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, bool doSetup = TRUE, bool splitter = FALSE ); + virtual ~Layout() {} + + virtual void doLayout() = 0; + virtual void undoLayout(); + virtual void breakLayout(); + virtual bool prepareLayout( bool &needMove, bool &needReparent ); + virtual void finishLayout( bool needMove, TQLayout *layout ); + +protected: + TQWidgetList widgets; + TQWidget *parent; + TQPoint startPoint; + TQMap<TQGuardedPtr<TQWidget>, TQRect> geometries; + TQWidget *layoutBase; + FormWindow *formWindow; + TQRect oldGeometry; + bool isBreak; + bool useSplitter; + +protected: + virtual void setup(); + +protected slots: + void widgetDestroyed(); + +}; + +class HorizontalLayout : public Layout +{ +public: + HorizontalLayout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, bool doSetup = TRUE, bool splitter = FALSE ); + + void doLayout(); + +protected: + void setup(); + +}; + +class VerticalLayout : public Layout +{ +public: + VerticalLayout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, bool doSetup = TRUE, bool splitter = FALSE ); + + void doLayout(); + +protected: + void setup(); + +}; + +class Grid; + +class GridLayout : public Layout +{ +public: + GridLayout( const TQWidgetList &wl, TQWidget *p, FormWindow *fw, TQWidget *lb, const TQSize &res, bool doSetup = TRUE ); + ~GridLayout(); + + void doLayout(); + +protected: + void setup(); + +protected: + void buildGrid(); + TQSize resolution; + Grid* grid; + +}; + +class Spacer : public TQWidget +{ + Q_OBJECT + + + TQ_OVERRIDE( TQCString name ) + TQ_PROPERTY( Orientation orientation READ orientation WRITE setOrientation ) + TQ_ENUMS( SizeType ) + TQ_PROPERTY( SizeType sizeType READ sizeType WRITE setSizeType ) + TQ_PROPERTY( TQSize sizeHint READ sizeHint WRITE setSizeHint DESIGNABLE true STORED true ) + TQ_OVERRIDE( TQRect geometry DESIGNABLE false ) + +private: + enum { HSize = 6, HMask = 0x3f, VMask = HMask << HSize, + MayGrow = 1, ExpMask = 2, MayShrink = 4 }; + +public: + enum SizeType { Fixed = 0, + Minimum = MayGrow, + Maximum = MayShrink, + Preferred = MayGrow|MayShrink , + MinimumExpanding = Minimum|ExpMask, + Expanding = MinimumExpanding|MayShrink }; + + Spacer( TQWidget *parent, const char *name ); + + TQSize minimumSize() const; + TQSize sizeHint() const; + void setSizeType( SizeType t ); + SizeType sizeType() const; + int alignment() const; + Orientation orientation() const; + void setOrientation( Orientation o ); + void setInteraciveMode( bool b ) { interactive = b; }; + void setSizeHint( const TQSize &s ); + +protected: + void paintEvent( TQPaintEvent *e ); + void resizeEvent( TQResizeEvent* e ); + void updateMask(); + Orientation orient; + bool interactive; + TQSize sh; +}; + +class QDesignerGridLayout : public TQGridLayout +{ + Q_OBJECT + +public: + QDesignerGridLayout( TQWidget *parent ) : TQGridLayout( parent ){}; + QDesignerGridLayout( TQLayout *parentLayout ) : TQGridLayout( parentLayout ){}; + + void addWidget( TQWidget *, int row, int col, int align = 0 ); + void addMultiCellWidget( TQWidget *, int fromRow, int toRow, + int fromCol, int toCol, int align = 0 ); + + struct Item + { + Item(): row(0), column(0),rowspan(1),colspan(1){} + Item( int r, int c, int rs, int cs): row(r), column(c), rowspan(rs), colspan(cs){} + int row; + int column; + int rowspan; + int colspan; + TQ_DUMMY_COMPARISON_OPERATOR( Item ) + }; + + TQMap<TQWidget*, Item> items; +}; + + +#endif diff --git a/kdevdesigner/designer/listboxdnd.cpp b/kdevdesigner/designer/listboxdnd.cpp new file mode 100644 index 00000000..54498478 --- /dev/null +++ b/kdevdesigner/designer/listboxdnd.cpp @@ -0,0 +1,305 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "listboxdnd.h" +#include <tqwidget.h> +#include <tqheader.h> +#include <tqpainter.h> +#include <tqdragobject.h> +#include <tqvaluelist.h> + +// The Dragobject Declaration --------------------------------------- +class ListBoxItemDrag : public TQStoredDrag +{ +public: + ListBoxItemDrag( ListBoxItemList & items, bool sendPtr = FALSE, TQListBox * parent = 0, const char * name = 0 ); + ~ListBoxItemDrag() {}; + static bool canDecode( TQDragMoveEvent * event ); + static bool decode( TQDropEvent * event, TQListBox * parent, TQListBoxItem * insertPoint ); + enum ItemType { ListBoxText = 1, ListBoxPixmap = 2 }; +}; +// ------------------------------------------------------------------ + +ListBoxDnd::ListBoxDnd( TQListBox * eventSource, const char * name ) + : ListDnd( eventSource, name ) { } + +void ListBoxDnd::confirmDrop( TQListBoxItem * ) +{ + dropConfirmed = TRUE; +} + +bool ListBoxDnd::dropEvent( TQDropEvent * event ) +{ + if ( dragInside ) { + + if ( dMode & NullDrop ) { // combined with Move, a NullDrop will delete an item + event->accept(); + emit dropped( 0 ); // a NullDrop + return TRUE; + } + + TQPoint pos = event->pos(); + TQListBoxItem * after = itemAt( pos ); + + if ( ListBoxItemDrag::decode( event, (TQListBox *) src, after ) ) { + event->accept(); + TQListBox * src = (TQListBox *) this->src; + TQListBoxItem * item = ( after ? after->next() : src->firstItem() ); + src->setCurrentItem( item ); + emit dropped( item ); // ###FIX: Supports only one item! + } + } + + line->hide(); + dragInside = FALSE; + + return TRUE; +} + +bool ListBoxDnd::mouseMoveEvent( TQMouseEvent * event ) +{ + if ( event->state() & Qt::LeftButton ) { + if ( ( event->pos() - mousePressPos ).manhattanLength() > 3 ) { + + ListBoxItemList list; + buildList( list ); + ListBoxItemDrag * dragobject = new ListBoxItemDrag( list, (dMode & Internal), (TQListBox *) src ); + + // Emit signal for all dragged items + TQListBoxItem * i = list.first(); + while ( i ) { + emit dragged( i ); + i = list.next(); + } + + if ( dMode & Move ) { + removeList( list ); // "hide" items + } + + dragobject->dragCopy(); + + if ( dMode & Move ) { + if ( dropConfirmed ) { + // ###FIX: memleak ? in internal mode, only pointers are transfered... + //list.setAutoDelete( TRUE ); + list.clear(); + dropConfirmed = FALSE; + } + insertList( list ); // "show" items + } + } + } + return FALSE; +} + +int ListBoxDnd::buildList( ListBoxItemList & list ) +{ + TQListBoxItem * i = ((TQListBox *)src)->firstItem(); + while ( i ) { + if ( i->isSelected() ) { + ((TQListBox *)src)->setSelected( i, FALSE ); + list.append( i ); + } + i = i->next(); + } + return list.count(); +} + +void ListBoxDnd::insertList( ListBoxItemList & list ) +{ + TQListBoxItem * i = list.first(); + while ( i ) { + ((TQListBox *)src)->insertItem( i, i->prev() ); + i = list.next(); + } +} + +void ListBoxDnd::removeList( ListBoxItemList & list ) +{ + TQListBoxItem * i = list.first(); + while ( i ) { + ((TQListBox *)src)->takeItem( i ); // remove item from TQListBox + i = list.next(); + } +} + +void ListBoxDnd::updateLine( const TQPoint & dragPos ) +{ + TQListBox * src = (TQListBox *) this->src; + TQListBoxItem *item = itemAt( dragPos ); + + int ypos = item ? + ( src->itemRect( item ).bottom() - ( line->height() / 2 ) ) : + ( src->itemRect( ((TQListBox *)src)->firstItem() ).top() ); + + line->resize( src->viewport()->width(), line->height() ); + line->move( 0, ypos ); +} + +TQListBoxItem * ListBoxDnd::itemAt( TQPoint pos ) +{ + TQListBox * src = (TQListBox *) this->src; + TQListBoxItem * result = src->itemAt( pos ); + TQListBoxItem * last = src->item( src->count() - 1 ); + int i = src->index( result ); + + if ( result && ( pos.y() < (src->itemRect(result).top() + src->itemHeight(i)/2) ) ) + result = result->prev(); + else if ( !result && pos.y() > src->itemRect( last ).bottom() ) + result = last; + + return result; +} + +bool ListBoxDnd::canDecode( TQDragEnterEvent * event ) +{ + return ListBoxItemDrag::canDecode( event ); +} + + +// ------------------------------------------------------------------ +// The Dragobject Implementation ------------------------------------ +// ------------------------------------------------------------------ + +ListBoxItemDrag::ListBoxItemDrag( ListBoxItemList & items, bool sendPtr, TQListBox * parent, const char * name ) + : TQStoredDrag( "qt/listboxitem", parent, name ) +{ + // ### FIX! + TQByteArray data( sizeof( TQ_INT32 ) + sizeof( TQListBoxItem ) * items.count() ); + TQDataStream stream( data, IO_WriteOnly ); + + stream << items.count(); + stream << (TQ_UINT8) sendPtr; // just transfer item pointer; omit data + + TQListBoxItem * i = items.first(); + + if ( sendPtr ) { + + while ( i ) { + + stream << (TQ_ULONG) i; //###FIX: demands sizeof(ulong) >= sizeof(void*) + i = items.next(); + + } + + } else { + + while ( i ) { + + TQ_UINT8 b = 0; + + b = (TQ_UINT8) ( i->text() != TQString() ); // does item have text ? + stream << b; + if ( b ) { + stream << i->text(); + } + + b = (TQ_UINT8) ( !!i->pixmap() ); // does item have a pixmap ? + stream << b; + if ( b ) { + stream << ( *i->pixmap() ); + } + + stream << (TQ_UINT8) i->isSelectable(); + + i = items.next(); + } + + } + + setEncodedData( data ); +} + +bool ListBoxItemDrag::canDecode( TQDragMoveEvent * event ) +{ + return event->provides( "qt/listboxitem" ); +} + +bool ListBoxItemDrag::decode( TQDropEvent * event, TQListBox * parent, TQListBoxItem * after ) +{ + TQByteArray data = event->encodedData( "qt/listboxitem" ); + + if ( data.size() ) { + event->accept(); + TQDataStream stream( data, IO_ReadOnly ); + + int count = 0; + stream >> count; + + TQ_UINT8 recievePtr = 0; // data contains just item pointers; no data + stream >> recievePtr; + + TQListBoxItem * item = 0; + + if ( recievePtr ) { + + for( int i = 0; i < count; i++ ) { + + TQ_ULONG p = 0; //###FIX: demands sizeof(ulong) >= sizeof(void*) + stream >> p; + item = (TQListBoxItem *) p; + + parent->insertItem( item, after ); + + } + + } else { + + for ( int i = 0; i < count; i++ ) { + + TQ_UINT8 hasText = 0; + TQString text; + stream >> hasText; + if ( hasText ) { + stream >> text; + } + + TQ_UINT8 hasPixmap = 0; + TQPixmap pixmap; + stream >> hasPixmap; + if ( hasPixmap ) { + stream >> pixmap; + } + + TQ_UINT8 isSelectable = 0; + stream >> isSelectable; + + if ( hasPixmap ) { + item = new TQListBoxPixmap( parent, pixmap, text, after ); + } else { + item = new TQListBoxText( parent, text, after ); + } + + item->setSelectable( isSelectable ); + + } + + } + + return TRUE; + } + return FALSE; +} diff --git a/kdevdesigner/designer/listboxdnd.h b/kdevdesigner/designer/listboxdnd.h new file mode 100644 index 00000000..5abf792f --- /dev/null +++ b/kdevdesigner/designer/listboxdnd.h @@ -0,0 +1,64 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LISTBOXDND_H +#define LISTBOXDND_H + +#include <tqptrlist.h> +#include <tqlistbox.h> +#include "listdnd.h" + +typedef TQPtrList<TQListBoxItem> ListBoxItemList; + +class ListBoxDnd : public ListDnd +{ + Q_OBJECT + +public: + // dragModes are enumerated in ListDnd + ListBoxDnd( TQListBox * eventSource, const char * name = 0 ); + +signals: + void dropped( TQListBoxItem * ); + void dragged( TQListBoxItem * ); + +public slots: + void confirmDrop( TQListBoxItem * ); + +protected: + virtual bool dropEvent( TQDropEvent * event ); + virtual bool mouseMoveEvent( TQMouseEvent * event ); + virtual void updateLine( const TQPoint & pos ); + virtual bool canDecode( TQDragEnterEvent * event ); + +private: + TQListBoxItem * itemAt( TQPoint pos ); + int buildList( ListBoxItemList & list ); + void insertList( ListBoxItemList & list ); + void removeList( ListBoxItemList & list ); +}; + +#endif //LISTBOXDND_H diff --git a/kdevdesigner/designer/listboxeditor.ui b/kdevdesigner/designer/listboxeditor.ui new file mode 100644 index 00000000..df584ddf --- /dev/null +++ b/kdevdesigner/designer/listboxeditor.ui @@ -0,0 +1,457 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>ListBoxEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ListBoxEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>482</width> + <height>229</height> + </rect> + </property> + <property name="caption"> + <string>Edit Listbox</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Edit Listbox</b><p>Add, edit or delete items in the listbox.</p><p>Click the <b>New Item</b>-button to create a new listbox entry, then enter text and choose a pixmap.</p><p>Select an item from the list and click the <b>Delete Item</b>-button to remove the item from the list.</p></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="5" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonApply</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Apply all changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQListBox" row="0" column="0" rowspan="5" colspan="1"> + <property name="name"> + <cstring>preview</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Item</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The list of items.</string> + </property> + </widget> + <widget class="TQGroupBox" row="0" column="2" rowspan="5" colspan="1"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="title"> + <string>&Item Properties</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label2</cstring> + </property> + <property name="text"> + <string>&Pixmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemChoosePixmap</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="1"> + <property name="name"> + <cstring>itemPixmap</cstring> + </property> + <property name="text"> + <string>Label4</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="2"> + <property name="name"> + <cstring>itemDeletePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Delete the selected item's pixmap.</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="3"> + <property name="name"> + <cstring>itemChoosePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose a pixmap file for the selected item.</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>Label1</cstring> + </property> + <property name="text"> + <string>&Text:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemText</cstring> + </property> + </widget> + <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>itemText</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="toolTip" stdset="0"> + <string>Change text</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Change the selected item's text.</string> + </property> + </widget> + </grid> + </widget> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>itemNew</cstring> + </property> + <property name="text"> + <string>&New Item</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add an item</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Add a new item.</b><p>New items are appended to the list.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>itemDelete</cstring> + </property> + <property name="text"> + <string>&Delete Item</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Item</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Delete the selected item</string> + </property> + </widget> + <spacer row="2" column="1"> + <property name="name"> + <cstring>Vertical Spacing1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="3" column="1"> + <property name="name"> + <cstring>itemUp</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move up</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Moves the selected item up.</string> + </property> + </widget> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>itemDown</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move down</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Move the selected item down.</string> + </property> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>itemNew</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>insertNewItem()</slot> + </connection> + <connection> + <sender>itemDelete</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>deleteCurrentItem()</slot> + </connection> + <connection> + <sender>itemText</sender> + <signal>textChanged( const TQString & )</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>currentTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>buttonApply</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>applyClicked()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>cancelClicked()</slot> + </connection> + <connection> + <sender>itemChoosePixmap</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>choosePixmap()</slot> + </connection> + <connection> + <sender>itemDeletePixmap</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>deletePixmap()</slot> + </connection> + <connection> + <sender>itemUp</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>moveItemUp()</slot> + </connection> + <connection> + <sender>itemDown</sender> + <signal>clicked()</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>moveItemDown()</slot> + </connection> + <connection> + <sender>preview</sender> + <signal>selectionChanged(TQListBoxItem*)</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>currentItemChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>preview</sender> + <signal>currentChanged( TQListBoxItem * )</signal> + <receiver>ListBoxEditorBase</receiver> + <slot>currentItemChanged(TQListBoxItem*)</slot> + </connection> +</connections> +<tabstops> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>preview</tabstop> + <tabstop>itemNew</tabstop> + <tabstop>itemDelete</tabstop> + <tabstop>itemUp</tabstop> + <tabstop>itemDown</tabstop> + <tabstop>itemText</tabstop> + <tabstop>itemDeletePixmap</tabstop> + <tabstop>itemChoosePixmap</tabstop> + <tabstop>helpButton</tabstop> + <tabstop>buttonApply</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">insertNewItem()</slot> + <slot access="protected">deleteCurrentItem()</slot> + <slot access="protected">currentItemChanged( TQListBoxItem * )</slot> + <slot access="protected">currentTextChanged( const TQString & )</slot> + <slot access="protected">okClicked()</slot> + <slot access="protected">cancelClicked()</slot> + <slot access="protected">applyClicked()</slot> + <slot access="protected">choosePixmap()</slot> + <slot access="protected">deletePixmap()</slot> + <slot access="protected">moveItemUp()</slot> + <slot access="protected">moveItemDown()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/listboxeditorimpl.cpp b/kdevdesigner/designer/listboxeditorimpl.cpp new file mode 100644 index 00000000..01dfa64e --- /dev/null +++ b/kdevdesigner/designer/listboxeditorimpl.cpp @@ -0,0 +1,245 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "listboxeditorimpl.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "pixmapchooser.h" +#include "command.h" +#include "listboxdnd.h" +#include "listboxrename.h" + +#include <klineedit.h> +#include <tqlabel.h> +#include <tqlistbox.h> +#include <tqpushbutton.h> +#include <tqcheckbox.h> + +#include <tdelocale.h> + +ListBoxEditor::ListBoxEditor( TQWidget *parent, TQWidget *editWidget, FormWindow *fw ) + : ListBoxEditorBase( parent, 0, TRUE ), formwindow( fw ) +{ + connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + listbox = (TQListBox*)editWidget; + + itemText->setText( "" ); + itemText->setEnabled( FALSE ); + itemPixmap->setText( "" ); + itemChoosePixmap->setEnabled( FALSE ); + itemDeletePixmap->setEnabled( FALSE ); + + TQListBoxItem *i = 0; + for ( i = listbox->firstItem(); i; i = i->next() ) { + if ( i->pixmap() ) + (void)new TQListBoxPixmap( preview, *i->pixmap(), i->text() ); + else + (void)new TQListBoxText( preview, i->text() ); + } + + if ( preview->firstItem() ) + preview->setCurrentItem( preview->firstItem() ); + + ListBoxDnd *editorDnd = new ListBoxDnd( preview ); + editorDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move ); + TQObject::connect( editorDnd, TQT_SIGNAL( dropped( TQListBoxItem * ) ), + editorDnd, TQT_SLOT( confirmDrop( TQListBoxItem * ) ) ); + + ListBoxRename *editorRename = new ListBoxRename( preview ); + + TQObjectList *l = parent->queryList( TQLINEEDIT_OBJECT_NAME_STRING, "itemText" ); + TQObjectListIt it( *l ); + TQObject *obj; + while ( (obj = it.current()) != 0 ) { + ++it; + TQObject::connect( editorRename, + TQT_SIGNAL( itemTextChanged( const TQString & ) ), + obj, + TQT_SLOT( setText( const TQString & ) ) ); + } + delete l; + +} + +void ListBoxEditor::insertNewItem() +{ + TQListBoxItem *i = new TQListBoxText( preview, i18n("New Item") ); + preview->setCurrentItem( i ); + preview->setSelected( i, TRUE ); + itemText->setFocus(); + itemText->selectAll(); +} + +void ListBoxEditor::deleteCurrentItem() +{ + delete preview->item( preview->currentItem() ); + if ( preview->currentItem() != -1 ) + preview->setSelected( preview->currentItem(), TRUE ); +} + +void ListBoxEditor::currentItemChanged( TQListBoxItem *i ) +{ + itemText->blockSignals( TRUE ); + itemText->setText( "" ); + itemPixmap->setText( "" ); + itemText->blockSignals( FALSE ); + + if ( !i ) { + itemText->setEnabled( FALSE ); + itemChoosePixmap->setEnabled( FALSE ); + itemDeletePixmap->setEnabled( FALSE ); + return; + } + + itemText->blockSignals( TRUE ); + itemText->setEnabled( TRUE ); + itemChoosePixmap->setEnabled( TRUE ); + itemDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() ); + + itemText->setText( i->text() ); + if ( i->pixmap() ) + itemPixmap->setPixmap( *i->pixmap() ); + itemText->blockSignals( FALSE ); +} + +void ListBoxEditor::currentTextChanged( const TQString &txt ) +{ + if ( preview->currentItem() == -1 ) + return; + + preview->blockSignals( TRUE ); + if ( preview->item( preview->currentItem() )->pixmap() ) + preview->changeItem( *preview->item( preview->currentItem() )->pixmap(), txt, preview->currentItem() ); + else + preview->changeItem( txt, preview->currentItem() ); + preview->blockSignals( FALSE ); +} + +void ListBoxEditor::okClicked() +{ + applyClicked(); + accept(); +} + +void ListBoxEditor::cancelClicked() +{ + reject(); +} + +void ListBoxEditor::applyClicked() +{ + TQListBoxItem *i = 0; + TQValueList<PopulateListBoxCommand::Item> items; + for ( i = preview->firstItem(); i; i = i->next() ) { + PopulateListBoxCommand::Item item; + if ( i->pixmap() ) + item.pix = *i->pixmap(); + item.text = i->text(); + items.append( item ); + } + + PopulateListBoxCommand *cmd = new PopulateListBoxCommand( i18n( "Edit the Items of '%1'" ).arg( listbox->name() ), + formwindow, listbox, items ); + cmd->execute(); + formwindow->commandHistory()->addCommand( cmd ); +} + +void ListBoxEditor::choosePixmap() +{ + if ( preview->currentItem() == -1 ) + return; + + TQPixmap pix; + if ( preview->item( preview->currentItem() )->pixmap() ) + pix = qChoosePixmap( this, formwindow, *preview->item( preview->currentItem() )->pixmap() ); + else + pix = qChoosePixmap( this, formwindow, TQPixmap() ); + + if ( pix.isNull() ) + return; + + TQString txt = preview->item( preview->currentItem() )->text(); + preview->changeItem( pix, txt, preview->currentItem() ); + itemDeletePixmap->setEnabled( TRUE ); +} + +void ListBoxEditor::moveItemUp() +{ + if ( preview->currentItem() < 1 ) + return; + + TQListBoxItem *i = preview->item( preview->currentItem() ); + bool hasPix = (i->pixmap() != 0); + TQPixmap pix; + if ( hasPix ) + pix = *i->pixmap(); + TQString txt = i->text(); + + TQListBoxItem *p = i->prev(); + if ( p->pixmap() ) + preview->changeItem( *p->pixmap(), p->text(), preview->currentItem() ); + else + preview->changeItem( p->text(), preview->currentItem() ); + + if ( hasPix ) + preview->changeItem( pix, txt, preview->currentItem() - 1 ); + else + preview->changeItem( txt, preview->currentItem() - 1 ); +} + +void ListBoxEditor::moveItemDown() +{ + if ( preview->currentItem() == -1 || preview->currentItem() > (int)preview->count() - 2 ) + return; + + TQListBoxItem *i = preview->item( preview->currentItem() ); + bool hasPix = (i->pixmap() != 0); + TQPixmap pix; + if ( hasPix ) + pix = *i->pixmap(); + TQString txt = i->text(); + + TQListBoxItem *n = i->next(); + if ( n->pixmap() ) + preview->changeItem( *n->pixmap(), n->text(), preview->currentItem() ); + else + preview->changeItem( n->text(), preview->currentItem() ); + + if ( hasPix ) + preview->changeItem( pix, txt, preview->currentItem() + 1 ); + else + preview->changeItem( txt, preview->currentItem() + 1 ); +} + +void ListBoxEditor::deletePixmap() +{ + if ( preview->currentItem() == -1 ) + return; + + TQListBoxItem *i = preview->item( preview->currentItem() ); + preview->changeItem( i->text(), preview->currentItem() ); + itemDeletePixmap->setEnabled( FALSE ); +} diff --git a/kdevdesigner/designer/listboxeditorimpl.h b/kdevdesigner/designer/listboxeditorimpl.h new file mode 100644 index 00000000..28ca0254 --- /dev/null +++ b/kdevdesigner/designer/listboxeditorimpl.h @@ -0,0 +1,62 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LISTBOXEDITORIMPL_H +#define LISTBOXEDITORIMPL_H + +class TQListBox; +class FormWindow; + +#include "listboxeditor.h" + +class ListBoxEditor : public ListBoxEditorBase +{ + Q_OBJECT + + +public: + ListBoxEditor( TQWidget *parent, TQWidget *editWidget, FormWindow *fw ); + +protected slots: + void insertNewItem(); + void deleteCurrentItem(); + void currentItemChanged( TQListBoxItem * ); + void currentTextChanged( const TQString & ); + void okClicked(); + void cancelClicked(); + void applyClicked(); + void choosePixmap(); + void moveItemUp(); + void moveItemDown(); + void deletePixmap(); + +private: + TQListBox *listbox; + FormWindow *formwindow; + +}; + +#endif diff --git a/kdevdesigner/designer/listboxrename.cpp b/kdevdesigner/designer/listboxrename.cpp new file mode 100644 index 00000000..0a32d292 --- /dev/null +++ b/kdevdesigner/designer/listboxrename.cpp @@ -0,0 +1,157 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqheader.h> +#include <tqlineedit.h> +#include <tqtimer.h> +#include "listboxrename.h" + +class EditableListBoxItem : public TQListBoxItem +{ +public: + void setText( const TQString & text ) + { + TQListBoxItem::setText( text ); + } +}; + +ListBoxRename::ListBoxRename( TQListBox * eventSource, const char * name ) + : TQObject( eventSource, name ), + clickedItem( 0 ), activity( FALSE ) +{ + src = eventSource; + src->installEventFilter( this ); + ed = new TQLineEdit( src->viewport() ); + ed->hide(); + ed->setFrame( FALSE ); + + TQObject::connect( ed, TQT_SIGNAL( returnPressed() ), + this, TQT_SLOT( renameClickedItem() ) ); +} + +bool ListBoxRename::eventFilter( TQObject *, TQEvent * event ) +{ + switch ( event->type() ) { + + case TQEvent::MouseButtonPress: + { + TQPoint pos = ((TQMouseEvent *) event)->pos(); + + if ( clickedItem && + clickedItem->isSelected() && + (clickedItem == src->itemAt( pos )) ) { + TQTimer::singleShot( 500, this, TQT_SLOT( showLineEdit() ) ); + activity = FALSE; // no drags or clicks for 500 ms before we start the renaming + } else { // new item clicked + activity = TRUE; + clickedItem = src->itemAt( pos ); + ed->hide(); + } + } + break; + + case TQEvent::MouseMove: + + if ( ((TQMouseEvent *) event)->state() & Qt::LeftButton ) { + activity = TRUE; // drag + } + break; + + case TQEvent::KeyPress: + + switch ( ((TQKeyEvent *) event)->key() ) { + + case TQt::Key_F2: + + activity = FALSE; + clickedItem = src->item( src->currentItem() ); + showLineEdit(); + break; + + case TQt::Key_Escape: + if ( !ed->isHidden() ) { + hideLineEdit(); // abort rename + return TRUE; + } + break; + + case TQt::Key_Up: + case TQt::Key_Down: + case TQt::Key_PageUp: + case TQt::Key_PageDown: + + if ( !ed->isHidden() ) + return TRUE; // Filter out the keystrokes + break; + + } + break; + + case TQEvent::Resize: + + if ( clickedItem && ed && !ed->isHidden() ) { + TQRect rect = src->itemRect( clickedItem ); + ed->resize( rect.right() - rect.left() - 1, + rect.bottom() - rect.top() - 1 ); + } + break; + + default: + break; + } + + return FALSE; +} + +void ListBoxRename::showLineEdit() +{ + if ( !clickedItem || activity ) + return; + TQRect rect = src->itemRect( clickedItem ); + ed->resize( rect.right() - rect.left() - 1, + rect.bottom() - rect.top() - 1 ); + ed->move( rect.left() + 1, rect.top() + 1 ); + ed->setText( clickedItem->text() ); + ed->selectAll(); + ed->show(); + ed->setFocus(); +} + +void ListBoxRename::hideLineEdit() +{ + ed->hide(); + clickedItem = 0; + src->setFocus(); +} + +void ListBoxRename::renameClickedItem() +{ + if ( clickedItem && ed ) { + ( (EditableListBoxItem *) clickedItem )->setText( ed->text() ); + emit itemTextChanged( ed->text() ); + } + hideLineEdit(); +} diff --git a/kdevdesigner/designer/listboxrename.h b/kdevdesigner/designer/listboxrename.h new file mode 100644 index 00000000..ec666f70 --- /dev/null +++ b/kdevdesigner/designer/listboxrename.h @@ -0,0 +1,58 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LISTBOXRENAME_H +#define LISTBOXRENAME_H + +#include <tqobject.h> +#include <tqlistbox.h> + +class TQLineEdit; + +class ListBoxRename : public TQObject +{ + Q_OBJECT + +public: + ListBoxRename( TQListBox * eventSource, const char * name = 0 ); + bool eventFilter( TQObject *, TQEvent * event ); + +signals: + void itemTextChanged( const TQString & ); + +public slots: + void showLineEdit(); + void hideLineEdit(); + void renameClickedItem(); + +private: + TQListBoxItem * clickedItem; + TQListBox * src; + TQLineEdit * ed; + bool activity; +}; + +#endif //LISTBOXRENAME_H diff --git a/kdevdesigner/designer/listdnd.cpp b/kdevdesigner/designer/listdnd.cpp new file mode 100644 index 00000000..8431fd18 --- /dev/null +++ b/kdevdesigner/designer/listdnd.cpp @@ -0,0 +1,142 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "listdnd.h" +#include <tqwidget.h> +#include <tqpainter.h> + +ListDnd::ListDnd( TQScrollView * eventSource, const char * name ) + : TQObject( eventSource, name ), + dragInside( FALSE ), dragDelete( TRUE ), dropConfirmed( FALSE ), dMode( Both ) +{ + src = eventSource; + src->setAcceptDrops( TRUE ); + src->installEventFilter( this ); + src->viewport()->installEventFilter( this ); + + line = new TQWidget( src->viewport(), 0, TQt::WStyle_NoBorder | WStyle_StaysOnTop ); + line->setBackgroundColor( TQt::black ); + line->resize( src->viewport()->width(), 2 ); + line->hide(); +} + +void ListDnd::setDragMode( int mode ) +{ + dMode = mode; +} + +int ListDnd::dragMode() const +{ + return dMode; +} + +bool ListDnd::eventFilter( TQObject *, TQEvent * event ) +{ + switch ( event->type() ) { + case TQEvent::DragEnter: + return dragEnterEvent( (TQDragEnterEvent *) event ); + case TQEvent::DragLeave: + return dragLeaveEvent( (TQDragLeaveEvent *) event ); + case TQEvent::DragMove: + return dragMoveEvent( (TQDragMoveEvent *) event ); + case TQEvent::Drop: + return dropEvent( (TQDropEvent *) event ); + case TQEvent::MouseButtonPress: + return mousePressEvent( (TQMouseEvent *) event ); + case TQEvent::MouseMove: + return mouseMoveEvent( (TQMouseEvent *) event ); + default: + break; + } + return FALSE; +} + + +bool ListDnd::dragEnterEvent( TQDragEnterEvent * event ) +{ + if ( dMode == None ) { + return TRUE; + } + + bool ok = ( ( ( dMode & Both ) == Both ) || + ( ( dMode & Internal ) && ( event->source() == src ) ) || + ( ( dMode & External ) && ( event->source() != src ) ) ); + + if ( ok && canDecode( event ) ) { + event->accept(); + dragInside = TRUE; + if ( !( dMode & NullDrop ) ) { + updateLine( event->pos() ); + line->show(); + } + } + return TRUE; +} + +bool ListDnd::dragLeaveEvent( TQDragLeaveEvent * ) +{ + dragInside = FALSE; + line->hide(); + return TRUE; +} + +bool ListDnd::dragMoveEvent( TQDragMoveEvent * event ) +{ + if ( dragInside && dMode && !( dMode & NullDrop ) ) { + updateLine( event->pos() ); + } + return TRUE; +} + +bool ListDnd::dropEvent( TQDropEvent * ) +{ + // do nothing + return FALSE; +} + +bool ListDnd::mousePressEvent( TQMouseEvent * event ) +{ + if ( event->button() == Qt::LeftButton ) + mousePressPos = event->pos(); + return FALSE; +} + +bool ListDnd::mouseMoveEvent( TQMouseEvent * ) +{ + // do nothing + return FALSE; +} + +void ListDnd::updateLine( const TQPoint & ) +{ + // do nothing +} + +bool ListDnd::canDecode( TQDragEnterEvent * ) +{ + // do nothing + return FALSE; +} diff --git a/kdevdesigner/designer/listdnd.h b/kdevdesigner/designer/listdnd.h new file mode 100644 index 00000000..39e1af11 --- /dev/null +++ b/kdevdesigner/designer/listdnd.h @@ -0,0 +1,64 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LISTDND_H +#define LISTDND_H + +#include <tqobject.h> +#include <tqscrollview.h> + +class ListDnd : public TQObject +{ + Q_OBJECT + +public: + enum DragMode { None = 0, External = 1, Internal = 2, Both = 3, Move = 4, NullDrop = 8 }; + ListDnd( TQScrollView * eventSource, const char * name = 0 ); + void setDragMode( int mode ); + int dragMode() const; + bool eventFilter( TQObject *, TQEvent * event ); + +protected: + virtual bool dragEnterEvent( TQDragEnterEvent * event ); + virtual bool dragLeaveEvent( TQDragLeaveEvent * ); + virtual bool dragMoveEvent( TQDragMoveEvent * event ); + virtual bool dropEvent( TQDropEvent * event ); + virtual bool mousePressEvent( TQMouseEvent * event ); + virtual bool mouseMoveEvent( TQMouseEvent * event ); + virtual void updateLine( const TQPoint & dragPos ); + virtual bool canDecode( TQDragEnterEvent * event ); + + TQScrollView * src; + TQWidget * line; + TQPoint mousePressPos; + TQPoint dragPos; + bool dragInside; + bool dragDelete; + bool dropConfirmed; + int dMode; +}; + +#endif // LISTDND_H diff --git a/kdevdesigner/designer/listeditor.ui b/kdevdesigner/designer/listeditor.ui new file mode 100644 index 00000000..c477ff1a --- /dev/null +++ b/kdevdesigner/designer/listeditor.ui @@ -0,0 +1,179 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ListEditor</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ListEditor</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>331</width> + <height>301</height> + </rect> + </property> + <property name="caption"> + <string>Edit</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListView" row="0" column="0" rowspan="5" colspan="1"> + <column> + <property name="text"> + <string>Column 1</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizeable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>listview</cstring> + </property> + <property name="selectionMode"> + <enum>Extended</enum> + </property> + <property name="resizeMode"> + <enum>AllColumns</enum> + </property> + </widget> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>&Add</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + <widget class="TQPushButton" row="2" column="1"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>Re&name</string> + </property> + </widget> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>PushButton4</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + </widget> + <spacer row="3" column="1"> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>PushButton1</sender> + <signal>clicked()</signal> + <receiver>ListEditor</receiver> + <slot>addItem()</slot> + </connection> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>ListEditor</receiver> + <slot>removeItems()</slot> + </connection> + <connection> + <sender>PushButton4</sender> + <signal>clicked()</signal> + <receiver>ListEditor</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>listview</sender> + <signal>itemRenamed(TQListViewItem*,int)</signal> + <receiver>ListEditor</receiver> + <slot>renamed(TQListViewItem*)</slot> + </connection> + <connection> + <sender>PushButton3</sender> + <signal>clicked()</signal> + <receiver>ListEditor</receiver> + <slot>renameItem()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">listeditor.ui.h</include> +</includes> +<forwards> + <forward>class TQStringList;</forward> +</forwards> +<Q_SLOTS> + <slot>init()</slot> + <slot>setList( const TQStringList & l )</slot> + <slot>addItem()</slot> + <slot>renamed( TQListViewItem * i )</slot> + <slot>removeItems()</slot> + <slot returnType="TQStringList">items()</slot> + <slot>renameItem()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/listeditor.ui.h b/kdevdesigner/designer/listeditor.ui.h new file mode 100644 index 00000000..7f179cef --- /dev/null +++ b/kdevdesigner/designer/listeditor.ui.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename slots use TQt Designer which will +** update this file, preserving your code. Create an init() slot in place of +** a constructor, and a destroy() slot in place of a destructor. +*****************************************************************************/ + +#include <tqheader.h> +#include <tqapplication.h> + +void ListEditor::init() +{ + listview->header()->hide(); + listview->setSorting( -1 ); + listview->setDefaultRenameAction( TQListView::Accept ); +} + +void ListEditor::setList( const TQStringList &l ) +{ + TQListViewItem *i = 0; + for ( TQStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) { + i = new TQListViewItem( listview, i ); + i->setText( 0, *it ); + i->setRenameEnabled( 0, TRUE ); + } +} + +void ListEditor::addItem() +{ + TQListViewItem *i = new TQListViewItem( listview, listview->lastItem() ); + i->setRenameEnabled( 0, TRUE ); + tqApp->processEvents(); + i->startRename( 0 ); +} + +void ListEditor::renamed( TQListViewItem *i ) +{ + if ( i && i->text( 0 ).isEmpty() ) + i->startRename( 0 ); +} + +void ListEditor::removeItems() +{ + TQListViewItemIterator it( listview ); + TQListViewItem *i = 0; + while ( ( i = it.current() ) ) { + ++it; + if ( i->isSelected() ) + delete i; + } +} + +TQStringList ListEditor::items() +{ + TQStringList l; + TQListViewItemIterator it( listview ); + TQListViewItem *i = 0; + while ( ( i = it.current() ) ) { + ++it; + if ( !i->text( 0 ).isEmpty() ) + l << i->text( 0 ); + } + return l; +} + +void ListEditor::renameItem() +{ + TQListViewItem *i = listview->currentItem(); + if ( i ) + i->startRename( 0 ); +} diff --git a/kdevdesigner/designer/listviewdnd.cpp b/kdevdesigner/designer/listviewdnd.cpp new file mode 100644 index 00000000..32dcc6d5 --- /dev/null +++ b/kdevdesigner/designer/listviewdnd.cpp @@ -0,0 +1,432 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "listviewdnd.h" +#include <tqwidget.h> +#include <tqheader.h> +#include <tqpainter.h> +#include <tqdragobject.h> +#include <tqvaluelist.h> + +// The Dragobject Declaration --------------------------------------- +class ListViewItemDrag : public TQStoredDrag +{ +public: + enum DropRelation { Sibling, Child }; + ListViewItemDrag( ListViewItemList & items, TQWidget * parent = 0, const char * name = 0 ); + ~ListViewItemDrag() {}; + static bool canDecode( TQDragMoveEvent * event ); + static bool decode( TQDropEvent * event, TQListView * parent, TQListViewItem * insertPoint, DropRelation dr ); +}; +// ------------------------------------------------------------------ + +ListViewDnd::ListViewDnd( TQListView * eventSource, const char * name ) + : ListDnd( eventSource, name ) { } + +void ListViewDnd::confirmDrop( TQListViewItem * ) +{ + dropConfirmed = TRUE; +} + +bool ListViewDnd::dropEvent( TQDropEvent * event ) +{ + if ( dragInside ) { + + if ( dMode & NullDrop ) { // combined with Move, a NullDrop will delete an item + event->accept(); + emit dropped( 0 ); // a NullDrop + return TRUE; + } + + TQPoint pos = event->pos(); + + ListViewItemDrag::DropRelation dr = ListViewItemDrag::Sibling; + TQListViewItem *item = itemAt( pos ); + int dpos = dropDepth( item, pos ); + + if ( item ) { + if ( dpos > item->depth() && !(dMode & Flat) ) { + // Child node + dr = ListViewItemDrag::Child; + } else if ( dpos < item->depth() ) { + // Parent(s) Sibling + while ( item && (item->depth() > dpos) ) + item = item->parent(); + } + } + + if ( ListViewItemDrag::decode( event, (TQListView *) src, item, dr ) ) { + event->accept(); + emit dropped( 0 ); // Use ID instead of item? + } + } + + line->hide(); + dragInside = FALSE; + + return TRUE; +} + +bool ListViewDnd::mouseMoveEvent( TQMouseEvent * event ) +{ + if ( event->state() & Qt::LeftButton ) { + if ( ( event->pos() - mousePressPos ).manhattanLength() > 3 ) { + ListViewItemList list; + + if ( dMode & Flat ) + buildFlatList( list ); + else + buildTreeList( list ); + + ListViewItemDrag * dragobject = new ListViewItemDrag( list, (TQListView *) src ); + + if ( dMode & Move ) { + disabledItems = list; + setVisibleItems( FALSE ); + } + + dragobject->dragCopy(); + + if ( dMode & Move ) { + // Did the target accept the drop? + if ( dropConfirmed ) { + // Shouldn't autoDelete handle this? + for( list.first(); list.current(); list.next() ) + delete list.current(); + dropConfirmed = FALSE; + } else { + // Reenable disabled items since + // drag'n'drop was aborted + setVisibleItems( TRUE ); + } + disabledItems.clear(); + } + } + } + return FALSE; +} + +int ListViewDnd::buildFlatList( ListViewItemList & list ) +{ + bool addKids = FALSE; + TQListViewItem *nextSibling = 0; + TQListViewItem *nextParent = 0; + TQListViewItemIterator it = ((TQListView *)src)->firstChild(); + for ( ; *it; it++ ) { + // Hit the nextSibling, turn of child processing + if ( (*it) == nextSibling ) + addKids = FALSE; + + if ( (*it)->isSelected() ) { + if ( (*it)->childCount() == 0 ) { + // Selected, no children + list.append( *it ); + } else if ( !addKids ) { + // Children processing not set, so set it + // Also find the item were we shall quit + // processing children...if any such item + addKids = TRUE; + nextSibling = (*it)->nextSibling(); + nextParent = (*it)->parent(); + while ( nextParent && !nextSibling ) { + nextSibling = nextParent->nextSibling(); + nextParent = nextParent->parent(); + } + } + } else if ( ((*it)->childCount() == 0) && addKids ) { + // Leaf node, and we _do_ process children + list.append( *it ); + } + } + return list.count(); +} + +int ListViewDnd::buildTreeList( ListViewItemList & list ) +{ + TQListViewItemIterator it = ((TQListView *)src)->firstChild(); + for ( ; *it; it++ ) { + if ( (*it)->isSelected() ) + list.append( *it ); + } + return list.count(); +} + +void ListViewDnd::setVisibleItems( bool b ) +{ + if ( disabledItems.isEmpty() ) + return; + + disabledItems.first(); + do { + disabledItems.current()->setVisible( b ); + } while ( disabledItems.next() ); +} + +void ListViewDnd::updateLine( const TQPoint & dragPos ) +{ + TQListViewItem * item = itemAt(dragPos); + TQListView * src = (TQListView *) this->src; + + int ypos = item ? + ( src->itemRect( item ).bottom() - ( line->height() / 2 ) ) : + ( src->itemRect( src->firstChild() ).top() ); + + int xpos = dropDepth( item, dragPos ) * src->treeStepSize(); + line->resize( src->viewport()->width() - xpos, line->height() ); + line->move( xpos, ypos ); +} + +TQListViewItem * ListViewDnd::itemAt( TQPoint pos ) +{ + TQListView * src = (TQListView *) this->src; + int headerHeight = (int)(src->header()->height()); + pos.ry() -= headerHeight; + TQListViewItem * result = src->itemAt( pos ); + + if ( result && ( pos.ry() < (src->itemPos(result) + result->height()/2) ) ) + result = result->itemAbove(); + + // Wind back if has parent, and we're in flat mode + while ( result && result->parent() && (dMode & Flat) ) + result = result->parent(); + + // Wind back if has parent, and we're in flat mode + while ( result && !result->isVisible() && result->parent() ) + result = result->parent(); + + if ( !result && src->firstChild() && (pos.y() > src->itemRect(src->firstChild()).bottom()) ) { + result = src->lastItem(); + if ( !result->isVisible() ) + // Handle special case where last item is actually hidden + result = result->itemAbove(); + } + + return result; +} + +int ListViewDnd::dropDepth( TQListViewItem * item, TQPoint pos ) +{ + if ( !item || (dMode & Flat) ) + return 0; + + int result = 0; + int itemDepth = item->depth(); + int indentSize = ((TQListView *)src)->treeStepSize(); + int itemLeft = indentSize * itemDepth; + int childMargin = indentSize*2; + if ( pos.x() > itemLeft + childMargin ) { + result = itemDepth + 1; + } else if ( pos.x() < itemLeft ) { + result = pos.x() / indentSize; + } else { + result = itemDepth; + } + return result; +} + +bool ListViewDnd::canDecode( TQDragEnterEvent * event ) +{ + return ListViewItemDrag::canDecode( event ); +} + +// ------------------------------------------------------------------ +// The Dragobject Implementation ------------------------------------ +// ------------------------------------------------------------------ + +TQDataStream & operator<< ( TQDataStream & stream, const TQListViewItem & item ); +TQDataStream & operator>> ( TQDataStream & stream, TQListViewItem & item ); + +ListViewItemDrag::ListViewItemDrag( ListViewItemList & items, TQWidget * parent, const char * name ) + : TQStoredDrag( "qt/listviewitem", parent, name ) +{ + // ### FIX! + TQByteArray data( sizeof( TQ_INT32 ) + sizeof( TQListViewItem ) * items.count() ); + TQDataStream stream( data, IO_WriteOnly ); + + stream << items.count(); + + TQListViewItem *i = items.first(); + while ( i ) { + stream << *i; + i = items.next(); + } + + setEncodedData( data ); +} + +bool ListViewItemDrag::canDecode( TQDragMoveEvent * event ) +{ + return event->provides( "qt/listviewitem" ); +} + +bool ListViewItemDrag::decode( TQDropEvent * event, TQListView * parent, TQListViewItem * insertPoint, DropRelation dr ) +{ + TQByteArray data = event->encodedData( "qt/listviewitem" ); + TQListViewItem* itemParent = insertPoint ? insertPoint->parent() : 0; + + // Change from sibling (default) to child creation + if ( insertPoint && dr == Child ) { + itemParent = insertPoint; + insertPoint = 0; + } + + if ( data.size() ) { + event->accept(); + TQDataStream stream( data, IO_ReadOnly ); + + int count = 0; + stream >> count; + + for( int i = 0; i < count; i++ ) { + if ( itemParent ) { + insertPoint = new TQListViewItem( itemParent, insertPoint ); + itemParent->setOpen( TRUE ); + } else { // No parent for insertPoint, use TQListView + insertPoint = new TQListViewItem( parent, insertPoint ); + } + stream >> *insertPoint; + } + return TRUE; + } + return FALSE; +} + + +TQDataStream & operator<< ( TQDataStream & stream, const TQListViewItem & item ) +{ + int columns = item.listView()->columns(); + stream << columns; + + TQ_UINT8 b = 0; + + int i; + for ( i = 0; i < columns; i++ ) { + b = (TQ_UINT8) ( item.text( i ) != TQString() ); // does column i have a string ? + stream << b; + if ( b ) { + stream << item.text( i ); + } + } + + for ( i = 0; i < columns; i++ ) { + b = (TQ_UINT8) ( !!item.pixmap( i ) ); // does column i have a pixmap ? + stream << b; + if ( b ) { + stream << ( *item.pixmap( i ) ); + } + } + + stream << (TQ_UINT8) item.isOpen(); + stream << (TQ_UINT8) item.isSelectable(); + stream << (TQ_UINT8) item.isExpandable(); + stream << (TQ_UINT8) item.dragEnabled(); + stream << (TQ_UINT8) item.dropEnabled(); + stream << (TQ_UINT8) item.isVisible(); + + for ( i = 0; i < columns; i++ ) { + stream << (TQ_UINT8) item.renameEnabled( i ); + } + + stream << (TQ_UINT8) item.multiLinesEnabled(); + stream << item.childCount(); + + if ( item.childCount() > 0 ) { + TQListViewItem * child = item.firstChild(); + while ( child ) { + stream << ( *child ); // recursive call + child = child->nextSibling(); + } + } + + return stream; +} + +TQDataStream & operator>> ( TQDataStream & stream, TQListViewItem & item ) +{ + TQ_INT32 columns; + stream >> columns; + + TQ_UINT8 b = 0; + + TQString text; + int i; + for ( i = 0; i < columns; i++ ) { + stream >> b; + if ( b ) { // column i has string ? + stream >> text; + item.setText( i, text ); + } + } + + TQPixmap pixmap; + for ( i = 0; i < columns; i++ ) { + stream >> b; // column i has pixmap ? + if ( b ) { + stream >> pixmap; + item.setPixmap( i, pixmap ); + } + } + + stream >> b; + item.setOpen( b ); + + stream >> b; + item.setSelectable( b ); + + stream >> b; + item.setExpandable( b ); + + stream >> b; + item.setDragEnabled( b ); + + stream >> b; + item.setDropEnabled( b ); + + stream >> b; + item.setVisible( b ); + + for ( i = 0; i < columns; i++ ) { + stream >> b; + item.setRenameEnabled( i, b ); + } + + stream >> b; + item.setMultiLinesEnabled( b ); + + int childCount; + stream >> childCount; + + TQListViewItem *child = 0; + TQListViewItem *prevchild = 0; + for ( i = 0; i < childCount; i++ ) { + child = new TQListViewItem( &item, prevchild ); + stream >> ( *child ); + item.insertItem( child ); + prevchild = child; + } + + return stream; +} diff --git a/kdevdesigner/designer/listviewdnd.h b/kdevdesigner/designer/listviewdnd.h new file mode 100644 index 00000000..5a59f4ad --- /dev/null +++ b/kdevdesigner/designer/listviewdnd.h @@ -0,0 +1,67 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LISTVIEWDND_H +#define LISTVIEWDND_H + +#include <tqptrlist.h> +#include <tqlistview.h> +#include "listdnd.h" + +class TQWidget; +class TQListView; +typedef TQPtrList<TQListViewItem> ListViewItemList; + +class ListViewDnd : public ListDnd +{ + Q_OBJECT + +public: + enum DragMode { Flat = 16 }; // see ListDnd::DragMode + + ListViewDnd( TQListView * eventSource, const char * name = 0 ); + +signals: + void dropped( TQListViewItem * ); + +public slots: + void confirmDrop( TQListViewItem * ); + +protected: + virtual bool dropEvent( TQDropEvent * event ); + virtual bool mouseMoveEvent( TQMouseEvent * event ); + virtual void updateLine( const TQPoint & pos ); + virtual bool canDecode( TQDragEnterEvent * event ); +private: + TQListViewItem * itemAt( TQPoint pos ); + int dropDepth( TQListViewItem * item, TQPoint pos ); + int buildFlatList( ListViewItemList & list ); + int buildTreeList( ListViewItemList & list ); + void setVisibleItems( bool b ); + ListViewItemList disabledItems; +}; + +#endif //LISTVIEWDND_H diff --git a/kdevdesigner/designer/listvieweditor.ui b/kdevdesigner/designer/listvieweditor.ui new file mode 100644 index 00000000..8a0abe14 --- /dev/null +++ b/kdevdesigner/designer/listvieweditor.ui @@ -0,0 +1,935 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>ListViewEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ListViewEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>567</width> + <height>398</height> + </rect> + </property> + <property name="caption"> + <string>Edit Listview</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Edit Listview</b><p>Use the controls on the <b>Items</b>-tab to add, edit or delete items in the listview. Change the column configuration of the listview using the controls on the <b>Columns</b>-tab.</p>Click the <b>New Item</b>-button to create a new item, then enter text and add a pixmap.</p><p>Select an item from the list and click the <b>Delete Item</b>-button to remove the item from the list.</p></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTabWidget"> + <property name="name"> + <cstring>tabWidget</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget10</cstring> + </property> + <attribute name="title"> + <string>&Items</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton" row="2" column="1"> + <property name="name"> + <cstring>itemDelete</cstring> + </property> + <property name="text"> + <string>&Delete Item</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete item</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Deletes the selected item.</b><p>Any sub-items are also deleted.</p></string> + </property> + </widget> + <widget class="TQGroupBox" row="0" column="2" rowspan="8" colspan="1"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Item Properties</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>Label2</cstring> + </property> + <property name="text"> + <string>Pi&xmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemChoosePixmap</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label1</cstring> + </property> + <property name="text"> + <string>&Text:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemText</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="1" column="1"> + <property name="name"> + <cstring>itemText</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="toolTip" stdset="0"> + <string>Change text</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Change the text of the item.</b><p>The text will be changed in the current column of the selected item.</p></string> + </property> + </widget> + <widget class="TQSpinBox" row="0" column="1"> + <property name="name"> + <cstring>itemColumn</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Change column</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select the current column.</b><p>The item's text and pixmap will be changed for the current column</p></string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>Label4</cstring> + </property> + <property name="text"> + <string>Colu&mn:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemColumn</cstring> + </property> + </widget> + <widget class="TQLayoutWidget" row="2" column="1"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>itemPixmap</cstring> + </property> + <property name="text"> + <string>Label4</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>itemDeletePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the selected item's pixmap.</b><p>The pixmap in the current column of the selected item will be deleted.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>itemChoosePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a pixmap file for the item.</b><p>The pixmap will be changed in the current column of the selected item.</p></string> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>itemNew</cstring> + </property> + <property name="text"> + <string>&New Item</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add an item</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Adds a new item to the list.</b><p>The item will be inserted at the top of the list and can be moved using the up- and down-buttons.</p></string> + </property> + </widget> + <widget class="TQListView" row="0" column="0" rowspan="8" colspan="1"> + <property name="name"> + <cstring>itemsPreview</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>The list of items.</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>itemNewSub</cstring> + </property> + <property name="text"> + <string>New &Subitem</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add a subitem</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Create a new sub-item for the selected item.</b><p>New sub-items are inserted at the top of the list of sub-items, and new levels are created automatically.</p></string> + </property> + </widget> + <spacer row="3" column="1"> + <property name="name"> + <cstring>Vertical Spacing1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>itemUp</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move up</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item up.</b><p>The item will be moved within its level in the hierarchy.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="5" column="1"> + <property name="name"> + <cstring>itemDown</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move down</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item down.</b><p>The item will be moved within its level in the hierarchy.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="6" column="1"> + <property name="name"> + <cstring>itemLeft</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_left.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move left</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item one level up.</b><p>This will also change the level of the item's sub-items.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="7" column="1"> + <property name="name"> + <cstring>itemRight</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_right.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move right</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item one level down.</b><p>This will also change the level of the item's sub-items.</p></string> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget11</cstring> + </property> + <attribute name="title"> + <string>Co&lumns</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQGroupBox" row="0" column="2" rowspan="5" colspan="1"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="title"> + <string>Column Properties</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label2</cstring> + </property> + <property name="text"> + <string>&Pixmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>colChoosePixmap</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="1"> + <property name="name"> + <cstring>colPixmap</cstring> + </property> + <property name="text"> + <string>Label4</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="2"> + <property name="name"> + <cstring>colDeletePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Delete the pixmap of the selected column.</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="3"> + <property name="name"> + <cstring>colChoosePixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a pixmap file for the selected column.</b><p>The pixmap will be displayed in the header of the listview.</p></string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>Label1</cstring> + </property> + <property name="text"> + <string>&Text:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>colText</cstring> + </property> + </widget> + <widget class="TQLineEdit" row="0" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>colText</cstring> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="toolTip" stdset="0"> + <string>Enter column text</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Enter the text for the selected column.</b><p>The text will be displayed in the header of the listview.</p></string> + </property> + </widget> + <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>colClickable</cstring> + </property> + <property name="text"> + <string>Clicka&ble</string> + </property> + <property name="whatsThis" stdset="0"> + <string>If this option is checked, the selected column will react to mouse clicks on the header.</string> + </property> + </widget> + <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>colResizable</cstring> + </property> + <property name="text"> + <string>Re&sizable</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The column's width will be resizable if this option is checked.</string> + </property> + </widget> + </grid> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>colDelete</cstring> + </property> + <property name="text"> + <string>&Delete Column</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete column</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Deletes the selected Column.</string> + </property> + </widget> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>colDown</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move down</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item down.</b><p>The top-most column will be the first column in the list.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>colNew</cstring> + </property> + <property name="text"> + <string>&New Column</string> + </property> + <property name="toolTip" stdset="0"> + <string>Add a Column</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Create a new column.</b><p>New columns are appended at the end of (right of) the list and may be moved using the up- and down-buttons.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="3" column="1"> + <property name="name"> + <cstring>colUp</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move up</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item up.</b><p>The top-most column will be the first column in the list.</p></string> + </property> + </widget> + <widget class="TQListBox" row="0" column="0" rowspan="5" colspan="1"> + <property name="name"> + <cstring>colPreview</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>The list of columns.</string> + </property> + </widget> + <spacer row="2" column="1"> + <property name="name"> + <cstring>Vertical Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> + </widget> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>okButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>applyButton</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Apply all changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>cancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>cancelButton</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>itemNew</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemNewClicked()</slot> + </connection> + <connection> + <sender>itemDelete</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemDeleteClicked()</slot> + </connection> + <connection> + <sender>itemUp</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemUpClicked()</slot> + </connection> + <connection> + <sender>itemDown</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemDownClicked()</slot> + </connection> + <connection> + <sender>itemColumn</sender> + <signal>valueChanged(int)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemColChanged(int)</slot> + </connection> + <connection> + <sender>itemText</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>itemDeletePixmap</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemPixmapDeleted()</slot> + </connection> + <connection> + <sender>itemChoosePixmap</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemPixmapChoosen()</slot> + </connection> + <connection> + <sender>colNew</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>newColumnClicked()</slot> + </connection> + <connection> + <sender>colDelete</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>deleteColumnClicked()</slot> + </connection> + <connection> + <sender>colUp</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnUpClicked()</slot> + </connection> + <connection> + <sender>colDown</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnDownClicked()</slot> + </connection> + <connection> + <sender>colText</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>colDeletePixmap</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnPixmapDeleted()</slot> + </connection> + <connection> + <sender>colChoosePixmap</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnPixmapChosen()</slot> + </connection> + <connection> + <sender>colResizable</sender> + <signal>toggled(bool)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnResizable(bool)</slot> + </connection> + <connection> + <sender>colClickable</sender> + <signal>toggled(bool)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>columnClickable(bool)</slot> + </connection> + <connection> + <sender>tabWidget</sender> + <signal>selected(const TQString&)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>initTabPage(const TQString&)</slot> + </connection> + <connection> + <sender>okButton</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>applyButton</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>applyClicked()</slot> + </connection> + <connection> + <sender>colPreview</sender> + <signal>currentChanged(TQListBoxItem*)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>currentColumnChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>colPreview</sender> + <signal>selectionChanged(TQListBoxItem*)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>currentColumnChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>itemsPreview</sender> + <signal>currentChanged(TQListViewItem*)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>currentItemChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>itemsPreview</sender> + <signal>selectionChanged(TQListViewItem*)</signal> + <receiver>ListViewEditorBase</receiver> + <slot>currentItemChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>itemNewSub</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemNewSubClicked()</slot> + </connection> + <connection> + <sender>itemLeft</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemLeftClicked()</slot> + </connection> + <connection> + <sender>itemRight</sender> + <signal>clicked()</signal> + <receiver>ListViewEditorBase</receiver> + <slot>itemRightClicked()</slot> + </connection> +</connections> +<tabstops> + <tabstop>okButton</tabstop> + <tabstop>cancelButton</tabstop> + <tabstop>tabWidget</tabstop> + <tabstop>itemsPreview</tabstop> + <tabstop>itemNew</tabstop> + <tabstop>itemNewSub</tabstop> + <tabstop>itemDelete</tabstop> + <tabstop>itemUp</tabstop> + <tabstop>itemDown</tabstop> + <tabstop>itemLeft</tabstop> + <tabstop>itemRight</tabstop> + <tabstop>itemColumn</tabstop> + <tabstop>itemText</tabstop> + <tabstop>itemDeletePixmap</tabstop> + <tabstop>itemChoosePixmap</tabstop> + <tabstop>helpButton</tabstop> + <tabstop>applyButton</tabstop> + <tabstop>colPreview</tabstop> + <tabstop>colNew</tabstop> + <tabstop>colDelete</tabstop> + <tabstop>colUp</tabstop> + <tabstop>colDown</tabstop> + <tabstop>colText</tabstop> + <tabstop>colDeletePixmap</tabstop> + <tabstop>colChoosePixmap</tabstop> + <tabstop>colClickable</tabstop> + <tabstop>colResizable</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">applyClicked()</slot> + <slot access="protected">columnClickable(bool)</slot> + <slot access="protected">columnDownClicked()</slot> + <slot access="protected">columnPixmapChosen()</slot> + <slot access="protected">columnPixmapDeleted()</slot> + <slot access="protected">columnResizable(bool)</slot> + <slot access="protected">columnTextChanged(const TQString &)</slot> + <slot access="protected">columnUpClicked()</slot> + <slot access="protected">currentColumnChanged(TQListBoxItem*)</slot> + <slot access="protected">currentItemChanged(TQListViewItem*)</slot> + <slot access="protected">deleteColumnClicked()</slot> + <slot access="protected">initTabPage(const TQString &)</slot> + <slot access="protected">itemColChanged(int)</slot> + <slot access="protected">itemDeleteClicked()</slot> + <slot access="protected">itemDownClicked()</slot> + <slot access="protected">itemLeftClicked()</slot> + <slot access="protected">itemNewClicked()</slot> + <slot access="protected">itemNewSubClicked()</slot> + <slot access="protected">itemPixmapChoosen()</slot> + <slot access="protected">itemPixmapDeleted()</slot> + <slot access="protected">itemTextChanged(const TQString &)</slot> + <slot access="protected">itemUpClicked()</slot> + <slot access="protected">newColumnClicked()</slot> + <slot access="protected">itemRightClicked()</slot> + <slot access="protected">okClicked()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/listvieweditorimpl.cpp b/kdevdesigner/designer/listvieweditorimpl.cpp new file mode 100644 index 00000000..c5ec7498 --- /dev/null +++ b/kdevdesigner/designer/listvieweditorimpl.cpp @@ -0,0 +1,650 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formwindow.h" +#include "mainwindow.h" +#include "listvieweditorimpl.h" +#include "pixmapchooser.h" +#include "command.h" +#include "listviewdnd.h" +#include "listboxdnd.h" +#include "listboxrename.h" + +#include <tqlistview.h> +#include <tqheader.h> +#include <tqlistbox.h> +#include <tqlineedit.h> +#include <tqcheckbox.h> +#include <tqlabel.h> +#include <tqtabwidget.h> +#include <tqspinbox.h> +#include <tqpushbutton.h> +#include <tqptrstack.h> + +#include <tdelocale.h> + +ListViewEditor::ListViewEditor( TQWidget *parent, TQListView *lv, FormWindow *fw ) + : ListViewEditorBase( parent, 0, TRUE ), listview( lv ), formwindow( fw ) +{ + connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + itemText->setEnabled( FALSE ); + itemChoosePixmap->setEnabled( FALSE ); + itemDeletePixmap->setEnabled( FALSE ); + itemColumn->setEnabled( FALSE ); + + setupColumns(); + PopulateListViewCommand::transferItems( listview, itemsPreview ); + setupItems(); + + itemsPreview->setShowSortIndicator( listview->showSortIndicator() ); + itemsPreview->setAllColumnsShowFocus( listview->allColumnsShowFocus() ); + itemsPreview->setRootIsDecorated( listview->rootIsDecorated() ); + + if ( itemsPreview->firstChild() ) { + itemsPreview->setCurrentItem( itemsPreview->firstChild() ); + itemsPreview->setSelected( itemsPreview->firstChild(), TRUE ); + } + + // Clamp on drag and drop to TQListView + ListViewDnd *itemsDnd = new ListViewDnd( itemsPreview ); + itemsDnd->setDragMode( ListViewDnd::Internal | ListViewDnd::Move ); + TQObject::connect( itemsDnd, TQT_SIGNAL( dropped( TQListViewItem * ) ), + itemsDnd, TQT_SLOT( confirmDrop( TQListViewItem * ) ) ); + + // Enable rename for all TQListViewItems + TQListViewItemIterator it = ((TQListView *)itemsPreview)->firstChild(); + for ( ; *it; it++ ) + (*it)->setRenameEnabled( 0, TRUE ); + + // Connect listview signal to signal-relay + TQObject::connect( itemsPreview, + TQT_SIGNAL( itemRenamed( TQListViewItem*, int, const TQString & ) ), + this, + TQT_SLOT( emitItemRenamed(TQListViewItem*, int, const TQString&) ) ); + + // Connect signal-relay to TQLineEdit "itemText" + TQObjectList *l = parent->queryList( TQLINEEDIT_OBJECT_NAME_STRING, "itemText" ); + TQObject *obj; + TQObjectListIt itemsLineEditIt( *l ); + while ( (obj = itemsLineEditIt.current()) != 0 ) { + ++itemsLineEditIt; + TQObject::connect( this, + TQT_SIGNAL( itemRenamed( const TQString & ) ), + obj, + TQT_SLOT( setText( const TQString & ) ) ); + } + delete l; + + // Clamp on drag and drop to TQListBox + ListBoxDnd *columnsDnd = new ListBoxDnd( colPreview ); + columnsDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move ); + TQObject::connect( columnsDnd, TQT_SIGNAL( dropped( TQListBoxItem * ) ), + columnsDnd, TQT_SLOT( confirmDrop( TQListBoxItem * ) ) ); + + // Clamp on rename to TQListBox + ListBoxRename *columnsRename = new ListBoxRename( colPreview ); + TQObject::connect( columnsRename, + TQT_SIGNAL( itemTextChanged( const TQString & ) ), + this, + TQT_SLOT( columnTextChanged( const TQString & ) ) ); + + // Find TQLineEdit "colText" and connect + l = parent->queryList( TQLINEEDIT_OBJECT_NAME_STRING, "colText" ); + TQObjectListIt columnsLineEditIt( *l ); + while ( (obj = columnsLineEditIt.current()) != 0 ) { + ++columnsLineEditIt; + TQObject::connect( columnsRename, + TQT_SIGNAL( itemTextChanged( const TQString & ) ), + obj, + TQT_SLOT( setText( const TQString & ) ) ); + } + delete l; +} + +void ListViewEditor::applyClicked() +{ + setupItems(); + PopulateListViewCommand *cmd = new PopulateListViewCommand( i18n( "Edit the Items and Columns of '%1'" ).arg( listview->name() ), + formwindow, listview, itemsPreview ); + cmd->execute(); + formwindow->commandHistory()->addCommand( cmd ); +} + +void ListViewEditor::okClicked() +{ + applyClicked(); + accept(); +} + +void ListViewEditor::columnClickable( bool b ) +{ + Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); + if ( !c ) + return; + c->clickable = b; +} + +void ListViewEditor::columnDownClicked() +{ + if ( colPreview->currentItem() == -1 || + colPreview->currentItem() > (int)colPreview->count() - 2 ) + return; + + colPreview->clearSelection(); + TQListBoxItem *i = colPreview->item( colPreview->currentItem() ); + TQListBoxItem *below = i->next(); + + colPreview->takeItem( i ); + colPreview->insertItem( i, below ); + + colPreview->setCurrentItem( i ); + colPreview->setSelected( i, TRUE ); +} + +void ListViewEditor::columnPixmapChosen() +{ + Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); + if ( !c ) + return; + + TQPixmap pix; + if ( colPixmap->pixmap() ) + pix = qChoosePixmap( this, formwindow, *colPixmap->pixmap() ); + else + pix = qChoosePixmap( this, formwindow, TQPixmap() ); + + if ( pix.isNull() ) + return; + + c->pixmap = pix; + colPreview->blockSignals( TRUE ); + if ( !c->pixmap.isNull() ) + colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) ); + else + colPreview->changeItem( c->text, colPreview->index( c->item ) ); + c->item = colPreview->item( colPreview->currentItem() ); + colPixmap->setPixmap( c->pixmap ); + colPreview->blockSignals( FALSE ); + colDeletePixmap->setEnabled( TRUE ); +} + +void ListViewEditor::columnPixmapDeleted() +{ + Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); + if ( !c ) + return; + + c->pixmap = TQPixmap(); + colPreview->blockSignals( TRUE ); + if ( !c->pixmap.isNull() ) + colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) ); + else + colPreview->changeItem( c->text, colPreview->index( c->item ) ); + c->item = colPreview->item( colPreview->currentItem() ); + colPixmap->setText( "" ); + colPreview->blockSignals( FALSE ); + colDeletePixmap->setEnabled( FALSE ); +} + +void ListViewEditor::columnResizable( bool b ) +{ + Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); + if ( !c ) + return; + c->resizable = b; +} + +void ListViewEditor::columnTextChanged( const TQString &txt ) +{ + Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); + if ( !c ) + return; + + c->text = txt; + colPreview->blockSignals( TRUE ); + if ( !c->pixmap.isNull() ) + colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) ); + else + colPreview->changeItem( c->text, colPreview->index( c->item ) ); + c->item = colPreview->item( colPreview->currentItem() ); + colPreview->blockSignals( FALSE ); +} + +void ListViewEditor::columnUpClicked() +{ + if ( colPreview->currentItem() <= 0 ) + return; + + colPreview->clearSelection(); + TQListBoxItem *i = colPreview->item( colPreview->currentItem() ); + TQListBoxItem *above = i->prev(); + + colPreview->takeItem( above ); + colPreview->insertItem( above, i ); + + colPreview->setCurrentItem( i ); + colPreview->setSelected( i, TRUE ); +} + +void ListViewEditor::currentColumnChanged( TQListBoxItem *i ) +{ + Column *c = findColumn( i ); + if ( !i || !c ) { + colText->setEnabled( FALSE ); + colPixmap->setEnabled( FALSE ); + colDeletePixmap->setEnabled( FALSE ); + colText->blockSignals( TRUE ); + colText->setText( "" ); + colText->blockSignals( FALSE ); + colClickable->setEnabled( FALSE ); + colResizable->setEnabled( FALSE ); + return; + } + + colText->setEnabled( TRUE ); + colPixmap->setEnabled( TRUE ); + colDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() ); + colClickable->setEnabled( TRUE ); + colResizable->setEnabled( TRUE ); + + colText->blockSignals( TRUE ); + colText->setText( c->text ); + colText->blockSignals( FALSE ); + if ( !c->pixmap.isNull() ) + colPixmap->setPixmap( c->pixmap ); + else + colPixmap->setText( "" ); + colClickable->setChecked( c->clickable ); + colResizable->setChecked( c->resizable ); +} + +void ListViewEditor::newColumnClicked() +{ + Column col; + col.text = i18n( "New Column" ); + col.pixmap = TQPixmap(); + col.clickable = TRUE; + col.resizable = TRUE; + if ( !col.pixmap.isNull() ) + col.item = new TQListBoxPixmap( colPreview, col.pixmap, col.text ); + else + col.item = new TQListBoxText( colPreview, col.text ); + columns.append( col ); + colPreview->setCurrentItem( col.item ); + colPreview->setSelected( col.item, TRUE ); +} + +void ListViewEditor::deleteColumnClicked() +{ + TQListBoxItem *i = colPreview->item( colPreview->currentItem() ); + if ( !i ) + return; + + for ( TQValueList<Column>::Iterator it = columns.begin(); it != columns.end(); ++it ) { + if ( ( *it ).item == i ) { + delete (*it).item; + columns.remove( it ); + break; + } + } + + if ( colPreview->currentItem() != -1 ) + colPreview->setSelected( colPreview->currentItem(), TRUE ); +} + +void ListViewEditor::currentItemChanged( TQListViewItem *i ) +{ + if ( !i ) { + itemText->setEnabled( FALSE ); + itemChoosePixmap->setEnabled( FALSE ); + itemDeletePixmap->setEnabled( FALSE ); + itemColumn->setEnabled( FALSE ); + return; + } + + itemText->setEnabled( TRUE ); + itemChoosePixmap->setEnabled( TRUE ); + itemDeletePixmap->setEnabled( i->pixmap( itemColumn->value() ) && + !i->pixmap( itemColumn->value() )->isNull() ); + itemColumn->setEnabled( TRUE ); + + displayItem( i, itemColumn->value() ); +} + +void ListViewEditor::displayItem( TQListViewItem *i, int col ) +{ + itemText->blockSignals( TRUE ); + itemText->setText( i->text( col ) ); + itemText->blockSignals( FALSE ); + + itemPixmap->blockSignals( TRUE ); + if ( i->pixmap( col ) ) + itemPixmap->setPixmap( *i->pixmap( col ) ); + else + itemPixmap->setText( "" ); + itemPixmap->blockSignals( FALSE ); +} + +void ListViewEditor::itemColChanged( int col ) +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + displayItem( i, col ); + itemDeletePixmap->setEnabled( i->pixmap( col ) && !i->pixmap( col )->isNull() ); +} + +void ListViewEditor::itemDeleteClicked() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + delete i; + if ( itemsPreview->firstChild() ) { + itemsPreview->setCurrentItem( itemsPreview->firstChild() ); + itemsPreview->setSelected( itemsPreview->firstChild(), TRUE ); + } +} + +void ListViewEditor::itemDownClicked() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + TQListViewItemIterator it( i ); + TQListViewItem *parent = i->parent(); + it++; + while ( it.current() ) { + if ( it.current()->parent() == parent ) + break; + it++; + } + + if ( !it.current() ) + return; + TQListViewItem *other = it.current(); + + i->moveItem( other ); +} + +void ListViewEditor::itemNewClicked() +{ + TQListViewItem *item = new TQListViewItem( itemsPreview ); + item->setText( 0, i18n( "Item" ) ); + item->setRenameEnabled( 0, TRUE ); + itemsPreview->setCurrentItem( item ); + itemsPreview->setSelected( item, TRUE ); + itemText->setFocus(); + itemText->selectAll(); +} + +void ListViewEditor::itemNewSubClicked() +{ + TQListViewItem *parent = itemsPreview->currentItem(); + TQListViewItem *item = 0; + if ( parent ) { + item = new TQListViewItem( parent ); + parent->setOpen( TRUE ); + } else { + item = new TQListViewItem( itemsPreview ); + } + item->setText( 0, i18n( "Subitem" ) ); + item->setRenameEnabled( 0, TRUE ); + itemsPreview->setCurrentItem( item ); + itemsPreview->setSelected( item, TRUE ); +} + +void ListViewEditor::itemPixmapChoosen() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + TQPixmap pix; + if ( itemPixmap->pixmap() ) + pix = qChoosePixmap( this, formwindow, *itemPixmap->pixmap() ); + else + pix = qChoosePixmap( this, formwindow, TQPixmap() ); + + if ( pix.isNull() ) + return; + + i->setPixmap( itemColumn->value(), TQPixmap( pix ) ); + itemPixmap->setPixmap( pix ); + itemDeletePixmap->setEnabled( TRUE ); +} + +void ListViewEditor::itemPixmapDeleted() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + i->setPixmap( itemColumn->value(), TQPixmap() ); + itemPixmap->setText( "" ); + itemDeletePixmap->setEnabled( FALSE ); +} + +void ListViewEditor::itemTextChanged( const TQString &txt ) +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + i->setText( itemColumn->value(), txt ); +} + +void ListViewEditor::itemUpClicked() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + TQListViewItemIterator it( i ); + TQListViewItem *parent = i->parent(); + --it; + while ( it.current() ) { + if ( it.current()->parent() == parent ) + break; + --it; + } + + if ( !it.current() ) + return; + TQListViewItem *other = it.current(); + + other->moveItem( i ); +} + +void ListViewEditor::itemRightClicked() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + TQListViewItemIterator it( i ); + TQListViewItem *parent = i->parent(); + parent = parent ? parent->firstChild() : itemsPreview->firstChild(); + if ( !parent ) + return; + it++; + while ( it.current() ) { + if ( it.current()->parent() == parent ) + break; + it++; + } + + if ( !it.current() ) + return; + TQListViewItem *other = it.current(); + + for ( int c = 0; c < itemsPreview->columns(); ++c ) { + TQString s = i->text( c ); + i->setText( c, other->text( c ) ); + other->setText( c, s ); + TQPixmap pix; + if ( i->pixmap( c ) ) + pix = *i->pixmap( c ); + if ( other->pixmap( c ) ) + i->setPixmap( c, *other->pixmap( c ) ); + else + i->setPixmap( c, TQPixmap() ); + other->setPixmap( c, pix ); + } + + itemsPreview->setCurrentItem( other ); + itemsPreview->setSelected( other, TRUE ); +} + +void ListViewEditor::itemLeftClicked() +{ + TQListViewItem *i = itemsPreview->currentItem(); + if ( !i ) + return; + + TQListViewItemIterator it( i ); + TQListViewItem *parent = i->parent(); + if ( !parent ) + return; + parent = parent->parent(); + --it; + while ( it.current() ) { + if ( it.current()->parent() == parent ) + break; + --it; + } + + if ( !it.current() ) + return; + TQListViewItem *other = it.current(); + + for ( int c = 0; c < itemsPreview->columns(); ++c ) { + TQString s = i->text( c ); + i->setText( c, other->text( c ) ); + other->setText( c, s ); + TQPixmap pix; + if ( i->pixmap( c ) ) + pix = *i->pixmap( c ); + if ( other->pixmap( c ) ) + i->setPixmap( c, *other->pixmap( c ) ); + else + i->setPixmap( c, TQPixmap() ); + other->setPixmap( c, pix ); + } + + itemsPreview->setCurrentItem( other ); + itemsPreview->setSelected( other, TRUE ); +} + +void ListViewEditor::setupColumns() +{ + TQHeader *h = listview->header(); + for ( int i = 0; i < (int)h->count(); ++i ) { + Column col; + col.text = h->label( i ); + col.pixmap = TQPixmap(); + if ( h->iconSet( i ) ) + col.pixmap = h->iconSet( i )->pixmap(); + col.clickable = h->isClickEnabled( i ); + col.resizable = h->isResizeEnabled( i ); + if ( !col.pixmap.isNull() ) + col.item = new TQListBoxPixmap( colPreview, col.pixmap, col.text ); + else + col.item = new TQListBoxText( colPreview, col.text ); + columns.append( col ); + } + + colText->setEnabled( FALSE ); + colPixmap->setEnabled( FALSE ); + colClickable->setEnabled( FALSE ); + colResizable->setEnabled( FALSE ); + + if ( colPreview->firstItem() ) + colPreview->setCurrentItem( colPreview->firstItem() ); + numColumns = colPreview->count(); +} + +void ListViewEditor::setupItems() +{ + itemColumn->setMinValue( 0 ); + itemColumn->setMaxValue( TQMAX( numColumns - 1, 0 ) ); + int i = 0; + TQHeader *header = itemsPreview->header(); + for ( TQListBoxItem *item = colPreview->firstItem(); item; item = item->next() ) { + Column *col = findColumn( item ); + if ( !col ) + continue; + if ( i >= itemsPreview->columns() ) + itemsPreview->addColumn( col->text ); + header->setLabel( i, col->pixmap, col->text ); + header->setResizeEnabled( col->resizable, i ); + header->setClickEnabled( col->clickable, i ); + ++i; + } + while ( itemsPreview->columns() > i ) + itemsPreview->removeColumn( i ); + + itemColumn->setValue( TQMIN( numColumns - 1, itemColumn->value() ) ); +} + +ListViewEditor::Column *ListViewEditor::findColumn( TQListBoxItem *i ) +{ + if ( !i ) + return 0; + + for ( TQValueList<Column>::Iterator it = columns.begin(); it != columns.end(); ++it ) { + if ( ( *it ).item == i ) + return &( *it ); + } + + return 0; +} + +void ListViewEditor::initTabPage( const TQString &page ) +{ + numColumns = colPreview->count(); + if ( page == i18n( "&Items" ) ) { + setupItems(); + if ( numColumns == 0 ) { + itemNew->setEnabled( FALSE ); + itemNewSub->setEnabled( FALSE ); + itemText->setEnabled( FALSE ); + itemChoosePixmap->setEnabled( FALSE ); + itemDeletePixmap->setEnabled( FALSE ); + itemColumn->setEnabled( FALSE ); + } else { + itemNew->setEnabled( TRUE ); + itemNewSub->setEnabled( TRUE ); + } + } +} + +void ListViewEditor::emitItemRenamed( TQListViewItem *, int, const TQString & text ) +{ + emit itemRenamed( text ); // Relay signal ( to TQLineEdit ) +} diff --git a/kdevdesigner/designer/listvieweditorimpl.h b/kdevdesigner/designer/listvieweditorimpl.h new file mode 100644 index 00000000..64048c9d --- /dev/null +++ b/kdevdesigner/designer/listvieweditorimpl.h @@ -0,0 +1,103 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef LISTVIEWEDITORIMPL_H +#define LISTVIEWEDITORIMPL_H + +#include "listvieweditor.h" + +#include <tqmap.h> +#include <tqpixmap.h> +#include <tqvaluelist.h> + +class FormWindow; + +class ListViewEditor : public ListViewEditorBase +{ + Q_OBJECT + + +public: + ListViewEditor( TQWidget *parent, TQListView *lv, FormWindow *fw ); + +signals: + void itemRenamed(const TQString &); + +protected slots: + void applyClicked(); + void columnClickable(bool); + void columnDownClicked(); + void columnPixmapChosen(); + void columnPixmapDeleted(); + void columnResizable(bool); + void columnTextChanged(const TQString &); + void columnUpClicked(); + void currentColumnChanged(TQListBoxItem*); + void currentItemChanged(TQListViewItem*); + void deleteColumnClicked(); + void itemColChanged(int); + void itemDeleteClicked(); + void itemDownClicked(); + void itemNewClicked(); + void itemNewSubClicked(); + void itemPixmapChoosen(); + void itemPixmapDeleted(); + void itemTextChanged(const TQString &); + void itemUpClicked(); + void itemLeftClicked(); + void itemRightClicked(); + void newColumnClicked(); + void okClicked(); + void initTabPage(const TQString &page); + void emitItemRenamed(TQListViewItem*, int, const TQString&); // signal relay + +private: + struct Column + { + TQListBoxItem *item; + TQString text; + TQPixmap pixmap; + bool clickable, resizable; + TQ_DUMMY_COMPARISON_OPERATOR( Column ) + }; + +private: + void setupColumns(); + void setupItems(); + Column *findColumn( TQListBoxItem *i ); + void transferItems( TQListView *from, TQListView *to ); + void displayItem( TQListViewItem *i, int col ); + +private: + TQListView *listview; + TQValueList<Column> columns; + int numColumns; + FormWindow *formwindow; + +}; + + +#endif diff --git a/kdevdesigner/designer/mainwindow.cpp b/kdevdesigner/designer/mainwindow.cpp new file mode 100644 index 00000000..3d900532 --- /dev/null +++ b/kdevdesigner/designer/mainwindow.cpp @@ -0,0 +1,3784 @@ + /********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "designerappiface.h" +#include "designerapp.h" + +#include "mainwindow.h" +#include "defs.h" +#include "globaldefs.h" +#include "formwindow.h" +#include "widgetdatabase.h" +#include "widgetfactory.h" +#include "propertyeditor.h" +#include "metadatabase.h" +#include "resource.h" +#include "hierarchyview.h" +#include "newformimpl.h" +#include "workspace.h" +#include "about.h" +#include "multilineeditorimpl.h" +#include "wizardeditorimpl.h" +#include "outputwindow.h" +#include "actioneditorimpl.h" +#include "actiondnd.h" +#include "project.h" +#include "projectsettingsimpl.h" +#include "tqwidgetfactory.h" +#include "pixmapcollection.h" +#include "qcompletionedit.h" +#include "sourcefile.h" +#include "orderindicator.h" +#include <tqtoolbox.h> +#include "widgetaction.h" +#include "propertyobject.h" +#include "popupmenueditor.h" +#include "menubareditor.h" + +#include "startdialog.h" +#include "createtemplate.h" +#include "editfunctions.h" +//#include "connectionviewer.h" +#include "formsettings.h" +#include "preferences.h" +#include "pixmapcollectioneditor.h" +#ifndef TQT_NO_SQL +#include "dbconnectionimpl.h" +#endif +//#include "connectioneditor.h" +#include "customwidgeteditorimpl.h" +#include "paletteeditorimpl.h" +#include "listboxeditorimpl.h" +#include "listvieweditorimpl.h" +#include "iconvieweditorimpl.h" +#include "tableeditorimpl.h" +#include "multilineeditor.h" +#include "finddialog.h" +#include "replacedialog.h" +#include "gotolinedialog.h" +#include "designeraction.h" + +#include <kiconloader.h> +#include <tdelocale.h> + +#include <tqinputdialog.h> +#include <tqtoolbar.h> +#include <tqfeatures.h> +#include <tqmetaobject.h> +#include <tqaction.h> +#include <tqpixmap.h> +#include <tqworkspace.h> +#include <tqfiledialog.h> +#include <tqclipboard.h> +#include <tqmessagebox.h> +#include <tqbuffer.h> +#include <tqdir.h> +#include <tqstyle.h> +#include <tqlabel.h> +#include <tqstatusbar.h> +#include <tqfile.h> +#include <tqcheckbox.h> +#include <tqwhatsthis.h> +#include <tqwizard.h> +#include <tqtimer.h> +#include <tqlistbox.h> +#include <tqdockwindow.h> +#include <tqstylefactory.h> +#include <tqvbox.h> +#include <tqprocess.h> +#include <tqsettings.h> +#include <tqaccel.h> +#include <tqtooltip.h> +#include <tqsizegrip.h> +#include <tqtextview.h> +#include <tqassistantclient.h> +#include <stdlib.h> + +#include "kdevdesigner_part.h" + +static bool mblockNewForms = FALSE; +extern TQMap<TQWidget*, TQString> *qwf_forms; +extern TQString *qwf_language; +extern bool qwf_execute_code; +extern bool qwf_stays_on_top; +extern void set_splash_status( const TQString &txt ); +extern TQObject* qwf_form_object; +extern TQString *qwf_plugin_dir; + +MainWindow *MainWindow::self = 0; + +TQString assistantPath() +{ + TQString path = TQDir::cleanDirPath( TQString( tqInstallPathBins() ) + + TQDir::separator() ); + return path; +} + + +static TQString textNoAccel( const TQString& text) +{ + TQString t = text; + int i; + while ( (i = t.find('&') )>= 0 ) { + t.remove(i,1); + } + return t; +} + + +MainWindow::MainWindow( KDevDesignerPart *part, bool asClient, bool single, const TQString &plgDir ) + : TQMainWindow( 0, "designer_mainwindow"/*, WType_TopLevel | (single ? 0 : WDestructiveClose) | WGroupLeader*/ ), + grd( 10, 10 ), sGrid( TRUE ), snGrid( TRUE ), restoreConfig( TRUE ), splashScreen( TRUE ), + fileFilter( i18n( "TQt User-Interface Files (*.ui)" ) ), client( asClient ), + previewing( FALSE ), databaseAutoEdit( FALSE ), autoSaveEnabled( FALSE ), autoSaveInterval( 1800 ), m_part(part) +{ +// extern void qInitImages_designercore(); +// qInitImages_designercore(); + + self = this; + setPluginDirectory( plgDir ); + customWidgetToolBar = customWidgetToolBar2 = 0; + guiStuffVisible = TRUE; + editorsReadOnly = FALSE; + sSignalHandlers = TRUE; + init_colors(); + shStartDialog = FALSE; + + desInterface = new DesignerInterfaceImpl( this ); + desInterface->addRef(); + inDebugMode = FALSE; + savePluginPaths = FALSE; + + updateFunctionsTimer = new TQTimer( this ); + connect( updateFunctionsTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( doFunctionsChanged() ) ); + + autoSaveTimer = new TQTimer( this ); + connect( autoSaveTimer, TQT_SIGNAL( timeout() ), + this, TQT_SLOT( fileSaveAll() ) ); + + set_splash_status( "Loading Plugins..." ); + setupPluginManagers(); + +/* if ( !single ) + tqApp->setMainWidget( this );*/ + TQWidgetFactory::addWidgetFactory( new CustomWidgetFactory ); +#ifndef TQ_WS_MACX + setIcon( BarIcon( "designer_appicon.png", KDevDesignerPartFactory::instance() ) ); +#endif + + actionGroupTools = 0; + prefDia = 0; + windowMenu = 0; + hierarchyView = 0; + actionEditor = 0; + currentProject = 0; + wspace = 0; + oWindow = 0; + singleProject = single; + + statusBar()->clear(); +#if defined(TQT_NON_COMMERCIAL) + statusBar()->addWidget( new TQLabel(i18n("Ready - This is the non-commercial version of TQt - " + "For commercial evaluations, use the help menu to register with Trolltech."), statusBar()), 1 ); +#else + statusBar()->addWidget( new TQLabel("Ready", statusBar()), 1 ); +#endif + + + set_splash_status( "Setting up GUI..." ); + setupMDI(); + setupMenuBar(); + + setupToolbox(); + + setupFileActions(); + setupEditActions(); + setupProjectActions(); + setupSearchActions(); + layoutToolBar = new TQToolBar( this, "Layout" ); + layoutToolBar->setCloseMode( TQDockWindow::Undocked ); + addToolBar( layoutToolBar, i18n( "Layout" ) ); + interpreterPluginManager = 0; + setupToolActions(); + setupLayoutActions(); + setupPreviewActions(); + setupOutputWindow(); + setupActionManager(); + setupWindowActions(); + + setupWorkspace(); + setupHierarchyView(); + setupPropertyEditor(); + setupActionEditor(); + + setupHelpActions(); + + setupRMBMenus(); + + connect( this, TQT_SIGNAL( projectChanged() ), this, TQT_SLOT( emitProjectSignals() ) ); + connect( this, TQT_SIGNAL( hasActiveWindow(bool) ), this, TQT_SLOT( emitProjectSignals() ) ); + + emit hasActiveForm( FALSE ); + emit hasActiveWindow( FALSE ); + + lastPressWidget = 0; + tqApp->installEventFilter( this ); + + TQSize as( tqApp->desktop()->size() ); + as -= TQSize( 30, 30 ); + resize( TQSize( 1200, 1000 ).boundedTo( as ) ); + + connect( tqApp->clipboard(), TQT_SIGNAL( dataChanged() ), + this, TQT_SLOT( clipboardChanged() ) ); + clipboardChanged(); + layoutChilds = FALSE; + layoutSelected = FALSE; + breakLayout = FALSE; + backPix = TRUE; + + set_splash_status( "Loading User Settings..." ); + readConfig(); + // hack to make WidgetFactory happy (so it knows TQWidget and TQDialog for resetting properties) + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQWIDGET_OBJECT_NAME_STRING ), this, 0, FALSE ); + delete w; + w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQDIALOG_OBJECT_NAME_STRING ), this, 0, FALSE ); + delete w; + w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQLABEL_OBJECT_NAME_STRING ), this, 0, FALSE ); + delete w; + w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQTABWIDGET_OBJECT_NAME_STRING ), this, 0, FALSE ); + delete w; + w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQFRAME_OBJECT_NAME_STRING ), this, 0, FALSE ); + delete w; + setAppropriate( (TQDockWindow*)actionEditor->parentWidget(), FALSE ); + actionEditor->parentWidget()->hide(); + + assistant = new TQAssistantClient( assistantPath(), TQT_TQOBJECT(this) ); + + statusBar()->setSizeGripEnabled( TRUE ); + set_splash_status( "Initialization Done." ); +/* if ( shStartDialog ) + TQTimer::singleShot( 0, this, TQT_SLOT( showStartDialog() ));*/ + + if ( autoSaveEnabled ) + autoSaveTimer->start( autoSaveInterval * 1000 ); + + setFocusPolicy( TQ_StrongFocus ); +} + +MainWindow::~MainWindow() +{ + TQValueList<Tab>::Iterator tit; + for ( tit = preferenceTabs.begin(); tit != preferenceTabs.end(); ++tit ) { + Tab t = *tit; + delete t.w; + } + for ( tit = projectTabs.begin(); tit != projectTabs.end(); ++tit ) { + Tab t = *tit; + delete t.w; + } + + TQMap< TQAction*, Project* >::Iterator it = projects.begin(); + while ( it != projects.end() ) { + Project *p = *it; + ++it; + delete p; + } + projects.clear(); + + delete oWindow; + oWindow = 0; + + desInterface->release(); + desInterface = 0; + + delete actionPluginManager; + delete preferencePluginManager; + delete projectSettingsPluginManager; + delete interpreterPluginManager; + delete templateWizardPluginManager; + delete editorPluginManager; + delete sourceTemplatePluginManager; + + MetaDataBase::clearDataBase(); + if(self == this) + self = 0; +} + +void MainWindow::setupMDI() +{ + TQVBox *vbox = new TQVBox( this ); + setCentralWidget( vbox ); + vbox->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + vbox->setMargin( 1 ); + vbox->setLineWidth( 1 ); + qworkspace = new TQWorkspace( vbox ); + qworkspace->setPaletteBackgroundPixmap( UserIcon( "designer_background.png", KDevDesignerPartFactory::instance() ) ); + qworkspace->setScrollBarsEnabled( TRUE ); + connect( qworkspace, TQT_SIGNAL( windowActivated( TQWidget * ) ), + this, TQT_SLOT( activeWindowChanged( TQWidget * ) ) ); + lastActiveFormWindow = 0; + qworkspace->setAcceptDrops( TRUE ); +} + +void MainWindow::setupMenuBar() +{ + menubar = menuBar(); +} + +void MainWindow::setupPropertyEditor() +{ + TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this ); + dw->setResizeEnabled( TRUE ); + dw->setCloseMode( TQDockWindow::Always ); + propertyEditor = new PropertyEditor( dw ); + addToolBar( dw, TQt::DockRight ); + dw->setWidget( propertyEditor ); + dw->setFixedExtentWidth( 250 ); + dw->setCaption( i18n( "Property Editor/Signal Handlers" ) ); + TQWhatsThis::add( propertyEditor, + i18n("<b>The Property Editor</b>" + "<p>You can change the appearance and behavior of the selected widget in the " + "property editor.</p>" + "<p>You can set properties for components and forms at design time and see the " + "immediately see the effects of the changes. " + "Each property has its own editor which (depending on the property) can be used " + "to enter " + "new values, open a special dialog, or to select values from a predefined list. " + "Click <b>F1</b> to get detailed help for the selected property.</p>" + "<p>You can resize the columns of the editor by dragging the separators in the " + "list's header.</p>" + "<p><b>Signal Handlers</b></p>" + "<p>In the Signal Handlers tab you can define connections between " + "the signals emitted by widgets and the slots in the form. " + "(These connections can also be made using the connection tool.)" ) ); + dw->show(); +} + +void MainWindow::setupOutputWindow() +{ + TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this ); + dw->setResizeEnabled( TRUE ); + dw->setCloseMode( TQDockWindow::Always ); + addToolBar( dw, TQt::DockBottom ); + oWindow = new OutputWindow( dw ); + dw->setWidget( oWindow ); + dw->setFixedExtentHeight( 150 ); + dw->setCaption( i18n( "Output Window" ) ); +} + +void MainWindow::setupHierarchyView() +{ + if ( hierarchyView ) + return; + TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this ); + dw->setResizeEnabled( TRUE ); + dw->setCloseMode( TQDockWindow::Always ); + hierarchyView = new HierarchyView( dw ); + addToolBar( dw, TQt::DockRight ); + dw->setWidget( hierarchyView ); + + dw->setCaption( i18n( "Object Explorer" ) ); + dw->setFixedExtentWidth( 250 ); + TQWhatsThis::add( hierarchyView, + i18n("<b>The Object Explorer</b>" + "<p>The Object Explorer provides an overview of the relationships " + "between the widgets in a form. You can use the clipboard functions using " + "a context menu for each item in the view. It is also useful for selecting widgets " + "in forms that have complex layouts.</p>" + "<p>The columns can be resized by dragging the separator in the list's header.</p>" + "<p>The second tab shows all the form's slots, class variables, includes, etc.</p>") ); + dw->show(); +} + +void MainWindow::setupWorkspace() +{ + TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this ); + dw->setResizeEnabled( TRUE ); + dw->setCloseMode( TQDockWindow::Always ); + TQVBox *vbox = new TQVBox( dw ); + QCompletionEdit *edit = new QCompletionEdit( vbox ); + TQToolTip::add( edit, i18n( "Start typing the buffer you want to switch to here (ALT+B)" ) ); + TQAccel *a = new TQAccel( this ); + a->connectItem( a->insertItem( ALT + Key_B ), edit, TQT_SLOT( setFocus() ) ); + wspace = new Workspace( vbox, this ); + wspace->setBufferEdit( edit ); + wspace->setCurrentProject( currentProject ); + addToolBar( dw, TQt::DockRight ); + dw->setWidget( vbox ); + + dw->setCaption( i18n( "Project Overview" ) ); + TQWhatsThis::add( wspace, i18n("<b>The Project Overview Window</b>" + "<p>The Project Overview Window displays all the current " + "project, including forms and source files.</p>" + "<p>Use the search field to rapidly switch between files.</p>")); + dw->setFixedExtentHeight( 100 ); + dw->show(); +} + +void MainWindow::setupActionEditor() +{ + TQDockWindow *dw = new TQDockWindow( TQDockWindow::OutsideDock, this, 0 ); + addDockWindow( dw, TQt::DockTornOff ); + dw->setResizeEnabled( TRUE ); + dw->setCloseMode( TQDockWindow::Always ); + actionEditor = new ActionEditor( dw ); + dw->setWidget( actionEditor ); + actionEditor->show(); + dw->setCaption( i18n( "Action Editor" ) ); + TQWhatsThis::add( actionEditor, i18n("<b>The Action Editor</b>" + "<p>The Action Editor is used to add actions and action groups to " + "a form, and to connect actions to slots. Actions and action " + "groups can be dragged into menus and into toolbars, and may " + "feature keyboard shortcuts and tooltips. If actions have pixmaps " + "these are displayed on toolbar buttons and besides their names in " + "menus.</p>" ) ); + dw->hide(); + setAppropriate( dw, FALSE ); +} + +void MainWindow::setupToolbox() +{ + TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this ); + dw->setResizeEnabled( TRUE ); + dw->setCloseMode( TQDockWindow::Always ); + addToolBar( dw, TQt::DockLeft ); + toolBox = new TQToolBox( dw ); + dw->setWidget( toolBox ); + dw->setFixedExtentWidth( 160 ); + dw->setCaption( i18n( "Toolbox" ) ); + dw->show(); + setDockEnabled( dw, TQt::DockTop, FALSE ); + setDockEnabled( dw, TQt::DockBottom, FALSE ); + commonWidgetsToolBar = new TQToolBar( "Common Widgets", 0, toolBox, FALSE, "Common Widgets" ); + commonWidgetsToolBar->setFrameStyle( TQFrame::NoFrame ); + commonWidgetsToolBar->setOrientation( Qt::Vertical ); + commonWidgetsToolBar->setBackgroundMode(PaletteBase); + toolBox->addItem( commonWidgetsToolBar, "Common Widgets" ); +} + +void MainWindow::setupRMBMenus() +{ + rmbWidgets = new TQPopupMenu( this ); + actionEditCut->addTo( rmbWidgets ); + actionEditCopy->addTo( rmbWidgets ); + actionEditPaste->addTo( rmbWidgets ); + actionEditDelete->addTo( rmbWidgets ); +#if 0 + rmbWidgets->insertSeparator(); + actionEditLower->addTo( rmbWidgets ); + actionEditRaise->addTo( rmbWidgets ); +#endif + rmbWidgets->insertSeparator(); + actionEditAdjustSize->addTo( rmbWidgets ); + actionEditHLayout->addTo( rmbWidgets ); + actionEditVLayout->addTo( rmbWidgets ); + actionEditGridLayout->addTo( rmbWidgets ); + actionEditSplitHorizontal->addTo( rmbWidgets ); + actionEditSplitVertical->addTo( rmbWidgets ); + actionEditBreakLayout->addTo( rmbWidgets ); + rmbWidgets->insertSeparator(); + if ( !singleProjectMode() ) + actionEditConnections->addTo( rmbWidgets ); + actionEditSource->addTo( rmbWidgets ); + + rmbFormWindow = new TQPopupMenu( this ); + actionEditPaste->addTo( rmbFormWindow ); + actionEditSelectAll->addTo( rmbFormWindow ); + actionEditAccels->addTo( rmbFormWindow ); + rmbFormWindow->insertSeparator(); + actionEditAdjustSize->addTo( rmbFormWindow ); + actionEditHLayout->addTo( rmbFormWindow ); + actionEditVLayout->addTo( rmbFormWindow ); + actionEditGridLayout->addTo( rmbFormWindow ); + actionEditBreakLayout->addTo( rmbFormWindow ); + rmbFormWindow->insertSeparator(); + if ( !singleProjectMode() ) { + actionEditFunctions->addTo( rmbFormWindow ); + actionEditConnections->addTo( rmbFormWindow ); + } + actionEditSource->addTo( rmbFormWindow ); + rmbFormWindow->insertSeparator(); + actionEditFormSettings->addTo( rmbFormWindow ); +} + +void MainWindow::toolSelected( TQAction* action ) +{ + actionCurrentTool = action; + emit currentToolChanged(); + if ( formWindow() ) + formWindow()->commandHistory()->emitUndoRedo(); +} + +int MainWindow::currentTool() const +{ + if ( !actionCurrentTool ) + return POINTER_TOOL; + return TQString::fromLatin1(actionCurrentTool->name()).toInt(); +} + +void MainWindow::runProjectPrecondition() +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + e->save(); + e->saveBreakPoints(); + } + fileSaveProject(); + + if ( currentTool() == ORDER_TOOL ) + resetTool(); + oWindow->clearErrorMessages(); + oWindow->clearDebug(); + oWindow->showDebugTab(); + previewing = TRUE; +} + +void MainWindow::runProjectPostcondition( TQObjectList *l ) +{ + inDebugMode = TRUE; + debuggingForms = *l; + enableAll( FALSE ); + for ( SourceEditor *e2 = sourceEditors.first(); e2; e2 = sourceEditors.next() ) { + if ( e2->project() == currentProject ) + e2->editorInterface()->setMode( EditorInterface::Debugging ); + } +} + +TQWidget* MainWindow::previewFormInternal( TQStyle* style, TQPalette* palet ) +{ + qwf_execute_code = FALSE; + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) + e->save(); + if ( currentTool() == ORDER_TOOL ) + resetTool(); + + FormWindow *fw = formWindow(); + if ( !fw ) + return 0; + + TQStringList databases; + TQPtrDictIterator<TQWidget> wit( *fw->widgets() ); + while ( wit.current() ) { + TQStringList lst = MetaDataBase::fakeProperty( TQT_TQOBJECT(wit.current()), "database" ).toStringList(); + if ( !lst.isEmpty() ) + databases << lst [ 0 ]; + ++wit; + } + + if ( fw->project() ) { + TQStringList::ConstIterator it; + for ( it = databases.begin(); it != databases.end(); ++it ) + fw->project()->openDatabase( *it, FALSE ); + } + TQApplication::setOverrideCursor( WaitCursor ); + + TQCString s; + TQBuffer buffer( s ); + buffer.open( IO_WriteOnly ); + Resource resource( this ); + resource.setWidget( fw ); + TQValueList<Resource::Image> images; + resource.save( TQT_TQIODEVICE(&buffer) ); + + buffer.close(); + buffer.open( IO_ReadOnly ); + + TQWidget *w = TQWidgetFactory::create( TQT_TQIODEVICE(&buffer) ); + if ( w ) { + previewedForm = w; + if ( palet ) { + if ( style ) + style->polish( *palet ); + w->setPalette( *palet ); + } + + if ( style ) + w->setStyle( style ); + + TQObjectList *l = w->queryList( TQWIDGET_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( style ) + ( (TQWidget*)o )->setStyle( style ); + } + delete l; + + w->move( fw->mapToGlobal( TQPoint(0,0) ) ); + ((MainWindow*)w )->setWFlags( WDestructiveClose ); + previewing = TRUE; + w->show(); + previewing = FALSE; + TQApplication::restoreOverrideCursor(); + return w; + } + TQApplication::restoreOverrideCursor(); + return 0; +} + +void MainWindow::previewForm() +{ + TQWidget* w = previewFormInternal(); + if ( w ) + w->show(); +} + +void MainWindow::previewForm( const TQString & style ) +{ + TQStyle* st = TQStyleFactory::create( style ); + TQWidget* w = 0; + if ( style == "Motif" ) { + TQPalette p( TQColor( 192, 192, 192 ) ); + w = previewFormInternal( st, &p ); + } else if ( style == "Windows" ) { + TQPalette p( TQColor( 212, 208, 200 ) ); + w = previewFormInternal( st, &p ); + } else if ( style == "Platinum" ) { + TQPalette p( TQColor( 220, 220, 220 ) ); + w = previewFormInternal( st, &p ); + } else if ( style == "CDE" ) { + TQPalette p( TQColor( 75, 123, 130 ) ); + p.setColor( TQPalette::Active, TQColorGroup::Base, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Inactive, TQColorGroup::Base, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Disabled, TQColorGroup::Base, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Active, TQColorGroup::Highlight, TQt::white ); + p.setColor( TQPalette::Active, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Inactive, TQColorGroup::Highlight, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Disabled, TQColorGroup::Highlight, TQt::white ); + p.setColor( TQPalette::Disabled, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) ); + p.setColor( TQPalette::Active, TQColorGroup::Foreground, TQt::white ); + p.setColor( TQPalette::Active, TQColorGroup::Text, TQt::white ); + p.setColor( TQPalette::Active, TQColorGroup::ButtonText, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::Foreground, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::Text, TQt::white ); + p.setColor( TQPalette::Inactive, TQColorGroup::ButtonText, TQt::white ); + p.setColor( TQPalette::Disabled, TQColorGroup::Foreground, TQt::lightGray ); + p.setColor( TQPalette::Disabled, TQColorGroup::Text, TQt::lightGray ); + p.setColor( TQPalette::Disabled, TQColorGroup::ButtonText, TQt::lightGray ); + + w = previewFormInternal( st, &p ); + } else if ( style == "SGI" ) { + TQPalette p( TQColor( 220, 220, 220 ) ); + w = previewFormInternal( st, &p ); + } else if ( style == "MotifPlus" ) { + TQColor gtkfg(0x00, 0x00, 0x00); + TQColor gtkdf(0x75, 0x75, 0x75); + TQColor gtksf(0xff, 0xff, 0xff); + TQColor gtkbs(0xff, 0xff, 0xff); + TQColor gtkbg(0xd6, 0xd6, 0xd6); + TQColor gtksl(0x00, 0x00, 0x9c); + TQColorGroup active(gtkfg, // foreground + gtkbg, // button + gtkbg.light(), // light + gtkbg.dark(142), // dark + gtkbg.dark(110), // mid + gtkfg, // text + gtkfg, // bright text + gtkbs, // base + gtkbg), // background + disabled(gtkdf, // foreground + gtkbg, // button + gtkbg.light(), // light + gtkbg.dark(156), // dark + gtkbg.dark(110), // mid + gtkdf, // text + gtkdf, // bright text + gtkbs, // base + gtkbg); // background + + TQPalette pal(active, disabled, active); + + pal.setColor(TQPalette::Active, TQColorGroup::Highlight, + gtksl); + pal.setColor(TQPalette::Active, TQColorGroup::HighlightedText, + gtksf); + pal.setColor(TQPalette::Inactive, TQColorGroup::Highlight, + gtksl); + pal.setColor(TQPalette::Inactive, TQColorGroup::HighlightedText, + gtksf); + pal.setColor(TQPalette::Disabled, TQColorGroup::Highlight, + gtksl); + pal.setColor(TQPalette::Disabled, TQColorGroup::HighlightedText, + gtkdf); + w = previewFormInternal( st, &pal ); + } else { + w = previewFormInternal( st ); + } + + if ( !w ) + return; + w->insertChild( TQT_TQOBJECT(st) ); + w->show(); +} + +void MainWindow::helpContents() +{ + TQWidget *focusWidget = tqApp->focusWidget(); + bool showClassDocu = TRUE; + while ( focusWidget ) { + if ( focusWidget->isA( "PropertyList" ) ) { + showClassDocu = FALSE; + break; + } + focusWidget = focusWidget->parentWidget(); + } + + TQString source = "designer-manual.html"; + if ( propertyDocumentation.isEmpty() ) { + TQString indexFile = documentationPath() + "/propertyindex"; + TQFile f( indexFile ); + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + while ( !ts.eof() ) { + TQString s = ts.readLine(); + int from = s.find( "\"" ); + if ( from == -1 ) + continue; + int to = s.findRev( "\"" ); + if ( to == -1 ) + continue; + propertyDocumentation[ s.mid( from + 1, to - from - 1 ) ] = s.mid( to + 2 ) + "-prop"; + } + f.close(); + } + } + + if ( propertyEditor->widget() && !showClassDocu ) { + if ( !propertyEditor->currentProperty().isEmpty() ) { + TQMetaObject* mo = propertyEditor->metaObjectOfCurrentProperty(); + TQString s; + TQString cp = propertyEditor->currentProperty(); + if ( cp == "layoutMargin" ) { + source = propertyDocumentation[ "TQLayout/margin" ]; + } else if ( cp == "layoutSpacing" ) { + source = propertyDocumentation[ "TQLayout/spacing" ]; + } else if ( cp == "toolTip" ) { + source = "tqtooltip.html#details"; + } else if ( mo && qstrcmp( mo->className(), "Spacer" ) == 0 ) { + if ( cp != "name" ) + source = "tqsizepolicy.html#SizeType"; + else + source = propertyDocumentation[ "TQObject/name" ]; + } else { + while ( mo && !propertyDocumentation.contains( ( s = TQString( mo->className() ) + "/" + cp ) ) ) + mo = mo->superClass(); + if ( mo ) + source = "p:" + propertyDocumentation[s]; + } + } + + TQString classname = WidgetFactory::classNameOf( propertyEditor->widget() ); + if ( source.isEmpty() || source == "designer-manual.html" ) { + if ( classname.lower() == "spacer" ) + source = "qspaceritem.html#details"; + else if ( classname == TQLAYOUTWIDGET_OBJECT_NAME_STRING ) + source = "layout.html"; + else + source = TQString( WidgetFactory::classNameOf( propertyEditor->widget() ) ).lower() + ".html#details"; + } + } else if ( propertyEditor->widget() ) { + source = TQString( WidgetFactory::classNameOf( propertyEditor->widget() ) ).lower() + ".html#details"; + } + + if ( !source.isEmpty() ) + assistant->showPage( documentationPath() + source ); +} + +void MainWindow::helpManual() +{ + assistant->showPage( documentationPath() + "/designer-manual.html" ); +} + +void MainWindow::helpAbout() +{ + AboutDialog dlg( this, 0, TRUE ); + if ( singleProjectMode() ) { + dlg.aboutPixmap->setText( "" ); + dlg.aboutVersion->setText( "" ); + dlg.aboutCopyright->setText( "" ); + LanguageInterface *iface = MetaDataBase::languageInterface( eProject->language() ); + dlg.aboutLicense->setText( iface->aboutText() ); + } + dlg.aboutVersion->setText(TQString("Version ") + TQString(TQT_VERSION_STR)); + dlg.resize( dlg.width(), dlg.layout()->heightForWidth(dlg.width()) ); + dlg.exec(); +} + +void MainWindow::helpAboutQt() +{ + TQMessageBox::aboutTQt( this, "TQt Designer" ); +} + +#if defined(_WS_WIN_) +#include <tqt_windows.h> +#include <tqprocess.h> +#endif + +void MainWindow::helpRegister() +{ +#if defined(_WS_WIN_) + HKEY key; + HKEY subkey; + long res; + DWORD type; + DWORD size = 255; + TQString command; + TQString sub( "htmlfile\\shell" ); +#if defined(UNICODE) + if ( TQApplication::winVersion() & TQt::WV_NT_based ) { + unsigned char data[256]; + res = RegOpenKeyExW( HKEY_CLASSES_ROOT, NULL, 0, KEY_READ, &key ); + res = RegOpenKeyExW( key, (TCHAR*)sub.ucs2(), 0, KEY_READ, &subkey ); + res = RegQueryValueExW( subkey, NULL, NULL, &type, data, &size ); + command = qt_winTQString( data ) + "\\command"; + size = 255; + res = RegOpenKeyExW( subkey, (TCHAR*)command.ucs2(), 0, KEY_READ, &subkey ); + res = RegQueryValueExW( subkey, NULL, NULL, &type, data, &size ); + command = qt_winTQString( data ); + } else +#endif + { + unsigned char data[256]; + res = RegOpenKeyExA( HKEY_CLASSES_ROOT, NULL, 0, KEY_READ, &key ); + res = RegOpenKeyExA( key, sub.local8Bit(), 0, KEY_READ, &subkey ); + res = RegQueryValueExA( subkey, NULL, NULL, &type, data, &size ); + command = TQString::fromLocal8Bit( (const char*) data ) + "\\command"; + size = 255; + res = RegOpenKeyExA( subkey, command.local8Bit(), 0, KEY_READ, &subkey ); + res = RegQueryValueExA( subkey, NULL, NULL, &type, data, &size ); + command = TQString::fromLocal8Bit( (const char*) data ); + } + + res = RegCloseKey( subkey ); + res = RegCloseKey( key ); + + TQProcess process( command + " www.trolltech.com/products/download/eval/evaluation.html" ); + if ( !process.start() ) + TQMessageBox::information( this, "Register TQt", "Launching your web browser failed.\n" + "To register TQt, point your browser to www.trolltech.com/products/download/eval/evaluation.html" ); +#endif +} + +void MainWindow::showProperties( TQObject *o ) +{ + if ( !o->isWidgetType() ) { + propertyEditor->setWidget( o, lastActiveFormWindow ); + if ( lastActiveFormWindow ) + hierarchyView->setFormWindow( lastActiveFormWindow, TQT_TQOBJECT(lastActiveFormWindow->mainContainer()) ); + else + hierarchyView->setFormWindow( 0, 0 ); + return; + } + TQWidget *w = (TQWidget*)o; + setupHierarchyView(); + FormWindow *fw = (FormWindow*)isAFormWindowChild( TQT_TQOBJECT(w) ); + if ( fw ) { + if ( fw->numSelectedWidgets() > 1 ) { + TQWidgetList wl = fw->selectedWidgets(); + if ( wl.first() != w ) { + wl.removeRef( w ); + wl.insert( 0, w ); + } + propertyEditor->setWidget( new PropertyObject( wl ), fw ); + } else { + propertyEditor->setWidget( TQT_TQOBJECT(w), fw ); + } + hierarchyView->setFormWindow( fw, TQT_TQOBJECT(w) ); + } else { + propertyEditor->setWidget( 0, 0 ); + hierarchyView->setFormWindow( 0, 0 ); + } + + if ( currentTool() == POINTER_TOOL && fw && + ( !qworkspace->activeWindow() || !::tqqt_cast<SourceEditor*>(qworkspace->activeWindow()) ) ) + fw->setFocus(); +} + +void MainWindow::resetTool() +{ + actionPointerTool->setOn( TRUE ); +} + +void MainWindow::updateProperties( TQObject * ) +{ + if ( propertyEditor ) + propertyEditor->refetchData(); +} + +bool MainWindow::eventFilter( TQObject *o, TQEvent *e ) +{ + if ( ::tqqt_cast<MenuBarEditor*>(o) || ::tqqt_cast<PopupMenuEditor*>(o) || + ( o && + ( ::tqqt_cast<MenuBarEditor*>(o->parent()) || + ::tqqt_cast<PopupMenuEditor*>(o->parent()) ) ) ) { + + if ( e->type() == TQEvent::Accel && ::tqqt_cast<PopupMenuEditor*>(o) ) { + return TRUE; // consume accel events + } else if ( e->type() == TQEvent::MouseButtonPress && ::tqqt_cast<MenuBarEditor*>(o) ) { + TQPoint pos = ((TQMouseEvent*)e)->pos(); + MenuBarEditor *m = ::tqqt_cast<MenuBarEditor*>(o); + showProperties( o ); + if ( m->findItem( pos ) >= m->count() ) + m->setFocus(); + } else if ( e->type() == TQEvent::MouseButtonPress && ::tqqt_cast<PopupMenuEditor*>(o) ) { + PopupMenuEditor *m = ::tqqt_cast<PopupMenuEditor*>(o); + PopupMenuEditorItem *i = m->at( ((TQMouseEvent*)e)->pos() ); + if ( m->find( i->action() ) != -1 && !i->isSeparator() ) + showProperties( i->action() ); + } + return TQMainWindow::eventFilter( o, e ); + } + + if ( !o || !e || !o->isWidgetType() ) + return TQMainWindow::eventFilter( o, e ); + + TQWidget *w = 0; + bool passiveInteractor; + switch ( e->type() ) { + case TQEvent::AccelOverride: + if ( ( (TQKeyEvent*)e )->key() == Key_F1 && + ( ( (TQKeyEvent*)e )->state() & ShiftButton ) != ShiftButton ) { + w = (TQWidget*)o; + while ( w ) { + if ( ::tqqt_cast<PropertyList*>(w) ) + break; + w = w->parentWidget( TRUE ); + } + if ( w ) { + propertyEditor->propertyList()->showCurrentWhatsThis(); + ( (TQKeyEvent*)e )->accept(); + return TRUE; + } + } + break; + case TQEvent::Accel: + if ( ( ( (TQKeyEvent*)e )->key() == Key_A || + ( (TQKeyEvent*)e )->key() == Key_E ) && + ( (TQKeyEvent*)e )->state() & ControlButton ) { + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (TQKeyEvent*)e )->ignore(); + return TRUE; + } + } + break; + case TQEvent::ContextMenu: + case TQEvent::MouseButtonPress: + if ( o && currentTool() == POINTER_TOOL && + ( ::tqqt_cast<MenuBarEditor*>(o) || + ::tqqt_cast<PopupMenuEditor*>(o) || + ::tqqt_cast<QDesignerToolBar*>(o) || + ( ::tqqt_cast<TQComboBox*>(o) || + ::tqqt_cast<TQToolButton*>(o) || + ::tqqt_cast<QDesignerToolBarSeparator*>(o) ) && + o->parent() + && ( ::tqqt_cast<QDesignerToolBar*>(o->parent()) + || ::tqqt_cast<QDesignerWidgetStack*>(o->parent())) ) ) { + TQWidget *w = (TQWidget*)o; + if ( ::tqqt_cast<TQToolButton*>(w) || + ::tqqt_cast<TQComboBox*>(w) || + ::tqqt_cast<PopupMenuEditor*>(w) || + ::tqqt_cast<QDesignerToolBarSeparator*>(w) ) + w = w->parentWidget(); + TQWidget *pw = w->parentWidget(); + while ( pw ) { + if ( ::tqqt_cast<FormWindow*>(pw) ) { + ( (FormWindow*)pw )->emitShowProperties( TQT_TQOBJECT(w) ); + if ( !::tqqt_cast<QDesignerToolBar*>(o) ) + return ( !::tqqt_cast<TQToolButton*>(o) && + !::tqqt_cast<MenuBarEditor*>(o) && + !::tqqt_cast<TQComboBox*>(o) && + !::tqqt_cast<QDesignerToolBarSeparator*>(o) ); + } + pw = pw->parentWidget(); + } + } + if ( o && ( ::tqqt_cast<QDesignerToolBar*>(o) || o->inherits(TQDOCKWINDOWHANDLE_OBJECT_NAME_STRING) ) + && e->type() == TQEvent::ContextMenu ) + break; + if ( isAToolBarChild( o ) && currentTool() != CONNECT_TOOL && currentTool() != BUDDY_TOOL ) + break; + if ( ::tqqt_cast<TQSizeGrip*>(o) ) + break; + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + if ( !w->hasFocus() ) + w->setFocus(); + passiveInteractor = WidgetFactory::isPassiveInteractor( o ); + if ( !passiveInteractor || currentTool() != ORDER_TOOL ) { + if( e->type() == TQEvent::ContextMenu ) { + ( (FormWindow*)w )->handleContextMenu( (TQContextMenuEvent*)e, + ( (FormWindow*)w )->designerWidget( o ) ); + return TRUE; + } else { + ( (FormWindow*)w )->handleMousePress( (TQMouseEvent*)e, + ( (FormWindow*)w )->designerWidget( o ) ); + } + } + lastPressWidget = (TQWidget*)o; + if ( passiveInteractor ) + TQTimer::singleShot( 0, formWindow(), TQT_SLOT( visibilityChanged() ) ); + if ( currentTool() == CONNECT_TOOL || currentTool() == BUDDY_TOOL ) + return TRUE; + return !passiveInteractor; + case TQEvent::MouseButtonRelease: + lastPressWidget = 0; + if ( isAToolBarChild( o ) && currentTool() != CONNECT_TOOL && currentTool() != BUDDY_TOOL ) + break; + if ( ::tqqt_cast<TQSizeGrip*>(o) ) + break; + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + passiveInteractor = WidgetFactory::isPassiveInteractor( o ); + if ( !passiveInteractor ) + ( (FormWindow*)w )->handleMouseRelease( (TQMouseEvent*)e, + ( (FormWindow*)w )->designerWidget( o ) ); + if ( passiveInteractor ) { + TQTimer::singleShot( 0, this, TQT_SLOT( selectionChanged() ) ); + TQTimer::singleShot( 0, formWindow(), TQT_SLOT( visibilityChanged() ) ); + } + return !passiveInteractor; + case TQEvent::MouseMove: + if ( isAToolBarChild( o ) && currentTool() != CONNECT_TOOL && currentTool() != BUDDY_TOOL ) + break; + w = isAFormWindowChild( o ); + if ( lastPressWidget != (TQWidget*)o && w && + !::tqqt_cast<SizeHandle*>(o) && !::tqqt_cast<OrderIndicator*>(o) && + !::tqqt_cast<PopupMenuEditor*>(o) && !::tqqt_cast<TQMenuBar*>(o) && + !::tqqt_cast<TQSizeGrip*>(o) ) + return TRUE; + if ( o && ::tqqt_cast<TQSizeGrip*>(o) ) + break; + if ( lastPressWidget != (TQWidget*)o || + ( !w || ::tqqt_cast<SizeHandle*>(o) ) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + passiveInteractor = WidgetFactory::isPassiveInteractor( o ); + if ( !passiveInteractor ) + ( (FormWindow*)w )->handleMouseMove( (TQMouseEvent*)e, + ( (FormWindow*)w )->designerWidget( o ) ); + return !passiveInteractor; + case TQEvent::KeyPress: + if ( ( (TQKeyEvent*)e )->key() == Key_Escape && currentTool() != POINTER_TOOL ) { + resetTool(); + return FALSE; + } + if ( ( (TQKeyEvent*)e )->key() == Key_Escape && incrementalSearch->hasFocus() ) { + if ( ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + qWorkspace()->activeWindow()->setFocus(); + return TRUE; + } + } + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + ( (FormWindow*)w )->handleKeyPress( (TQKeyEvent*)e, ( (FormWindow*)w )->designerWidget( o ) ); + if ( ((TQKeyEvent*)e)->isAccepted() ) + return TRUE; + break; + case TQEvent::MouseButtonDblClick: + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) { + if ( ::tqqt_cast<TQToolButton*>(o) && ((TQToolButton*)o)->isOn() && + o->parent() && ::tqqt_cast<TQToolBar*>(o->parent()) && formWindow() ) + formWindow()->setToolFixed(); + break; + } + if ( currentTool() == ORDER_TOOL ) { + ( (FormWindow*)w )->handleMouseDblClick( (TQMouseEvent*)e, + ( (FormWindow*)w )->designerWidget( o ) ); + return TRUE; + } + if ( !WidgetFactory::isPassiveInteractor( o ) && ( (FormWindow*)w )->formFile() ) + return openEditor( ( (FormWindow*)w )->designerWidget( o ), (FormWindow*)w ); + return TRUE; + case TQEvent::KeyRelease: + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + ( (FormWindow*)w )->handleKeyRelease( (TQKeyEvent*)e, ( (FormWindow*)w )->designerWidget( o ) ); + if ( ((TQKeyEvent*)e)->isAccepted() ) + return TRUE; + break; + case TQEvent::Hide: + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + if ( ( (FormWindow*)w )->isWidgetSelected( TQT_TQOBJECT(o) ) ) + ( (FormWindow*)w )->selectWidget( TQT_TQOBJECT(o), FALSE ); + break; + case TQEvent::Enter: + case TQEvent::Leave: + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) || + ::tqqt_cast<MenuBarEditor*>(o) ) + break; + return TRUE; + case TQEvent::Resize: + case TQEvent::Move: + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + if ( WidgetFactory::layoutType( (TQWidget*)o->parent() ) != WidgetFactory::NoLayout ) { + ( (FormWindow*)w )->updateSelection( (TQWidget*)o ); + if ( e->type() != TQEvent::Resize ) + ( (FormWindow*)w )->updateChildSelections( (TQWidget*)o ); + } + break; + case TQEvent::Close: + if ( o->isWidgetType() && (TQWidget*)o == (TQWidget*)previewedForm ) { + if ( lastActiveFormWindow && lastActiveFormWindow->project() ) { + TQStringList lst = + MetaDataBase::fakeProperty( TQT_TQOBJECT(lastActiveFormWindow), "database" ).toStringList(); + lastActiveFormWindow->project()->closeDatabase( lst[ 0 ] ); + } + } + break; + case TQEvent::DragEnter: + if ( TQT_BASE_OBJECT(o) == qWorkspace() || TQT_BASE_OBJECT(o) == workspace() || TQT_BASE_OBJECT(o) == workspace()->viewport() ) { + workspace()->contentsDragEnterEvent( (TQDragEnterEvent*)e ); + return TRUE; + } + break; + case TQEvent::DragMove: + if ( TQT_BASE_OBJECT(o) == qWorkspace() || TQT_BASE_OBJECT(o) == workspace() || TQT_BASE_OBJECT(o) == workspace()->viewport() ) { + workspace()->contentsDragMoveEvent( (TQDragMoveEvent*)e ); + return TRUE; + } + break; + case TQEvent::Drop: + if ( TQT_BASE_OBJECT(o) == qWorkspace() || TQT_BASE_OBJECT(o) == workspace() || TQT_BASE_OBJECT(o) == workspace()->viewport() ) { + workspace()->contentsDropEvent( (TQDropEvent*)e ); + return TRUE; + } + break; + case TQEvent::Show: + if ( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(this) ) + break; + if ( ((TQShowEvent*)e)->spontaneous() ) + break; + TQApplication::sendPostedEvents( qworkspace, TQEvent::ChildInserted ); + showEvent( (TQShowEvent*)e ); + checkTempFiles(); + return TRUE; + case TQEvent::Wheel: + if ( !( w = isAFormWindowChild( o ) ) || + ::tqqt_cast<SizeHandle*>(o) || + ::tqqt_cast<OrderIndicator*>(o) ) + break; + return TRUE; + case TQEvent::FocusIn: + if ( !::tqqt_cast<FormWindow*>(o) && isAFormWindowChild( o ) ) + return TRUE; //FIXME + if ( hierarchyView->formDefinitionView()->isRenaming() + && ( o->inherits( "Editor" ) || ::tqqt_cast<FormWindow*>(o) ) ) + TQApplication::sendPostedEvents(); + if ( o->inherits( "Editor" ) ) { + TQWidget *w = (TQWidget*)o; + while ( w ) { + if ( ::tqqt_cast<SourceEditor*>(w) ) + break; + w = w->parentWidget( TRUE ); + } + if ( ::tqqt_cast<SourceEditor*>(w) ) + ( (SourceEditor*)w )->checkTimeStamp(); + } else if ( ::tqqt_cast<FormWindow*>(o) ) { + FormWindow *fw = (FormWindow*)o; + if ( fw->formFile() && fw->formFile()->editor() ) + fw->formFile()->editor()->checkTimeStamp(); + } + break; + case TQEvent::FocusOut: + if ( !::tqqt_cast<FormWindow*>(o) && isAFormWindowChild( o ) ) + return TRUE; + break; + default: + return TQMainWindow::eventFilter( o, e ); + } + + return TQMainWindow::eventFilter( o, e ); +} + +TQWidget *MainWindow::isAFormWindowChild( TQObject *o ) const +{ + if ( ::tqqt_cast<TQWizard*>(o->parent()) && !::tqqt_cast<TQPushButton*>(o) ) + return 0; + while ( o ) { + if ( ::tqqt_cast<FormWindow*>(o) ) + return (TQWidget*)o; + o = o->parent(); + } + return 0; +} + +TQWidget *MainWindow::isAToolBarChild( TQObject *o ) const +{ + while ( o ) { + if ( ::tqqt_cast<QDesignerToolBar*>(o) ) + return (TQWidget*)o; + if ( ::tqqt_cast<FormWindow*>(o) ) + return 0; + o = o->parent(); + } + return 0; +} + +FormWindow *MainWindow::formWindow() +{ + if ( qworkspace->activeWindow() ) { + FormWindow *fw = 0; + if ( ::tqqt_cast<FormWindow*>(qworkspace->activeWindow()) ) + fw = (FormWindow*)qworkspace->activeWindow(); + else if ( lastActiveFormWindow && + qworkspace->windowList().find( lastActiveFormWindow ) != -1) + fw = lastActiveFormWindow; + return fw; + } + return 0; +} + +void MainWindow::emitProjectSignals() +{ + emit hasNonDummyProject( !currentProject->isDummy() ); + emit hasActiveWindowOrProject( !!qworkspace->activeWindow() || !currentProject->isDummy() ); +} + +void MainWindow::insertFormWindow( FormWindow *fw ) +{ + if ( fw ) + TQWhatsThis::add( fw, i18n( "<b>The Form Window</b>" + "<p>Use the various tools to add widgets or to change the layout " + "and behavior of the components in the form. Select one or multiple " + "widgets to move them or lay them out. If a single widget is chosen it can " + "be resized using the resize handles.</p>" + "<p>Changes in the <b>Property Editor</b> are visible at design time, " + "and you can preview the form in different styles.</p>" + "<p>You can change the grid resolution, or turn the grid off in the " + "<b>Preferences</b> dialog in the <b>Edit</b> menu." + "<p>You can have several forms open, and all open forms are listed " + "in the <b>Form List</b>.") ); + + connect( fw, TQT_SIGNAL( showProperties( TQObject * ) ), + this, TQT_SLOT( showProperties( TQObject * ) ) ); + connect( fw, TQT_SIGNAL( updateProperties( TQObject * ) ), + this, TQT_SLOT( updateProperties( TQObject * ) ) ); + connect( this, TQT_SIGNAL( currentToolChanged() ), + fw, TQT_SLOT( currentToolChanged() ) ); + connect( fw, TQT_SIGNAL( selectionChanged() ), + this, TQT_SLOT( selectionChanged() ) ); + connect( fw, TQT_SIGNAL( undoRedoChanged( bool, bool, const TQString &, const TQString & ) ), + this, TQT_SLOT( updateUndoRedo( bool, bool, const TQString &, const TQString & ) ) ); + + if ( !mblockNewForms ) { + } else { + fw->setProject( currentProject ); + } + fw->show(); + fw->currentToolChanged(); + if ( fw->caption().isEmpty() && tqstrlen( fw->name() ) ) + fw->setCaption( fw->name() ); + fw->mainContainer()->setCaption( fw->caption() ); + WidgetFactory::saveDefaultProperties( TQT_TQOBJECT(fw->mainContainer()), + WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(fw->mainContainer()) ) ) ); + activeWindowChanged( fw ); + emit formWindowsChanged(); + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( e->project() == fw->project() ) + e->resetContext(); + } +} + +void MainWindow::createNewProject( const TQString &lang ) +{ + Project *pro = new Project( "", "", projectSettingsPluginManager ); + pro->setLanguage( lang ); + + + if ( !openProjectSettings( pro ) ) { + delete pro; + return; + } + + if ( !pro->isValid() ) { + TQMessageBox::information( this, i18n("New Project"), i18n( "Cannot create an invalid project." ) ); + delete pro; + return; + } + + TQAction *a = new TQAction( pro->makeRelative( pro->fileName() ), + pro->makeRelative( pro->fileName() ), 0, actionGroupProjects, 0, TRUE ); + projects.insert( a, pro ); + addRecentlyOpened( pro->makeAbsolute( pro->fileName() ), recentlyProjects ); + projectSelected( a ); +} + + +bool MainWindow::unregisterClient( FormWindow *w ) +{ + propertyEditor->closed( w ); + objectHierarchy()->closed( w ); + if ( w == lastActiveFormWindow ) + lastActiveFormWindow = 0; + + TQPtrList<SourceEditor> waitingForDelete; + waitingForDelete.setAutoDelete( TRUE ); + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( TQT_BASE_OBJECT(e->object()) == TQT_BASE_OBJECT(w) ) + waitingForDelete.append( e ); + } + + if ( actionEditor->form() == w ) { + actionEditor->setFormWindow( 0 ); + actionEditor->parentWidget()->hide(); + } + + return TRUE; +} + +void MainWindow::activeWindowChanged( TQWidget *w ) +{ + TQWidget *old = formWindow(); + if ( ::tqqt_cast<FormWindow*>(w) ) { + FormWindow *fw = (FormWindow*)w; + FormWindow *ofw = lastActiveFormWindow; + lastActiveFormWindow = fw; + lastActiveFormWindow->updateUndoInfo(); + emit hasActiveForm( TRUE ); + if ( formWindow() ) { + formWindow()->emitShowProperties(); + emit formModified( formWindow()->commandHistory()->isModified() ); + if ( currentTool() != POINTER_TOOL ) + formWindow()->clearSelection(); + } + workspace()->activeFormChanged( fw ); + setAppropriate( (TQDockWindow*)actionEditor->parentWidget(), + ::tqqt_cast<TQMainWindow*>(lastActiveFormWindow->mainContainer()) ); + if ( appropriate( (TQDockWindow*)actionEditor->parentWidget() ) ) { + if ( actionEditor->wantToBeShown() ) + actionEditor->parentWidget()->show(); + } else { + TQWidget *mc = 0; + if ( ofw && (mc = ofw->mainContainer()) && ::tqqt_cast<TQMainWindow*>(mc) ) + actionEditor->setWantToBeShown( !actionEditor->parentWidget()->isHidden() ); + actionEditor->parentWidget()->hide(); + } + + actionEditor->setFormWindow( lastActiveFormWindow ); + if ( wspace && fw->project() && fw->project() != currentProject ) { + for ( TQMap<TQAction*, Project *>::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { + if ( *it == fw->project() ) { + projectSelected( it.key() ); + break; + } + } + } + emit formWindowChanged(); + + } else if ( w == propertyEditor ) { + propertyEditor->resetFocus(); + } else if ( !lastActiveFormWindow ) { + emit formWindowChanged(); + emit hasActiveForm( FALSE ); + actionEditUndo->setEnabled( FALSE ); + actionEditRedo->setEnabled( FALSE ); + } + + if ( !w ) { + emit formWindowChanged(); + emit hasActiveForm( FALSE ); + propertyEditor->clear(); + hierarchyView->clear(); + updateUndoRedo( FALSE, FALSE, TQString(), TQString() ); + } + + selectionChanged(); + + if ( ::tqqt_cast<SourceEditor*>(w) ) { + SourceEditor *se = (SourceEditor*)w; + TQGuardedPtr<FormWindow> fw = se->formWindow(); + if ( se->formWindow() && + lastActiveFormWindow != fw ) { + activeWindowChanged( se->formWindow() ); + } + actionSearchFind->setEnabled( TRUE ); + actionSearchIncremetal->setEnabled( TRUE ); + actionSearchReplace->setEnabled( TRUE ); + actionSearchGotoLine->setEnabled( TRUE ); + incrementalSearch->setEnabled( TRUE ); + + actionEditUndo->setEnabled( FALSE ); + actionEditRedo->setEnabled( FALSE ); + actionEditCut->setEnabled( TRUE ); + actionEditCopy->setEnabled( TRUE ); + actionEditPaste->setEnabled( TRUE ); + actionEditSelectAll->setEnabled( TRUE ); + actionEditUndo->setMenuText( i18n( "&Undo" ) ); + actionEditUndo->setToolTip( textNoAccel( actionEditUndo->menuText()) ); + actionEditRedo->setMenuText( i18n( "&Redo" ) ); + actionEditRedo->setToolTip( textNoAccel( actionEditRedo->menuText()) ); + if ( hierarchyView->sourceEditor() != w ) + hierarchyView->showClasses( se ); + actionEditor->setFormWindow( 0 ); + if ( wspace && se->project() && se->project() != currentProject ) { + for ( TQMap<TQAction*, Project *>::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { + if ( *it == se->project() ) { + projectSelected( it.key() ); + break; + } + } + } + workspace()->activeEditorChanged( se ); + } else { + actionSearchFind->setEnabled( FALSE ); + actionSearchIncremetal->setEnabled( FALSE ); + actionSearchReplace->setEnabled( FALSE ); + actionSearchGotoLine->setEnabled( FALSE ); + incrementalSearch->setEnabled( FALSE ); + } + + if ( currentTool() == ORDER_TOOL && w != old ) + emit currentToolChanged(); + + emit hasActiveWindow( !!qworkspace->activeWindow() ); +} + +void MainWindow::updateUndoRedo( bool undoAvailable, bool redoAvailable, + const TQString &undoCmd, const TQString &redoCmd ) +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; // do not set a formWindow related command + actionEditUndo->setEnabled( undoAvailable ); + actionEditRedo->setEnabled( redoAvailable ); + if ( !undoCmd.isEmpty() ) + actionEditUndo->setMenuText( i18n( "&Undo: %1" ).arg( undoCmd ) ); + else + actionEditUndo->setMenuText( i18n( "&Undo: Not Available" ) ); + if ( !redoCmd.isEmpty() ) + actionEditRedo->setMenuText( i18n( "&Redo: %1" ).arg( redoCmd ) ); + else + actionEditRedo->setMenuText( i18n( "&Redo: Not Available" ) ); + + actionEditUndo->setToolTip( textNoAccel( actionEditUndo->menuText()) ); + actionEditRedo->setToolTip( textNoAccel( actionEditRedo->menuText()) ); + + if ( currentTool() == ORDER_TOOL ) { + actionEditUndo->setEnabled( FALSE ); + actionEditRedo->setEnabled( FALSE ); + } +} + +void MainWindow::updateEditorUndoRedo() +{ + if ( !qWorkspace()->activeWindow() || + !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + SourceEditor *editor = (SourceEditor*)qWorkspace()->activeWindow(); + actionEditUndo->setEnabled( editor->editIsUndoAvailable() ); + actionEditRedo->setEnabled( editor->editIsRedoAvailable() ); +} + +TQWorkspace *MainWindow::qWorkspace() const +{ + return qworkspace; +} + +void MainWindow::popupFormWindowMenu( const TQPoint & gp, FormWindow *fw ) +{ + TQValueList<uint> ids; + TQMap<TQString, int> commands; + + setupRMBSpecialCommands( ids, commands, fw ); + setupRMBProperties( ids, commands, fw ); + + tqApp->processEvents(); + int r = rmbFormWindow->exec( gp ); + + handleRMBProperties( r, commands, fw ); + handleRMBSpecialCommands( r, commands, fw ); + + for ( TQValueList<uint>::ConstIterator i = ids.begin(); i != ids.end(); ++i ) + rmbFormWindow->removeItem( *i ); +} + +void MainWindow::popupWidgetMenu( const TQPoint &gp, FormWindow * /*fw*/, TQWidget * w) +{ + TQValueList<uint> ids; + TQMap<TQString, int> commands; + + setupRMBSpecialCommands( ids, commands, w ); + setupRMBProperties( ids, commands, w ); + + tqApp->processEvents(); + int r = rmbWidgets->exec( gp ); + + handleRMBProperties( r, commands, w ); + handleRMBSpecialCommands( r, commands, w ); + + for ( TQValueList<uint>::ConstIterator i = ids.begin(); i != ids.end(); ++i ) + rmbWidgets->removeItem( *i ); +} + +void MainWindow::setupRMBProperties( TQValueList<uint> &ids, TQMap<TQString, int> &props, TQWidget *w ) +{ + const TQMetaProperty* text = w->metaObject()->property( w->metaObject()->findProperty( "text", TRUE ), TRUE ); + if ( text && qstrcmp( text->type(), TQSTRING_OBJECT_NAME_STRING) != 0 ) + text = 0; + const TQMetaProperty* title = w->metaObject()->property( w->metaObject()->findProperty( "title", TRUE ), TRUE ); + if ( title && qstrcmp( title->type(), TQSTRING_OBJECT_NAME_STRING) != 0 ) + title = 0; + const TQMetaProperty* pagetitle = + w->metaObject()->property( w->metaObject()->findProperty( "pageTitle", TRUE ), TRUE ); + if ( pagetitle && qstrcmp( pagetitle->type(), TQSTRING_OBJECT_NAME_STRING) != 0 ) + pagetitle = 0; + const TQMetaProperty* pixmap = + w->metaObject()->property( w->metaObject()->findProperty( "pixmap", TRUE ), TRUE ); + if ( pixmap && qstrcmp( pixmap->type(), TQPIXMAP_OBJECT_NAME_STRING) != 0 ) + pixmap = 0; + + if ( text && text->designable(w) || + title && title->designable(w) || + pagetitle && pagetitle->designable(w) || + pixmap && pixmap->designable(w) ) { + int id = 0; + if ( ids.isEmpty() ) + ids << rmbWidgets->insertSeparator(0); + if ( pixmap && pixmap->designable(w) ) { + ids << ( id = rmbWidgets->insertItem( i18n("Choose Pixmap..."), -1, 0) ); + props.insert( "pixmap", id ); + } + if ( text && text->designable(w) && !::tqqt_cast<TQTextEdit*>(w) ) { + ids << ( id = rmbWidgets->insertItem( i18n("Edit Text..."), -1, 0) ); + props.insert( "text", id ); + } + if ( title && title->designable(w) ) { + ids << ( id = rmbWidgets->insertItem( i18n("Edit Title..."), -1, 0) ); + props.insert( "title", id ); + } + if ( pagetitle && pagetitle->designable(w) ) { + ids << ( id = rmbWidgets->insertItem( i18n("Edit Page Title..."), -1, 0) ); + props.insert( "pagetitle", id ); + } + } +} + +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS +static TQWidgetContainerInterfacePrivate *containerWidgetInterface( TQWidget *w ) +{ + WidgetInterface *iface = 0; + widgetManager()->queryInterface( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ), &iface ); + if ( !iface ) + return 0; + TQWidgetContainerInterfacePrivate *iface2 = 0; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); + if ( !iface2 ) + return 0; + iface->release(); + return iface2; +} +#endif + +void MainWindow::setupRMBSpecialCommands( TQValueList<uint> &ids, + TQMap<TQString, int> &commands, TQWidget *w ) +{ + int id; + + if ( ::tqqt_cast<TQTabWidget*>(w) ) { + if ( ids.isEmpty() ) + ids << rmbWidgets->insertSeparator( 0 ); + if ( ( (QDesignerTabWidget*)w )->count() > 1) { + ids << ( id = rmbWidgets->insertItem( i18n("Delete Page"), -1, 0 ) ); + commands.insert( "remove", id ); + } + ids << ( id = rmbWidgets->insertItem( i18n("Add Page"), -1, 0 ) ); + commands.insert( "add", id ); + } else if ( ::tqqt_cast<QDesignerWidgetStack*>(w) ) { + if ( ids.isEmpty() ) + ids << rmbWidgets->insertSeparator( 0 ); + if ( ( (QDesignerWidgetStack*)w )->count() > 1) { + ids << ( id = rmbWidgets->insertItem( i18n("Previous Page"), -1, 0 ) ); + commands.insert( "prevpage", id ); + ids << ( id = rmbWidgets->insertItem( i18n("Next Page"), -1, 0 ) ); + ids << rmbWidgets->insertSeparator( 0 ); + commands.insert( "nextpage", id ); + ids << ( id = rmbWidgets->insertItem( i18n("Delete Page"), -1, 0 ) ); + commands.insert( "remove", id ); + } + ids << ( id = rmbWidgets->insertItem( i18n("Add Page"), -1, 0 ) ); + commands.insert( "add", id ); + } else if ( ::tqqt_cast<TQToolBox*>(w) ) { + if ( ids.isEmpty() ) + ids << rmbWidgets->insertSeparator( 0 ); + if ( ( (TQToolBox*)w )->count() > 1 ) { + ids << ( id = rmbWidgets->insertItem( i18n("Delete Page"), -1, 0 ) ); + commands.insert( "remove", id ); + } + ids << ( id = rmbWidgets->insertItem( i18n("Add Page"), -1, 0 ) ); + commands.insert( "add", id ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + } else if ( WidgetDatabase:: + isCustomPluginWidget( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) ) { + TQWidgetContainerInterfacePrivate *iface = containerWidgetInterface( w ); + if ( iface && iface->supportsPages( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) { + if ( ids.isEmpty() ) + ids << rmbWidgets->insertSeparator( 0 ); + + if ( iface->count( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ), w ) > 1 ) { + ids << ( id = rmbWidgets->insertItem( i18n( "Delete Page" ), -1, 0 ) ); + commands.insert( "remove", id ); + } + ids << ( id = rmbWidgets->insertItem( i18n("Add Page"), -1, 0 ) ); + commands.insert( "add", id ); + if ( iface->currentIndex( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ), w ) != -1 ) { + ids << ( id = rmbWidgets->insertItem( i18n("Rename Current Page..."), -1, 0 ) ); + commands.insert( "rename", id ); + } + } + if ( iface ) + iface->release(); +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + } + + if ( WidgetFactory::hasSpecialEditor( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ), TQT_TQOBJECT(w) ) ) { + if ( ids.isEmpty() ) + ids << rmbWidgets->insertSeparator( 0 ); + ids << ( id = rmbWidgets->insertItem( i18n("Edit..."), -1, 0 ) ); + commands.insert( "edit", id ); + } +} + +void MainWindow::setupRMBSpecialCommands( TQValueList<uint> &ids, + TQMap<TQString, int> &commands, FormWindow *fw ) +{ + int id; + + if ( ::tqqt_cast<TQWizard*>(fw->mainContainer()) ) { + if ( ids.isEmpty() ) + ids << rmbFormWindow->insertSeparator( 0 ); + + if ( ( (TQWizard*)fw->mainContainer() )->pageCount() > 1) { + ids << ( id = rmbFormWindow->insertItem( i18n("Delete Page"), -1, 0 ) ); + commands.insert( "remove", id ); + } + + ids << ( id = rmbFormWindow->insertItem( i18n("Add Page"), -1, 0 ) ); + commands.insert( "add", id ); + + ids << ( id = rmbFormWindow->insertItem( i18n("Edit Page Title..."), -1, 0 ) ); + commands.insert( "rename", id ); + + ids << ( id = rmbFormWindow->insertItem( i18n("Edit Pages..."), -1, 0 ) ); + commands.insert( "edit", id ); + + } else if ( ::tqqt_cast<TQMainWindow*>(fw->mainContainer()) ) { + if ( ids.isEmpty() ) + ids << rmbFormWindow->insertSeparator( 0 ); + ids << ( id = rmbFormWindow->insertItem( i18n( "Add Menu Item" ), -1, 0 ) ); + commands.insert( "add_menu_item", id ); + ids << ( id = rmbFormWindow->insertItem( i18n( "Add Toolbar" ), -1, 0 ) ); + commands.insert( "add_toolbar", id ); + } +} + +void MainWindow::handleRMBProperties( int id, TQMap<TQString, int> &props, TQWidget *w ) +{ + if ( id == props[ "text" ] ) { + bool ok = FALSE; + bool oldDoWrap = FALSE; + if ( ::tqqt_cast<TQLabel*>(w) ) { + int align = w->property( "alignment" ).toInt(); + if ( align & WordBreak ) + oldDoWrap = TRUE; + } + bool doWrap = oldDoWrap; + + TQString text; + if ( ::tqqt_cast<TQTextView*>(w) || ::tqqt_cast<TQLabel*>(w) || ::tqqt_cast<TQButton*>(w) ) { + text = MultiLineEditor::getText( this, w->property( "text" ).toString(), !::tqqt_cast<TQButton*>(w), &doWrap ); + ok = !text.isNull(); + } else { + text = TQInputDialog::getText( i18n("Text"), i18n( "New text" ), + TQLineEdit::Normal, w->property("text").toString(), &ok, this ); + } + if ( ok ) { + if ( oldDoWrap != doWrap ) { + TQString pn( i18n( "Set 'wordwrap' of '%1'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "wordwrap", TQVariant( oldDoWrap, 0 ), + TQVariant( doWrap, 0 ), TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "wordwrap", TRUE ); + } + + TQString pn( i18n( "Set the 'text' of '%1'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "text", w->property( "text" ), + text, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "text", TRUE ); + } + } else if ( id == props[ "title" ] ) { + bool ok = FALSE; + TQString title = TQInputDialog::getText( i18n("Title"), i18n( "New title" ), + TQLineEdit::Normal, w->property("title").toString(), &ok, this ); + if ( ok ) { + TQString pn( i18n( "Set the 'title' of '%2'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "title", w->property( "title" ), + title, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "title", TRUE ); + } + } else if ( id == props[ "pagetitle" ] ) { + bool ok = FALSE; + TQString text = TQInputDialog::getText( i18n("Page Title"), i18n( "New page title" ), + TQLineEdit::Normal, w->property("pageTitle").toString(), &ok, this ); + if ( ok ) { + TQString pn( i18n( "Set the 'pageTitle' of '%2'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "pageTitle", + w->property( "pageTitle" ), + text, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "pageTitle", TRUE ); + } + } else if ( id == props[ "pixmap" ] ) { + TQPixmap oldPix = TQVariant(w->property( "pixmap" )).toPixmap(); + TQPixmap pix = qChoosePixmap( this, formWindow(), oldPix ); + if ( !pix.isNull() ) { + TQString pn( i18n( "Set the 'pixmap' of '%2'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "pixmap", w->property( "pixmap" ), + pix, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "pixmap", TRUE ); + } + } +} + +void MainWindow::handleRMBSpecialCommands( int id, TQMap<TQString, int> &commands, TQWidget *w ) +{ + if ( ::tqqt_cast<TQTabWidget*>(w) ) { + TQTabWidget *tw = (TQTabWidget*)w; + if ( id == commands[ "add" ] ) { + AddTabPageCommand *cmd = + new AddTabPageCommand( i18n( "Add Page to %1" ).arg( tw->name() ), formWindow(), + tw, "Tab" ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( id == commands[ "remove" ] ) { + if ( tw->currentPage() ) { + QDesignerTabWidget *dtw = (QDesignerTabWidget*)tw; + DeleteTabPageCommand *cmd = + new DeleteTabPageCommand( i18n( "Delete Page %1 of %2" ). + arg( dtw->pageTitle() ).arg( tw->name() ), + formWindow(), tw, tw->currentPage() ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } + } else if ( ::tqqt_cast<TQToolBox*>(w) ) { + TQToolBox *tb = (TQToolBox*)w; + if ( id == commands[ "add" ] ) { + AddToolBoxPageCommand *cmd = + new AddToolBoxPageCommand( i18n( "Add Page to %1" ).arg( tb->name() ), + formWindow(), + tb, "Page" ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( id == commands[ "remove" ] ) { + if ( tb->currentItem() ) { + DeleteToolBoxPageCommand *cmd = + new DeleteToolBoxPageCommand( i18n( "Delete Page %1 of %2" ). + arg( tb->itemLabel( tb->currentIndex() ) ). + arg( tb->name() ), + formWindow(), tb, tb->currentItem() ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } + } else if ( ::tqqt_cast<TQWidgetStack*>(w) ) { + QDesignerWidgetStack *ws = (QDesignerWidgetStack*)w; + if ( id == commands[ "add" ] ) { + AddWidgetStackPageCommand *cmd = + new AddWidgetStackPageCommand( i18n( "Add Page to %1" ).arg( ws->name() ), + formWindow(), ws ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( id == commands[ "remove" ] ) { + if ( ws->visibleWidget() ) { + DeleteWidgetStackPageCommand *cmd = + new DeleteWidgetStackPageCommand( i18n( "Delete Page %1 of %2" ). + arg( ws->currentPage() ).arg( ws->name() ), + formWindow(), ws, ws->visibleWidget() ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } else if ( id == commands[ "nextpage" ] ) { + int currentPage = w->property( "currentPage" ).toInt(); + TQString pn( i18n( "Raise next page of '%2'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = + new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "currentPage", currentPage, + currentPage + 1, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "currentPage", TRUE ); + } else if ( id == commands[ "prevpage" ] ) { + int currentPage = w->property( "currentPage" ).toInt(); + TQString pn( i18n( "Raise previous page of '%2'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = + new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "currentPage", currentPage, + currentPage -1, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "currentPage", TRUE ); + } +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + } else if ( WidgetDatabase:: + isCustomPluginWidget( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) ) { + if ( id == commands[ "add" ] ) { + AddContainerPageCommand *cmd = + new AddContainerPageCommand( i18n( "Add Page to %1" ).arg( w->name() ), + formWindow(), w, "Page" ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( id == commands[ "remove" ] ) { + TQWidgetContainerInterfacePrivate *iface = containerWidgetInterface( w ); + if ( iface ) { + TQString wClassName = WidgetFactory::classNameOf( TQT_TQOBJECT(w) ); + int index = iface->currentIndex( wClassName, w ); + DeleteContainerPageCommand *cmd = + new DeleteContainerPageCommand( i18n( "Delete Page %1 of %2" ). + arg( iface->pageLabel( wClassName, + w, index ) ). + arg( w->name() ), + formWindow(), w, index ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + iface->release(); + } + } else if ( id == commands[ "rename" ] ) { + TQWidgetContainerInterfacePrivate *iface = containerWidgetInterface( w ); + if ( iface ) { + bool ok = FALSE; + TQString wClassName = WidgetFactory::classNameOf( TQT_TQOBJECT(w) ); + int index = iface->currentIndex( wClassName, w ); + TQString text = TQInputDialog::getText( i18n("Page Title"), i18n( "New page title" ), + TQLineEdit::Normal, + iface->pageLabel( wClassName, w, + index ), + &ok, this ); + if ( ok ) { + RenameContainerPageCommand *cmd = + new RenameContainerPageCommand( i18n( "Rename Page %1 to %2" ). + arg( iface-> + pageLabel( wClassName, w, + index ) ). + arg( text ), formWindow(), + w, index, text ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + iface->release(); + } + } +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + } + + if ( WidgetFactory::hasSpecialEditor( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ), TQT_TQOBJECT(w) ) ) { + if ( id == commands[ "edit" ] ) + WidgetFactory::editWidget( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ), this, w, formWindow() ); + } +} + +void MainWindow::handleRMBSpecialCommands( int id, TQMap<TQString, int> &commands, FormWindow *fw ) +{ + if ( ::tqqt_cast<TQWizard*>(fw->mainContainer()) ) { + TQWizard *wiz = (TQWizard*)fw->mainContainer(); + if ( id == commands[ "add" ] ) { + AddWizardPageCommand *cmd = + new AddWizardPageCommand( i18n( "Add Page to %1" ).arg( wiz->name() ), + formWindow(), wiz, "WizardPage" ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( id == commands[ "remove" ] ) { + if ( wiz->currentPage() ) { + QDesignerWizard *dw = (QDesignerWizard*)wiz; + DeleteWizardPageCommand *cmd = + new DeleteWizardPageCommand( i18n( "Delete Page %1 of %2" ). + arg( dw->pageTitle() ).arg( wiz->name() ), + formWindow(), wiz, + wiz->indexOf( wiz->currentPage() ) ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } else if ( id == commands[ "edit" ] ) { + WizardEditor *e = new WizardEditor( this, wiz, fw ); + e->exec(); + delete e; + } else if ( id == commands[ "rename" ] ) { + + bool ok = FALSE; + QDesignerWizard *dw = (QDesignerWizard*)wiz; + TQString text = TQInputDialog::getText( i18n("Page Title"), i18n( "New page title" ), + TQLineEdit::Normal, dw->pageTitle(), &ok, this ); + if ( ok ) { + TQString pn( i18n( "Rename page %1 of %2" ).arg( dw->pageTitle() ).arg( wiz->name() ) ); + RenameWizardPageCommand *cmd = + new RenameWizardPageCommand( pn, formWindow() + , wiz, wiz->indexOf( wiz->currentPage() ), text ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } + } else if ( ::tqqt_cast<TQMainWindow*>(fw->mainContainer()) ) { + TQMainWindow *mw = (TQMainWindow*)fw->mainContainer(); + if ( id == commands[ "add_toolbar" ] ) { + AddToolBarCommand *cmd = + new AddToolBarCommand( i18n( "Add Toolbar to '%1'" ).arg( formWindow()->name() ), + formWindow(), mw ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( id == commands[ "add_menu_item" ] ) { + AddMenuCommand *cmd = + new AddMenuCommand( i18n( "Add Menu to '%1'" ).arg( formWindow()->name() ), + formWindow(), mw ); + formWindow()->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + } +} + +void MainWindow::clipboardChanged() +{ + TQString text( tqApp->clipboard()->text() ); + TQString start( "<!DOCTYPE UI-SELECTION>" ); + actionEditPaste->setEnabled( text.left( start.length() ) == start ); +} + +void MainWindow::selectionChanged() +{ + layoutChilds = FALSE; + layoutSelected = FALSE; + breakLayout = FALSE; + if ( !formWindow() ) { + actionEditCut->setEnabled( FALSE ); + actionEditCopy->setEnabled( FALSE ); + actionEditDelete->setEnabled( FALSE ); + actionEditAdjustSize->setEnabled( FALSE ); + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditSplitHorizontal->setEnabled( FALSE ); + actionEditSplitVertical->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + actionEditBreakLayout->setEnabled( FALSE ); + actionEditLower->setEnabled( FALSE ); + actionEditRaise->setEnabled( FALSE ); + actionEditAdjustSize->setEnabled( FALSE ); + return; + } + + int selectedWidgets = formWindow()->numSelectedWidgets(); + bool enable = selectedWidgets > 0; + actionEditCut->setEnabled( enable ); + actionEditCopy->setEnabled( enable ); + actionEditDelete->setEnabled( enable ); + actionEditLower->setEnabled( enable ); + actionEditRaise->setEnabled( enable ); + + actionEditAdjustSize->setEnabled( FALSE ); + actionEditSplitHorizontal->setEnabled( FALSE ); + actionEditSplitVertical->setEnabled( FALSE ); + + enable = FALSE; + TQWidgetList widgets = formWindow()->selectedWidgets(); + if ( selectedWidgets > 1 ) { + int unlaidout = 0; + int laidout = 0; + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) + unlaidout++; + else + laidout++; + } + actionEditHLayout->setEnabled( unlaidout > 1 ); + actionEditVLayout->setEnabled( unlaidout > 1 ); + actionEditSplitHorizontal->setEnabled( unlaidout > 1 ); + actionEditSplitVertical->setEnabled( unlaidout > 1 ); + actionEditGridLayout->setEnabled( unlaidout > 1 ); + actionEditBreakLayout->setEnabled( laidout > 0 ); + actionEditAdjustSize->setEnabled( laidout > 0 ); + layoutSelected = unlaidout > 1; + breakLayout = laidout > 0; + } else if ( selectedWidgets == 1 ) { + TQWidget *w = widgets.first(); + bool isContainer = WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) || + w == formWindow()->mainContainer(); + actionEditAdjustSize->setEnabled( !w->parentWidget() || + WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ); + + if ( !isContainer ) { + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) { + actionEditBreakLayout->setEnabled( !isAToolBarChild( TQT_TQOBJECT(w) ) ); + breakLayout = TRUE; + } else { + actionEditBreakLayout->setEnabled( FALSE ); + } + } else { + if ( WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout ) { + if ( !formWindow()->hasInsertedChildren( w ) ) { + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + actionEditBreakLayout->setEnabled( FALSE ); + } else { + actionEditHLayout->setEnabled( TRUE ); + actionEditVLayout->setEnabled( TRUE ); + actionEditGridLayout->setEnabled( TRUE ); + actionEditBreakLayout->setEnabled( FALSE ); + layoutChilds = TRUE; + } + if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) { + actionEditBreakLayout->setEnabled( !isAToolBarChild( TQT_TQOBJECT(w) ) ); + breakLayout = TRUE; + } + } else { + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + actionEditBreakLayout->setEnabled( !isAToolBarChild( TQT_TQOBJECT(w) ) ); + breakLayout = TRUE; + } + } + } else if ( selectedWidgets == 0 ) { + actionEditAdjustSize->setEnabled( TRUE ); + TQWidget *w = formWindow()->mainContainer(); + if ( WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout ) { + if ( !formWindow()->hasInsertedChildren( w ) ) { + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + actionEditBreakLayout->setEnabled( FALSE ); + } else { + actionEditHLayout->setEnabled( TRUE ); + actionEditVLayout->setEnabled( TRUE ); + actionEditGridLayout->setEnabled( TRUE ); + actionEditBreakLayout->setEnabled( FALSE ); + layoutChilds = TRUE; + } + } else { + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + actionEditBreakLayout->setEnabled( TRUE ); + breakLayout = TRUE; + } + } else { + actionEditHLayout->setEnabled( FALSE ); + actionEditVLayout->setEnabled( FALSE ); + actionEditGridLayout->setEnabled( FALSE ); + actionEditBreakLayout->setEnabled( FALSE ); + } +} + +static TQString fixArgs( const TQString &s2 ) +{ + TQString s = s2; + return s.replace( ',', ';' ); +} + +void MainWindow::writeConfig() +{ + TQSettings config; + + // No search path for unix, only needs application name + config.insertSearchPath( TQSettings::Windows, "/Trolltech" ); + + TQString keybase = DesignerApplication::settingsKey(); + + if (savePluginPaths) { + TQStringList pluginPaths = TQApplication::libraryPaths(); + config.writeEntry( keybase + "PluginPaths", pluginPaths ); + } + config.writeEntry( keybase + "RestoreWorkspace", restoreConfig ); + config.writeEntry( keybase + "SplashScreen", splashScreen ); + config.writeEntry( keybase + "ShowStartDialog", shStartDialog ); + config.writeEntry( keybase + "FileFilter", fileFilter ); + config.writeEntry( keybase + "TemplatePath", templPath ); + config.writeEntry( keybase + "RecentlyOpenedFiles", recentlyFiles ); + config.writeEntry( keybase + "RecentlyOpenedProjects", recentlyProjects ); + config.writeEntry( keybase + "DatabaseAutoEdit", databaseAutoEdit ); + + config.writeEntry( keybase + "AutoSave/Enabled", autoSaveEnabled ); + config.writeEntry( keybase + "AutoSave/Interval", autoSaveInterval ); + + config.writeEntry( keybase + "Grid/Snap", snGrid ); + config.writeEntry( keybase + "Grid/Show", sGrid ); + config.writeEntry( keybase + "Grid/x", grid().x() ); + config.writeEntry( keybase + "Grid/y", grid().y() ); + config.writeEntry( keybase + "LastToolPage", + toolBox->itemLabel( toolBox->currentIndex() ) ); + + config.writeEntry( keybase + "Background/UsePixmap", backPix ); + config.writeEntry( keybase + "Background/Color", (int)qworkspace->backgroundColor().rgb() ); + if ( qworkspace->backgroundPixmap() ) + qworkspace->backgroundPixmap()->save( TQDir::home().absPath() + "/.designer/" + "background.xpm", "PNG" ); + + config.writeEntry( keybase + "Geometries/MainwindowX", x() ); + config.writeEntry( keybase + "Geometries/MainwindowY", y() ); + config.writeEntry( keybase + "Geometries/MainwindowWidth", width() ); + config.writeEntry( keybase + "Geometries/MainwindowHeight", height() ); + config.writeEntry( keybase + "Geometries/MainwindowMaximized", isMaximized() ); + config.writeEntry( keybase + "Geometries/PropertyEditorX", propertyEditor->parentWidget()->x() ); + config.writeEntry( keybase + "Geometries/PropertyEditorY", propertyEditor->parentWidget()->y() ); + config.writeEntry( keybase + "Geometries/PropertyEditorWidth", propertyEditor->parentWidget()->width() ); + config.writeEntry( keybase + "Geometries/PropertyEditorHeight", propertyEditor->parentWidget()->height() ); + config.writeEntry( keybase + "Geometries/HierarchyViewX", hierarchyView->parentWidget()->x() ); + config.writeEntry( keybase + "Geometries/HierarchyViewY", hierarchyView->parentWidget()->y() ); + config.writeEntry( keybase + "Geometries/HierarchyViewWidth", hierarchyView->parentWidget()->width() ); + config.writeEntry( keybase + "Geometries/HierarchyViewHeight", hierarchyView->parentWidget()->height() ); + config.writeEntry( keybase + "Geometries/WorkspaceX", wspace->parentWidget()->x() ); + config.writeEntry( keybase + "Geometries/WorkspaceY", wspace->parentWidget()->y() ); + config.writeEntry( keybase + "Geometries/WorkspaceWidth", wspace->parentWidget()->width() ); + config.writeEntry( keybase + "Geometries/WorkspaceHeight", wspace->parentWidget()->height() ); + + config.writeEntry( keybase + "View/TextLabels", usesTextLabel() ); + config.writeEntry( keybase + "View/BigIcons", usesBigPixmaps() ); + + TQString mwlKey = "MainwindowLayout"; + if ( singleProjectMode() ) + mwlKey += "S"; + TQString mainWindowLayout; + TQTextStream ts( &mainWindowLayout, IO_WriteOnly ); + ts << *this; + config.writeEntry( keybase + mwlKey, mainWindowLayout ); + + + TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); + config.writeEntry( keybase + "CustomWidgets/num", (int)lst->count() ); + int j = 0; + TQDir::home().mkdir( ".designer" ); + for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { + TQStringList l; + l << w->className; + l << w->includeFile; + l << TQString::number( (int)w->includePolicy ); + l << TQString::number( w->sizeHint.width() ); + l << TQString::number( w->sizeHint.height() ); + l << TQString::number( w->lstSignals.count() ); + for ( TQValueList<TQCString>::ConstIterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) + l << TQString( fixArgs( *it ) ); + l << TQString::number( w->lstSlots.count() ); + for ( TQValueList<MetaDataBase::Function>::ConstIterator it2 = w->lstSlots.begin(); it2 != w->lstSlots.end(); ++it2 ) { + l << fixArgs( (*it2).function ); + l << (*it2).access; + } + l << TQString::number( w->lstProperties.count() ); + for ( TQValueList<MetaDataBase::Property>::ConstIterator it3 = w->lstProperties.begin(); it3 != w->lstProperties.end(); ++it3 ) { + l << (*it3).property; + l << (*it3).type; + } + l << TQString::number( size_type_to_int( w->sizePolicy.horData() ) ); + l << TQString::number( size_type_to_int( w->sizePolicy.verData() ) ); + l << TQString::number( (int)w->isContainer ); + config.writeEntry( keybase + "CustomWidgets/Widget" + TQString::number( j++ ), l, ',' ); + w->pixmap->save( TQDir::home().absPath() + "/.designer/" + w->className, "XPM" ); + } + + TQStringList l; + for ( TQAction *a = commonWidgetsPage.first(); a; a = commonWidgetsPage.next() ) + l << a->text(); + config.writeEntry( keybase + "ToolBox/CommonWidgets", l ); +} + +static TQString fixArgs2( const TQString &s2 ) +{ + TQString s = s2; + return s.replace( ';', ',' ); +} + +void MainWindow::readConfig() +{ + TQString keybase = DesignerApplication::settingsKey(); + TQSettings config; + config.insertSearchPath( TQSettings::Windows, "/Trolltech" ); + + bool ok; + bool readPreviousConfig = FALSE; + TQString backPixName( TQDir::home().absPath() + "/.designer/" + "background.xpm" ); + restoreConfig = config.readBoolEntry( keybase + "RestoreWorkspace", TRUE, &ok ); + if ( !ok ) { + keybase = DesignerApplication::oldSettingsKey(); + restoreConfig = config.readBoolEntry( keybase + "RestoreWorkspace", TRUE, &ok ); + if ( !ok ) { + if ( oWindow ) { + oWindow->shuttingDown(); + ( (TQDockWindow*)oWindow->parent() )->hide(); + } + TQPixmap pix; + pix.load( backPixName ); + if ( !pix.isNull() ) + qworkspace->setBackgroundPixmap( pix ); + return; + } + readPreviousConfig = TRUE; + } + if ( !readPreviousConfig ) { + fileFilter = config.readEntry( keybase + "FileFilter", fileFilter ); + templPath = config.readEntry( keybase + "TemplatePath", TQString() ); + databaseAutoEdit = config.readBoolEntry( keybase + "DatabaseAutoEdit", databaseAutoEdit ); + shStartDialog = config.readBoolEntry( keybase + "ShowStartDialog", shStartDialog ); + autoSaveEnabled = config.readBoolEntry( keybase + "AutoSave/Enabled", autoSaveEnabled ); + autoSaveInterval = config.readNumEntry( keybase + "AutoSave/Interval", autoSaveInterval ); + } + + if ( restoreConfig || readPreviousConfig ) { + TQString s = config.readEntry( keybase + "LastToolPage" ); + for ( int i = 0; i < toolBox->count(); ++i ) { + if ( toolBox->itemLabel(i) == s ) { + toolBox->setCurrentIndex( i ); + break; + } + } + // We know that the oldSettingsKey() will return 3.1 + if ( keybase == DesignerApplication::oldSettingsKey() ) { + if (keybase.contains("3.1")) + recentlyFiles = config.readListEntry( keybase + "RecentlyOpenedFiles", ',' ); + else + recentlyFiles = config.readListEntry(keybase + "RecentlyOpenedFiles"); + + if ( recentlyFiles.count() == 1 && recentlyFiles[0].isNull() ) + recentlyFiles.clear(); + if (keybase.contains("3.1")) + recentlyProjects = config.readListEntry( keybase + "RecentlyOpenedProjects", ',' ); + else + recentlyProjects = config.readListEntry( keybase + "RecentlyOpenedProjects"); + if ( recentlyProjects.count() == 1 && recentlyProjects[0].isNull() ) + recentlyProjects.clear(); + } else { + recentlyFiles = config.readListEntry( keybase + "RecentlyOpenedFiles" ); + recentlyProjects = config.readListEntry( keybase + "RecentlyOpenedProjects" ); + } + + backPix = config.readBoolEntry( keybase + "Background/UsePixmap", TRUE ) | readPreviousConfig; + if ( backPix ) { + TQPixmap pix; + pix.load( backPixName ); + if ( !pix.isNull() ) + qworkspace->setBackgroundPixmap( pix ); + } else { + qworkspace->setBackgroundColor( TQColor( (TQRgb)config.readNumEntry( keybase + "Background/Color" ) ) ); + } + + if ( !readPreviousConfig ) { + splashScreen = config.readBoolEntry( keybase + "SplashScreen", TRUE ); + + sGrid = config.readBoolEntry( keybase + "Grid/Show", TRUE ); + snGrid = config.readBoolEntry( keybase + "Grid/Snap", TRUE ); + grd.setX( config.readNumEntry( keybase + "Grid/x", 10 ) ); + grd.setY( config.readNumEntry( keybase + "Grid/y", 10 ) ); + + if ( !config.readBoolEntry( DesignerApplication::settingsKey() + "Geometries/MainwindowMaximized", FALSE ) ) { + TQRect r( pos(), size() ); + r.setX( config.readNumEntry( keybase + "Geometries/MainwindowX", r.x() ) ); + r.setY( config.readNumEntry( keybase + "Geometries/MainwindowY", r.y() ) ); + r.setWidth( config.readNumEntry( keybase + "Geometries/MainwindowWidth", r.width() ) ); + r.setHeight( config.readNumEntry( keybase + "Geometries/MainwindowHeight", r.height() ) ); + + TQRect desk = TQApplication::desktop()->geometry(); + TQRect inter = desk.intersect( r ); + resize( r.size() ); + if ( inter.width() * inter.height() > ( r.width() * r.height() / 20 ) ) { + move( r.topLeft() ); + } + } + setUsesTextLabel( config.readBoolEntry( keybase + "View/TextLabels", FALSE ) ); + setUsesBigPixmaps( FALSE /*config.readBoolEntry( "BigIcons", FALSE )*/ ); // ### disabled for now + } + } + int num = config.readNumEntry( keybase + "CustomWidgets/num" ); + for ( int j = 0; j < num; ++j ) { + MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget; + TQStringList l = config.readListEntry( keybase + "CustomWidgets/Widget" + TQString::number( j ), ',' ); + w->className = l[ 0 ]; + w->includeFile = l[ 1 ]; + w->includePolicy = (MetaDataBase::CustomWidget::IncludePolicy)l[ 2 ].toInt(); + w->sizeHint.setWidth( l[ 3 ].toInt() ); + w->sizeHint.setHeight( l[ 4 ].toInt() ); + uint c = 5; + if ( l.count() > c ) { + int numSignals = l[ c ].toInt(); + c++; + for ( int i = 0; i < numSignals; ++i, c++ ) + w->lstSignals.append( fixArgs2( l[ c ] ).latin1() ); + } + if ( l.count() > c ) { + int numSlots = l[ c ].toInt(); + c++; + for ( int i = 0; i < numSlots; ++i ) { + MetaDataBase::Function slot; + slot.function = fixArgs2( l[ c ] ); + c++; + slot.access = l[ c ]; + c++; + w->lstSlots.append( slot ); + } + } + if ( l.count() > c ) { + int numProperties = l[ c ].toInt(); + c++; + for ( int i = 0; i < numProperties; ++i ) { + MetaDataBase::Property prop; + prop.property = l[ c ]; + c++; + prop.type = l[ c ]; + c++; + w->lstProperties.append( prop ); + } + } if ( l.count() > c ) { + TQSizePolicy::SizeType h, v; + h = int_to_size_type( l[ c++ ].toInt() ); + v = int_to_size_type( l[ c++ ].toInt() ); + w->sizePolicy = TQSizePolicy( h, v ); + } + if ( l.count() > c ) { + w->isContainer = (bool)l[ c++ ].toInt(); + } + w->pixmap = new TQPixmap( BarIcon( TQDir::home().absPath() + "/.designer/" + w->className , KDevDesignerPartFactory::instance()) ); + MetaDataBase::addCustomWidget( w ); + } + if ( num > 0 ) + rebuildCustomWidgetGUI(); + + if ( !restoreConfig ) + return; + +#ifndef TQ_WS_MAC + /* I'm sorry to make this not happen on the Mac, but it seems to hang somewhere deep + in TQLayout, it gets into a very large loop - and seems it has to do with clever + things the designer does ###Sam */ + TQApplication::sendPostedEvents(); +#endif + + if ( !readPreviousConfig ) { + TQString mwlKey = "MainwindowLayout"; + if ( singleProjectMode() ) + mwlKey += "S"; + TQString mainWindowLayout = config.readEntry( keybase + mwlKey ); + TQTextStream ts( &mainWindowLayout, IO_ReadOnly ); + ts >> *this; + } + if ( readPreviousConfig && oWindow ) { + oWindow->shuttingDown(); + ( (TQDockWindow*)oWindow->parent() )->hide(); + } + + rebuildCustomWidgetGUI(); + + TQStringList l = config.readListEntry( keybase + "ToolBox/CommonWidgets" ); + if ( !l.isEmpty() ) { + TQPtrList<TQAction> lst; + commonWidgetsPage.clear(); + for ( TQStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) { + for ( TQAction *a = toolActions.first(); a; a = toolActions.next() ) { + if ( *it == a->text() ) { + lst.append( a ); + break; + } + } + } + if ( lst != commonWidgetsPage ) { + commonWidgetsPage = lst; + rebuildCommonWidgetsToolBoxPage(); + } + } +} + +HierarchyView *MainWindow::objectHierarchy() const +{ + if ( !hierarchyView ) + ( (MainWindow*)this )->setupHierarchyView(); + return hierarchyView; +} + +TQPopupMenu *MainWindow::setupNormalHierarchyMenu( TQWidget *parent ) +{ + TQPopupMenu *menu = new TQPopupMenu( parent ); + + actionEditCut->addTo( menu ); + actionEditCopy->addTo( menu ); + actionEditPaste->addTo( menu ); + actionEditDelete->addTo( menu ); + + return menu; +} + +TQPopupMenu *MainWindow::setupTabWidgetHierarchyMenu( TQWidget *parent, const char *addSlot, const char *removeSlot ) +{ + TQPopupMenu *menu = new TQPopupMenu( parent ); + + menu->insertItem( i18n( "Add Page" ), parent, addSlot ); + menu->insertItem( i18n( "Delete Page" ), parent, removeSlot ); + menu->insertSeparator(); + actionEditCut->addTo( menu ); + actionEditCopy->addTo( menu ); + actionEditPaste->addTo( menu ); + actionEditDelete->addTo( menu ); + + return menu; +} + +void MainWindow::closeEvent( TQCloseEvent *e ) +{ + if ( singleProject ) { + hide(); + e->ignore(); + return; + } + + TQWidgetList windows = qWorkspace()->windowList(); + TQWidgetListIt wit( windows ); + while ( wit.current() ) { + TQWidget *w = wit.current(); + ++wit; + if ( ::tqqt_cast<FormWindow*>(w) ) { + if ( ( (FormWindow*)w )->formFile()->editor() ) + windows.removeRef( ( (FormWindow*)w )->formFile()->editor() ); + if ( ( (FormWindow*)w )->formFile()->formWindow() ) + windows.removeRef( ( (FormWindow*)w )->formFile()->formWindow() ); + if ( !( (FormWindow*)w )->formFile()->close() ) { + e->ignore(); + return; + } + } else if ( ::tqqt_cast<SourceEditor*>(w) ) { + if ( !( (SourceEditor*)w )->close() ) { + e->ignore(); + return; + } + } + w->close(); + } + + TQMapConstIterator<TQAction*, Project*> it = projects.begin(); + while( it != projects.end() ) { + Project *pro = it.data(); + ++it; + if ( pro->isModified() ) { + switch ( TQMessageBox::warning( this, i18n( "Save Project Settings" ), + i18n( "Save changes to '%1'?" ).arg( pro->fileName() ), + i18n( "&Yes" ), i18n( "&No" ), i18n( "&Cancel" ), 0, 2 ) ) { + case 0: // save + pro->save(); + break; + case 1: // don't save + break; + case 2: // cancel + e->ignore(); + return; + default: + break; + } + } + } + + writeConfig(); + hide(); + e->accept(); + + if ( client ) { + TQDir home( TQDir::homeDirPath() ); + home.remove( ".designerpid" ); + } +} + +Workspace *MainWindow::workspace() const +{ + if ( !wspace ) + ( (MainWindow*)this )->setupWorkspace(); + return wspace; +} + +PropertyEditor *MainWindow::propertyeditor() const +{ + if ( !propertyEditor ) + ( (MainWindow*)this )->setupPropertyEditor(); + return propertyEditor; +} + +ActionEditor *MainWindow::actioneditor() const +{ + if ( !actionEditor ) + ( (MainWindow*)this )->setupActionEditor(); + return actionEditor; +} + +bool MainWindow::openEditor( TQWidget *w, FormWindow *f ) +{ + if ( f && !f->project()->isCpp() && !WidgetFactory::isPassiveInteractor( TQT_TQOBJECT(w) ) ) { + TQString defSignal = WidgetFactory::defaultSignal( TQT_TQOBJECT(w) ); + if ( defSignal.isEmpty() ) { + editSource(); + } else { + TQString s = TQString( w->name() ) + "_" + defSignal; + LanguageInterface *iface = MetaDataBase::languageInterface( f->project()->language() ); + if ( iface ) { + TQStrList sigs = iface->signalNames( TQT_TQOBJECT(w) ); + TQString fullSignal; + for ( int i = 0; i < (int)sigs.count(); ++i ) { + TQString sig = sigs.at( i ); + if ( sig.left( sig.find( '(' ) ) == defSignal ) { + fullSignal = sig; + break; + } + } + + if ( !fullSignal.isEmpty() ) { + TQString signl = fullSignal; + fullSignal = fullSignal.mid( fullSignal.find( '(' ) + 1 ); + fullSignal.remove( (int)fullSignal.length() - 1, 1 ); + fullSignal = iface->createArguments( fullSignal.simplifyWhiteSpace() ); + s += "(" + fullSignal + ")"; + if ( !MetaDataBase::hasFunction( TQT_TQOBJECT(f), s.latin1() ) ) + MetaDataBase::addFunction( TQT_TQOBJECT(f), s.latin1(), "", "public", "slot", + f->project()->language(), "void" ); + s = s.left( s.find( '(' ) ).latin1(); + if ( !MetaDataBase::hasConnection( TQT_TQOBJECT(f), TQT_TQOBJECT(w), defSignal.latin1(), TQT_TQOBJECT(f->mainContainer()), s.latin1() ) ) { + MetaDataBase::Connection conn; + conn.sender = TQT_TQOBJECT(w); + conn.receiver = TQT_TQOBJECT(f->mainContainer()); + conn.signal = signl; + conn.slot = s; + AddConnectionCommand *cmd = + new AddConnectionCommand( i18n( "Add Connection" ), f, conn ); + f->commandHistory()->addCommand( cmd ); + cmd->execute(); + f->formFile()->setModified( TRUE ); + } + } + } + editFunction( s, TRUE ); + } + return TRUE; + } + if ( WidgetFactory::hasSpecialEditor( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ), TQT_TQOBJECT(w) ) ) { + statusMessage( i18n( "Edit %1..." ).arg( w->className() ) ); + WidgetFactory::editWidget( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ), + this, w, formWindow() ); + statusBar()->clear(); + return TRUE; + } + + const TQMetaProperty* text = w->metaObject()->property( w->metaObject()->findProperty( "text", TRUE ), TRUE ); + const TQMetaProperty* title = w->metaObject()->property( w->metaObject()->findProperty( "title", TRUE ), TRUE ); + if ( text && text->designable(w) ) { + bool ok = FALSE; + bool oldDoWrap = FALSE; + if ( ::tqqt_cast<TQLabel*>(w) ) { + int align = w->property( "alignment" ).toInt(); + if ( align & WordBreak ) + oldDoWrap = TRUE; + } + bool doWrap = oldDoWrap; + + TQString text; + if ( ::tqqt_cast<TQTextEdit*>(w) || ::tqqt_cast<TQLabel*>(w) || ::tqqt_cast<TQButton*>(w) ) { + text = MultiLineEditor::getText( this, w->property( "text" ).toString(), + !::tqqt_cast<TQButton*>(w), &doWrap ); + ok = !text.isNull(); + } else { + text = TQInputDialog::getText( i18n("Text"), i18n( "New text" ), + TQLineEdit::Normal, w->property("text").toString(), &ok, this ); + } + if ( ok ) { + if ( oldDoWrap != doWrap ) { + TQString pn( i18n( "Set 'wordwrap' of '%1'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "wordwrap", TQVariant( oldDoWrap, 0 ), + TQVariant( doWrap, 0 ), TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "wordwrap", TRUE ); + } + + TQString pn( i18n( "Set the 'text' of '%1'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "text", w->property( "text" ), + text, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "text", TRUE ); + } + return TRUE; + } + if ( title && title->designable(w) ) { + bool ok = FALSE; + TQString text; + text = TQInputDialog::getText( i18n("Title"), i18n( "New title" ), TQLineEdit::Normal, w->property("title").toString(), &ok, this ); + if ( ok ) { + TQString pn( i18n( "Set the 'title' of '%2'" ).arg( w->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), TQT_TQOBJECT(w), propertyEditor, + "title", w->property( "title" ), + text, TQString(), TQString() ); + cmd->execute(); + formWindow()->commandHistory()->addCommand( cmd ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(w), "title", TRUE ); + } + return TRUE; + } + + if ( !WidgetFactory::isPassiveInteractor( TQT_TQOBJECT(w) ) ) + editSource(); + + return TRUE; +} + +void MainWindow::rebuildCustomWidgetGUI() +{ + customWidgetToolBar->clear(); + customWidgetMenu->clear(); + customWidgetToolBar2->clear(); + int count = 0; + + TQPtrListIterator<TQAction> it( toolActions ); + TQAction *action; + while ( ( action = it.current() ) ) { + ++it; + if ( ( (WidgetAction*)action )->group() == "Custom Widgets" ) + delete action; + } + + TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); + + actionToolsCustomWidget->addTo( customWidgetMenu ); + customWidgetMenu->insertSeparator(); + + for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { + WidgetAction* a = new WidgetAction( "Custom Widgets", actionGroupTools, TQString::number( w->id ).latin1() ); + a->setToggleAction( TRUE ); + a->setText( w->className ); + a->setIconSet( *w->pixmap ); + a->setStatusTip( i18n( "Insert a %1 (custom widget)" ).arg( w->className ) ); + a->setWhatsThis( i18n("<b>%1 (custom widget)</b>" + "<p>Click <b>Edit Custom Widgets...</b> in the <b>Tools|Custom</b> menu to " + "add and change custom widgets. You can add properties as well as " + "signals and slots to integrate them into TQt Designer, " + "and provide a pixmap which will be used to represent the widget on the form.</p>").arg( w->className ) ); + + a->addTo( customWidgetToolBar ); + a->addTo( customWidgetToolBar2 ); + a->addTo( customWidgetMenu ); + count++; + } + TQWidget *wid; + customWidgetToolBar2->setStretchableWidget( ( wid = new TQWidget( customWidgetToolBar2 ) ) ); + wid->setBackgroundMode( customWidgetToolBar2->backgroundMode() ); + + if ( count == 0 ) + customWidgetToolBar->hide(); + else if ( customWidgetToolBar->isVisible() ) + customWidgetToolBar->show(); +} + +void MainWindow::rebuildCommonWidgetsToolBoxPage() +{ + toolBox->setUpdatesEnabled( FALSE ); + commonWidgetsToolBar->setUpdatesEnabled( FALSE ); + commonWidgetsToolBar->clear(); + for ( TQAction *a = commonWidgetsPage.first(); a; a = commonWidgetsPage.next() ) + a->addTo( commonWidgetsToolBar ); + TQWidget *w; + commonWidgetsToolBar->setStretchableWidget( ( w = new TQWidget( commonWidgetsToolBar ) ) ); + w->setBackgroundMode( commonWidgetsToolBar->backgroundMode() ); + toolBox->setUpdatesEnabled( TRUE ); + commonWidgetsToolBar->setUpdatesEnabled( TRUE ); +} + +bool MainWindow::isCustomWidgetUsed( MetaDataBase::CustomWidget *wid ) +{ + TQWidgetList windows = qWorkspace()->windowList(); + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + if ( ::tqqt_cast<FormWindow*>(w) ) { + if ( ( (FormWindow*)w )->isCustomWidgetUsed( wid ) ) + return TRUE; + } + } + return FALSE; +} + +void MainWindow::setGrid( const TQPoint &p ) +{ + if ( p == grd ) + return; + grd = p; + TQWidgetList windows = qWorkspace()->windowList(); + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + if ( !::tqqt_cast<FormWindow*>(w) ) + continue; + ( (FormWindow*)w )->mainContainer()->update(); + } +} + +void MainWindow::setShowGrid( bool b ) +{ + if ( b == sGrid ) + return; + sGrid = b; + TQWidgetList windows = qWorkspace()->windowList(); + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + if ( !::tqqt_cast<FormWindow*>(w) ) + continue; + ( (FormWindow*)w )->mainContainer()->update(); + } +} + +void MainWindow::setSnapGrid( bool b ) +{ + if ( b == snGrid ) + return; + snGrid = b; +} + +TQString MainWindow::documentationPath() const +{ + return TQString( tqInstallPathDocs() ) + "/html/"; +} + +void MainWindow::windowsMenuActivated( int id ) +{ + TQWidget* w = qworkspace->windowList().at( id ); + if ( w ) + w->setFocus(); +} + +void MainWindow::projectSelected( TQAction *a ) +{ + a->setOn( TRUE ); + if ( currentProject ) + currentProject->setActive( FALSE ); + Project *p = *projects.find( a ); + p->setActive( TRUE ); + if ( currentProject == p ) + return; + currentProject = p; + if ( wspace ) + wspace->setCurrentProject( currentProject ); +} + +void MainWindow::openProject( const TQString &fn ) +{ + for ( TQMap<TQAction*, Project*>::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { + if ( (*it)->fileName() == fn ) { + projectSelected( it.key() ); + return; + } + } + TQApplication::setOverrideCursor( waitCursor ); + Project *pro = new Project( fn, "", projectSettingsPluginManager ); + pro->setModified( FALSE ); + TQAction *a = new TQAction( pro->projectName(), pro->projectName(), 0, actionGroupProjects, 0, TRUE ); + projects.insert( a, pro ); + projectSelected( a ); + TQApplication::restoreOverrideCursor(); +} + +void MainWindow::checkTempFiles() +{ + TQString s = TQDir::homeDirPath() + "/.designer"; + TQString baseName = s+ "/saved-form-"; + if ( !TQFile::exists( baseName + "1.ui" ) ) + return; + DesignerApplication::closeSplash(); + TQDir d( s ); + d.setNameFilter( "*.ui" ); + TQStringList lst = d.entryList(); + TQApplication::restoreOverrideCursor(); + bool load = TQMessageBox::information( this, i18n( "Restoring Last Session" ), + i18n( "TQt Designer found some temporary saved files, which were\n" + "written when TQt Designer crashed last time. Do you want to\n" + "load these files?" ), i18n( "&Yes" ), i18n( "&No" ) ) == 0; + TQApplication::setOverrideCursor( waitCursor ); + for ( TQStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it ) { + if ( load ) + openFormWindow( s + "/" + *it, FALSE ); + d.remove( *it ); + } +} + +void MainWindow::showDialogHelp() +{ + TQWidget *w = (TQWidget*)sender(); + w = w->topLevelWidget(); + + TQString link = documentationPath() + "/designer-manual-13.html#"; + + if ( ::tqqt_cast<NewFormBase*>(w) || ::tqqt_cast<StartDialogBase*>(w) ) // own doc for startdialog? + link += "dialog-file-new"; + else if ( ::tqqt_cast<CreateTemplate*>(w) ) + link += "dialog-file-create-template"; + else if ( ::tqqt_cast<EditFunctionsBase*>(w) ) + link += "dialog-edit-functions"; +// else if ( ::tqqt_cast<ConnectionViewerBase*>(w) ) + else if ( w->inherits("ConnectionViewerBase") ) + link += "dialog-view-connections"; + else if ( ::tqqt_cast<FormSettingsBase*>(w) ) + link += "dialog-edit-form-settings"; + else if ( ::tqqt_cast<Preferences*>(w) ) + link += "dialog-edit-preferences"; + else if ( ::tqqt_cast<PixmapCollectionEditor*>(w) ) + link += "dialog-image-collection"; +// else if ( ::tqqt_cast<DatabaseConnectionBase*>(w) ) + else if ( w->inherits( "DatabaseConnectionBase" ) ) + link += "dialog-edit-database-connections"; + else if ( ::tqqt_cast<ProjectSettingsBase*>(w) ) + link += "dialog-project-settings"; + else if ( ::tqqt_cast<FindDialog*>(w) ) + link += "dialog-find-text"; + else if ( ::tqqt_cast<ReplaceDialog*>(w) ) + link += "dialog-replace-text"; + else if ( ::tqqt_cast<GotoLineDialog*>(w) ) + link += "dialog-go-to-line"; +// else if ( ::tqqt_cast<ConnectionEditorBase*>(w) ) + else if ( w->inherits("ConnectionEditorBase") ) + link += "dialog-edit-connections"; + else if ( ::tqqt_cast<CustomWidgetEditorBase*>(w) ) + link += "dialog-edit-custom-widgets"; + else if ( ::tqqt_cast<PaletteEditorBase*>(w) ) + link += "dialog-edit-palette"; + else if ( ::tqqt_cast<ListBoxEditorBase*>(w) ) + link += "dialog-edit-listbox"; + else if ( ::tqqt_cast<ListViewEditorBase*>(w) ) + link += "dialog-edit-listview"; + else if ( ::tqqt_cast<IconViewEditorBase*>(w) ) + link += "dialog-edit-iconview"; + else if ( ::tqqt_cast<TableEditorBase*>(w) ) + link += "dialog-edit-table"; + else if ( ::tqqt_cast<MultiLineEditor*>(w) ) + link += "dialog-text"; + + else { + TQMessageBox::information( this, i18n( "Help" ), + i18n( "There is no help available for this dialog at the moment." ) ); + return; + } + + assistant->showPage( link ); +} + +void MainWindow::setupActionManager() +{ + actionPluginManager = new TQPluginManager<ActionInterface>( IID_Action, TQApplication::libraryPaths(), pluginDirectory() ); + + TQStringList lst = actionPluginManager->featureList(); + for ( TQStringList::ConstIterator ait = lst.begin(); ait != lst.end(); ++ait ) { + ActionInterface *iface = 0; + actionPluginManager->queryInterface( *ait, &iface ); + if ( !iface ) + continue; + + iface->connectTo( desInterface ); + TQAction *a = iface->create( *ait, TQT_TQOBJECT(this) ); + if ( !a ) + continue; + + TQString grp = iface->group( *ait ); + if ( grp.isEmpty() ) + grp = "3rd party actions"; + TQPopupMenu *menu = 0; + TQToolBar *tb = 0; + + if ( !( menu = (TQPopupMenu*)child( grp.latin1(), TQPOPUPMENU_OBJECT_NAME_STRING ) ) ) { + menu = new TQPopupMenu( this, grp.latin1() ); + menuBar()->insertItem( i18n( grp ), menu ); + } + if ( !( tb = (TQToolBar*)child( grp.latin1(), TQTOOLBAR_OBJECT_NAME_STRING ) ) ) { + tb = new TQToolBar( this, grp.latin1() ); + tb->setCloseMode( TQDockWindow::Undocked ); + addToolBar( tb, grp ); + } + + if ( iface->location( *ait, ActionInterface::Menu ) ) + a->addTo( menu ); + if ( iface->location( *ait, ActionInterface::Toolbar ) ) + a->addTo( tb ); + + iface->release(); + } +} + +void MainWindow::editFunction( const TQString &func, bool rereadSource ) +{ + if ( !formWindow() ) + return; + + if ( formWindow()->formFile()->codeFileState() != FormFile::Ok ) + if ( !formWindow()->formFile()->setupUihFile(FALSE) ) + return; + + TQString lang = currentProject->language(); + if ( !MetaDataBase::hasEditor( lang ) ) { + TQMessageBox::information( this, i18n( "Edit Source" ), + i18n( "There is no plugin for editing %1 code installed.\n" + "Note: Plugins are not available in static TQt configurations." ).arg( lang ) ); + return; + } + + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( e->language() == lang && e->formWindow() == formWindow() ) { + e->show(); + e->setFunction( func ); + return; + } + } + + createSourceEditor( TQT_TQOBJECT(formWindow()), formWindow()->project(), lang, func, rereadSource ); +} + +void MainWindow::setupRecentlyFilesMenu() +{ + recentlyFilesMenu->clear(); + int id = 0; + for ( TQStringList::ConstIterator it = recentlyFiles.begin(); it != recentlyFiles.end(); ++it ) { + recentlyFilesMenu->insertItem( *it, id ); + id++; + } +} + +void MainWindow::setupRecentlyProjectsMenu() +{ + recentlyProjectsMenu->clear(); + int id = 0; + for ( TQStringList::ConstIterator it = recentlyProjects.begin(); it != recentlyProjects.end(); ++it ) { + recentlyProjectsMenu->insertItem( *it, id ); + id++; + } +} + +TQPtrList<DesignerProject> MainWindow::projectList() const +{ + TQPtrList<DesignerProject> list; + TQMapConstIterator<TQAction*, Project*> it = projects.begin(); + + while( it != projects.end() ) { + Project *p = it.data(); + ++it; + list.append( p->iFace() ); + } + + return list; +} + +TQStringList MainWindow::projectNames() const +{ + TQStringList res; + for ( TQMap<TQAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) + res << (*it)->projectName(); + return res; +} + +TQStringList MainWindow::projectFileNames() const +{ + TQStringList res; + for ( TQMap<TQAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) + res << (*it)->makeRelative( (*it)->fileName() ); + return res; +} + +Project *MainWindow::findProject( const TQString &projectName ) const +{ + for ( TQMap<TQAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { + if ( (*it)->projectName() == projectName ) + return *it; + } + return 0; +} + +void MainWindow::setCurrentProject( Project *pro ) +{ + for ( TQMap<TQAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { + if ( *it == pro ) { + projectSelected( it.key() ); + return; + } + } +} + +void MainWindow::setCurrentProjectByFilename( const TQString& proFilename ) +{ + for ( TQMap<TQAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { + if ( (*it)->makeRelative( (*it)->fileName() ) == proFilename ) { + projectSelected( it.key() ); + return; + } + } +} + + +void MainWindow::recentlyFilesMenuActivated( int id ) +{ + if ( id != -1 ) { + if ( !TQFile::exists( *recentlyFiles.at( id ) ) ) { + TQMessageBox::warning( this, i18n( "Open File" ), + i18n( "Could not open '%1'. File does not exist." ). + arg( *recentlyFiles.at( id ) ) ); + recentlyFiles.remove( recentlyFiles.at( id ) ); + return; + } + fileOpen( "", "", *recentlyFiles.at( id ) ); + TQString fn( *recentlyFiles.at( id ) ); + addRecentlyOpened( fn, recentlyFiles ); + } +} + +void MainWindow::recentlyProjectsMenuActivated( int id ) +{ + if ( id != -1 ) { + if ( !TQFile::exists( *recentlyProjects.at( id ) ) ) { + TQMessageBox::warning( this, i18n( "Open Project" ), + i18n( "Could not open '%1'. File does not exist." ). + arg( *recentlyProjects.at( id ) ) ); + recentlyProjects.remove( recentlyProjects.at( id ) ); + return; + } + openProject( *recentlyProjects.at( id ) ); + TQString fn( *recentlyProjects.at( id ) ); + addRecentlyOpened( fn, recentlyProjects ); + } +} + +void MainWindow::addRecentlyOpened( const TQString &fn, TQStringList &lst ) +{ + TQFileInfo fi( fn ); + fi.convertToAbs(); + TQString f = fi.filePath(); + if ( lst.find( f ) != lst.end() ) + lst.remove( f ); + if ( lst.count() >= 10 ) + lst.pop_back(); + lst.prepend( f ); +} + +TemplateWizardInterface * MainWindow::templateWizardInterface( const TQString& className ) +{ + TemplateWizardInterface* iface = 0; + templateWizardPluginManager->queryInterface( className, & iface ); + return iface; +} + +void MainWindow::setupPluginManagers() +{ + editorPluginManager = new TQPluginManager<EditorInterface>( IID_Editor, TQApplication::libraryPaths(), "/kdevdesigner" ); + MetaDataBase::setEditor( editorPluginManager->featureList() ); + + templateWizardPluginManager = + new TQPluginManager<TemplateWizardInterface>( IID_TemplateWizard, TQApplication::libraryPaths(), pluginDirectory() ); + + MetaDataBase::setupInterfaceManagers( "/designer" ); + preferencePluginManager = + new TQPluginManager<PreferenceInterface>( IID_Preference, TQApplication::libraryPaths(), pluginDirectory() ); + projectSettingsPluginManager = + new TQPluginManager<ProjectSettingsInterface>( IID_ProjectSettings, TQApplication::libraryPaths(), pluginDirectory() ); + sourceTemplatePluginManager = + new TQPluginManager<SourceTemplateInterface>( IID_SourceTemplate, TQApplication::libraryPaths(), pluginDirectory() ); + + if ( preferencePluginManager ) { + TQStringList lst = preferencePluginManager->featureList(); + for ( TQStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it ) { + PreferenceInterface *i = 0; + preferencePluginManager->queryInterface( *it, &i ); + if ( !i ) + continue; + i->connectTo( designerInterface() ); + PreferenceInterface::Preference *pf = i->preference(); + if ( pf ) + addPreferencesTab( pf->tab, pf->title, pf->receiver, pf->init_slot, pf->accept_slot ); + i->deletePreferenceObject( pf ); + + i->release(); + } + } + if ( projectSettingsPluginManager ) { + TQStringList lst = projectSettingsPluginManager->featureList(); + for ( TQStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it ) { + ProjectSettingsInterface *i = 0; + projectSettingsPluginManager->queryInterface( *it, &i ); + if ( !i ) + continue; + i->connectTo( designerInterface() ); + + ProjectSettingsInterface::ProjectSettings *pf = i->projectSetting(); + if ( pf ) + addProjectTab( pf->tab, pf->title, pf->receiver, pf->init_slot, pf->accept_slot ); + i->deleteProjectSettingsObject( pf ); + i->release(); + } + } +} + +void MainWindow::addPreferencesTab( TQWidget *tab, const TQString &title, TQObject *receiver, const char *init_slot, const char *accept_slot ) +{ + Tab t; + t.w = tab; + t.title = title; + t.receiver = receiver; + t.init_slot = init_slot; + t.accept_slot = accept_slot; + preferenceTabs << t; +} + +void MainWindow::addProjectTab( TQWidget *tab, const TQString &title, TQObject *receiver, const char *init_slot, const char *accept_slot ) +{ + Tab t; + t.w = tab; + t.title = title; + t.receiver = receiver; + t.init_slot = init_slot; + t.accept_slot = accept_slot; + projectTabs << t; +} + +void MainWindow::setModified( bool b, TQWidget *window ) +{ + TQWidget *w = window; + while ( w ) { + if ( ::tqqt_cast<FormWindow*>(w) ) { + ( (FormWindow*)w )->modificationChanged( b ); + return; + } else if ( ::tqqt_cast<SourceEditor*>(w) ) { + FormWindow *fw = ( (SourceEditor*)w )->formWindow(); + if ( fw && !fw->isFake() ) { + //fw->commandHistory()->setModified( b ); + //fw->modificationChanged( b ); + fw->formFile()->setModified( b, FormFile::WFormCode ); + wspace->update( fw->formFile() ); + } else { + wspace->update(); + } + return; + } + w = w->parentWidget( TRUE ); + } +} + +void MainWindow::editorClosed( SourceEditor *e ) +{ + sourceEditors.take( sourceEditors.findRef( e ) ); +} + +void MainWindow::functionsChanged() +{ + updateFunctionsTimer->start( 0, TRUE ); +} + +void MainWindow::doFunctionsChanged() +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) + e->refresh( FALSE ); + hierarchyView->formDefinitionView()->refresh(); +} + +void MainWindow::updateFunctionList() +{ + if ( !qWorkspace()->activeWindow() || !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + SourceEditor *se = (SourceEditor*)qWorkspace()->activeWindow(); + se->save(); + hierarchyView->formDefinitionView()->refresh(); + if ( !currentProject->isCpp() && se->formWindow() ) { + LanguageInterface *iface = MetaDataBase::languageInterface( currentProject->language() ); + if ( !iface ) + return; + TQValueList<LanguageInterface::Connection> conns; + iface->connections( se->text(), &conns ); + MetaDataBase::setupConnections( TQT_TQOBJECT(se->formWindow()), conns ); + propertyEditor->eventList()->setup(); + } +} + +void MainWindow::updateWorkspace() +{ + wspace->setCurrentProject( currentProject ); +} + +void MainWindow::showDebugStep( TQObject *o, int line ) +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) + e->clearStep(); + if ( !o || line == -1 ) + return; + showSourceLine( o, line, Step ); +} + +void MainWindow::showStackFrame( TQObject *o, int line ) +{ + if ( !o || line == -1 ) + return; + showSourceLine( o, line, StackFrame ); +} + +void MainWindow::showErrorMessage( TQObject *o, int errorLine, const TQString &errorMessage ) +{ + if ( o ) { + errorLine--; // ###### + TQValueList<uint> l; + l << ( errorLine + 1 ); + TQStringList l2; + l2 << errorMessage; + TQObjectList ol; + ol.append( o ); + TQStringList ll; + ll << currentProject->locationOfObject( o ); + oWindow->setErrorMessages( l2, l, TRUE, ll, ol ); + showSourceLine( o, errorLine, Error ); + } +} + +void MainWindow::finishedRun() +{ + inDebugMode = FALSE; + previewing = FALSE; + debuggingForms.clear(); + enableAll( TRUE ); + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( e->project() == currentProject ) + e->editorInterface()->setMode( EditorInterface::Editing ); + e->clearStackFrame(); + } + outputWindow()->clearErrorMessages(); +} + +void MainWindow::enableAll( bool enable ) +{ + menuBar()->setEnabled( enable ); + TQObjectList *l = queryList( TQDOCKWINDOW_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) { + if ( TQT_BASE_OBJECT(o) == wspace->parentWidget() || + TQT_BASE_OBJECT(o) == oWindow->parentWidget() || + TQT_BASE_OBJECT(o) == hierarchyView->parentWidget() ) + continue; + ( (TQWidget*)o )->setEnabled( enable ); + } + delete l; +} + +void MainWindow::showSourceLine( TQObject *o, int line, LineMode lm ) +{ + TQWidgetList windows = qworkspace->windowList(); + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + FormWindow *fw = 0; + SourceEditor *se = 0; + SourceFile *sf = 0; + if ( ::tqqt_cast<FormWindow*>(w) ) { + fw = (FormWindow*)w; + } else if ( ::tqqt_cast<SourceEditor*>(w) ) { + se = (SourceEditor*)w; + if ( !se->object() ) + continue; + if ( se->formWindow() ) + fw = se->formWindow(); + else + sf = se->sourceFile(); + } + + if ( fw ) { + if ( fw->project() != currentProject ) + continue; + if ( qstrcmp( fw->name(), o->name() ) == 0 || + fw->isFake() && currentProject->objectForFakeForm( fw ) == o ) { + if ( se ) { + switch ( lm ) { + case Error: + se->editorInterface()->setError( line ); + break; + case Step: + se->editorInterface()->setStep( line ); + break; + case StackFrame: + se->editorInterface()->setStackFrame( line ); + break; + } + return; + } else { + fw->showNormal(); + fw->setFocus(); + lastActiveFormWindow = fw; + tqApp->processEvents(); + se = editSource(); + if ( se ) { + switch ( lm ) { + case Error: + se->editorInterface()->setError( line ); + break; + case Step: + se->editorInterface()->setStep( line ); + break; + case StackFrame: + se->editorInterface()->setStackFrame( line ); + break; + } + return; + } + } + } + } else if ( se ) { + if ( o != sf ) + continue; + switch ( lm ) { + case Error: + se->editorInterface()->setError( line ); + break; + case Step: + se->editorInterface()->setStep( line ); + break; + case StackFrame: + se->editorInterface()->setStackFrame( line ); + break; + } + return; + } + } + + if ( ::tqqt_cast<SourceFile*>(o) ) { + for ( TQPtrListIterator<SourceFile> sources = currentProject->sourceFiles(); + sources.current(); ++sources ) { + SourceFile* f = sources.current(); + if ( f == o ) { + SourceEditor *se = editSource( f ); + if ( se ) { + switch ( lm ) { + case Error: + se->editorInterface()->setError( line ); + break; + case Step: + se->editorInterface()->setStep( line ); + break; + case StackFrame: + se->editorInterface()->setStackFrame( line ); + break; + } + } + return; + } + } + } + + FormFile *ff = currentProject->fakeFormFileFor( o ); + FormWindow *fw = 0; + if ( ff ) + fw = ff->formWindow(); + + if ( !fw && !qwf_forms ) { + tqWarning( "MainWindow::showSourceLine: qwf_forms is NULL!" ); + return; + } + + mblockNewForms = TRUE; + if ( !fw ) + openFormWindow( currentProject->makeAbsolute( *qwf_forms->find( (TQWidget*)o ) ) ); + else + fw->formFile()->showEditor( FALSE ); + tqApp->processEvents(); // give all views the chance to get the formwindow + SourceEditor *se = editSource(); + if ( se ) { + switch ( lm ) { + case Error: + se->editorInterface()->setError( line ); + break; + case Step: + se->editorInterface()->setStep( line ); + break; + case StackFrame: + se->editorInterface()->setStackFrame( line ); + break; + } + } + mblockNewForms = FALSE; +} + + +TQObject *MainWindow::findRealObject( TQObject *o ) +{ + TQWidgetList windows = qWorkspace()->windowList(); + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + if ( ::tqqt_cast<FormWindow*>(w) && TQString( w->name() ) == TQString( o->name() ) ) + return TQT_TQOBJECT(w); + else if ( ::tqqt_cast<SourceEditor*>(w) && ( (SourceEditor*)w )->formWindow() && + TQString( ( (SourceEditor*)w )->formWindow()->name() ) == TQString( o->name() ) ) + return TQT_TQOBJECT(w); + else if ( ::tqqt_cast<SourceFile*>(w) && ( (SourceEditor*)w )->sourceFile() && + ( (SourceEditor*)w )->sourceFile() == o ) + return o; + } + return 0; +} + +void MainWindow::formNameChanged( FormWindow *fw ) +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( TQT_BASE_OBJECT(e->object()) == TQT_BASE_OBJECT(fw) ) + e->refresh( TRUE ); + if ( e->project() == fw->project() ) + e->resetContext(); + } +} + +void MainWindow::breakPointsChanged() +{ + if ( !inDebugMode ) + return; + if ( !qWorkspace()->activeWindow() || !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + SourceEditor *e = (SourceEditor*)qWorkspace()->activeWindow(); + if ( !e->object() || !e->project() ) + return; + if ( e->project() != currentProject ) + return; + + if ( !interpreterPluginManager ) { + interpreterPluginManager = + new TQPluginManager<InterpreterInterface>( IID_Interpreter, + TQApplication::libraryPaths(), + "/qsa" ); + } + + InterpreterInterface *iiface = 0; + if ( interpreterPluginManager ) { + TQString lang = currentProject->language(); + iiface = 0; + interpreterPluginManager->queryInterface( lang, &iiface ); + if ( !iiface ) + return; + } + + e->saveBreakPoints(); + + for ( TQObject *o = debuggingForms.first(); o; o = debuggingForms.next() ) { + if ( qstrcmp( o->name(), e->object()->name() ) == 0 ) { + iiface->setBreakPoints( o, MetaDataBase::breakPoints( e->object() ) ); + break; + } + } + + for ( e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( e->project() == currentProject && e->sourceFile() ) { + TQValueList<uint> bps = MetaDataBase::breakPoints( e->sourceFile() ); + iiface->setBreakPoints( e->object(), bps ); + } + } + + iiface->release(); +} + +int MainWindow::currentLayoutDefaultSpacing() const +{ + if ( ( (MainWindow*)this )->formWindow() ) + return ( (MainWindow*)this )->formWindow()->layoutDefaultSpacing(); + return BOXLAYOUT_DEFAULT_SPACING; +} + +int MainWindow::currentLayoutDefaultMargin() const +{ + if ( ( (MainWindow*)this )->formWindow() ) + return ( (MainWindow*)this )->formWindow()->layoutDefaultMargin(); + return BOXLAYOUT_DEFAULT_MARGIN; +} + +void MainWindow::saveAllBreakPoints() +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + e->save(); + e->saveBreakPoints(); + } +} + +void MainWindow::resetBreakPoints() +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) + e->resetBreakPoints(); +} + +SourceFile *MainWindow::sourceFile() +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( qworkspace->activeWindow() == e ) { + if ( e->sourceFile() ) + return e->sourceFile(); + } + } + return 0; +} + +bool MainWindow::openProjectSettings( Project *pro ) +{ + ProjectSettings dia( pro, this, 0, TRUE ); + SenderObject *senderObject = new SenderObject( designerInterface() ); + TQValueList<Tab>::ConstIterator it; + for ( it = projectTabs.begin(); it != projectTabs.end(); ++it ) { + Tab t = *it; + if ( t.title != pro->language() ) + continue; + dia.tabWidget->addTab( t.w, t.title ); + if ( t.receiver ) { + connect( dia.buttonOk, TQT_SIGNAL( clicked() ), senderObject, TQT_SLOT( emitAcceptSignal() ) ); + connect( senderObject, TQT_SIGNAL( acceptSignal( TQUnknownInterface * ) ), t.receiver, t.accept_slot ); + connect( senderObject, TQT_SIGNAL( initSignal( TQUnknownInterface * ) ), t.receiver, t.init_slot ); + senderObject->emitInitSignal(); + disconnect( senderObject, TQT_SIGNAL( initSignal( TQUnknownInterface * ) ), t.receiver, t.init_slot ); + } + } + + if ( singleProject ) + dia.tabWidget->setTabEnabled( dia.tabSettings, FALSE ); + + int res = dia.exec(); + + delete senderObject; + + for ( it = projectTabs.begin(); it != projectTabs.end(); ++it ) { + Tab t = *it; + dia.tabWidget->removePage( t.w ); + t.w->reparent( 0, TQPoint(0,0), FALSE ); + } + + return res == TQDialog::Accepted; +} + +void MainWindow::popupProjectMenu( const TQPoint &pos ) +{ + projectMenu->exec( pos ); +} + +TQStringList MainWindow::sourceTemplates() const +{ + return sourceTemplatePluginManager->featureList(); +} + +SourceTemplateInterface* MainWindow::sourceTemplateInterface( const TQString& templ ) +{ + SourceTemplateInterface *iface = 0; + sourceTemplatePluginManager->queryInterface( templ, &iface); + return iface; +} + +TQString MainWindow::whatsThisFrom( const TQString &key ) +{ + if ( menuHelpFile.isEmpty() ) { + TQString fn( documentationPath() ); + fn += "/designer-manual-11.html"; + TQFile f( fn ); + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + menuHelpFile = ts.read(); + } + } + + int i = menuHelpFile.find( key ); + if ( i == -1 ) + return TQString(); + int start = i; + int end = i; + start = menuHelpFile.findRev( "<li>", i ) + 4; + end = menuHelpFile.find( '\n', i ) - 1; + return menuHelpFile.mid( start, end - start + 1 ); +} + +void MainWindow::setSingleProject( Project *pro ) +{ + if ( eProject ) { + Project *pro = eProject; + pro->save(); + TQWidgetList windows = qWorkspace()->windowList(); + qWorkspace()->blockSignals( TRUE ); + TQWidgetListIt wit( windows ); + while ( wit.current() ) { + TQWidget *w = wit.current(); + ++wit; + if ( ::tqqt_cast<FormWindow*>(w) ) { + if ( ( (FormWindow*)w )->project() == pro ) { + if ( ( (FormWindow*)w )->formFile()->editor() ) + windows.removeRef( ( (FormWindow*)w )->formFile()->editor() ); + ( (FormWindow*)w )->formFile()->close(); + } + } else if ( ::tqqt_cast<SourceEditor*>(w) ) { + ( (SourceEditor*)w )->close(); + } + } + hierarchyView->clear(); + windows = qWorkspace()->windowList(); + qWorkspace()->blockSignals( FALSE ); + currentProject = 0; + updateUndoRedo( FALSE, FALSE, TQString(), TQString() ); + } + + singleProject = TRUE; + projects.clear(); + TQAction *a = new TQAction( i18n( pro->name() ), i18n( pro->name() ), 0, + actionGroupProjects, 0, TRUE ); + eProject = pro; + projects.insert( a, eProject ); + a->setOn( TRUE ); + actionGroupProjects->removeFrom( projectMenu ); + actionGroupProjects->removeFrom( projectToolBar ); + currentProject = eProject; + currentProject->designerCreated(); +} + +void MainWindow::shuttingDown() +{ + outputWindow()->shuttingDown(); +} + +void MainWindow::showGUIStuff( bool b ) +{ + if ( (bool)guiStuffVisible == b ) + return; + guiStuffVisible = b; + if ( !b ) { + setAppropriate( (TQDockWindow*)toolBox->parentWidget(), FALSE ); + toolBox->parentWidget()->hide(); + for ( TQToolBar *tb = widgetToolBars.first(); tb; tb = widgetToolBars.next() ) { + tb->hide(); + setAppropriate( tb, FALSE ); + } + propertyEditor->setPropertyEditorEnabled( FALSE ); + setAppropriate( layoutToolBar, FALSE ); + layoutToolBar->hide(); + setAppropriate( toolsToolBar, FALSE ); + toolsToolBar->hide(); + menubar->removeItem( toolsMenuId ); + menubar->removeItem( toolsMenuId + 1 ); + menubar->removeItem( toolsMenuId + 2 ); + disconnect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditAccels, TQT_SLOT( setEnabled(bool) ) ); + disconnect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditFunctions, TQT_SLOT( setEnabled(bool) ) ); + disconnect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditConnections, TQT_SLOT( setEnabled(bool) ) ); + disconnect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditSource, TQT_SLOT( setEnabled(bool) ) ); + disconnect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditFormSettings, TQT_SLOT( setEnabled(bool) ) ); + actionEditFormSettings->setEnabled( FALSE ); + actionEditSource->setEnabled( FALSE ); + actionEditConnections->setEnabled( FALSE ); + actionEditFunctions->setEnabled( FALSE ); + actionEditAccels->setEnabled( FALSE ); + ( (TQDockWindow*)propertyEditor->parentWidget() )-> + setCaption( i18n( "Signal Handlers" ) ); + actionGroupNew->removeFrom( fileMenu ); + actionGroupNew->removeFrom( projectToolBar ); + actionFileSave->removeFrom( fileMenu ); + actionFileSave->removeFrom( projectToolBar ); + actionFileExit->removeFrom( fileMenu ); + actionNewFile->addTo( fileMenu ); + actionNewFile->addTo( projectToolBar ); + actionFileSave->addTo( fileMenu ); + actionFileSave->addTo( projectToolBar ); + actionFileExit->addTo( fileMenu ); + } else { + setAppropriate( (TQDockWindow*)toolBox->parentWidget(), TRUE ); + toolBox->parentWidget()->show(); + for ( TQToolBar *tb = widgetToolBars.first(); tb; tb = widgetToolBars.next() ) { + setAppropriate( tb, TRUE ); + tb->hide(); + } + propertyEditor->setPropertyEditorEnabled( TRUE ); + setAppropriate( layoutToolBar, TRUE ); + layoutToolBar->show(); + setAppropriate( toolsToolBar, TRUE ); + toolsToolBar->show(); + menubar->insertItem( i18n( "&Tools" ), toolsMenu, toolsMenuId, toolsMenuIndex ); + menubar->insertItem( i18n( "&Layout" ), layoutMenu, toolsMenuId + 1, toolsMenuIndex + 1 ); + menubar->insertItem( i18n( "&Preview" ), previewMenu, toolsMenuId + 2, toolsMenuIndex + 2 ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditAccels, TQT_SLOT( setEnabled(bool) ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditFunctions, TQT_SLOT( setEnabled(bool) ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditConnections, TQT_SLOT( setEnabled(bool) ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditSource, TQT_SLOT( setEnabled(bool) ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditFormSettings, TQT_SLOT( setEnabled(bool) ) ); + actionEditFormSettings->setEnabled( TRUE ); + actionEditSource->setEnabled( TRUE ); + actionEditConnections->setEnabled( TRUE ); + actionEditFunctions->setEnabled( TRUE ); + actionEditAccels->setEnabled( TRUE ); + ( (TQDockWindow*)propertyEditor->parentWidget() )-> + setCaption( i18n( "Property Editor/Signal Handlers" ) ); + actionFileSave->removeFrom( fileMenu ); + actionFileSave->removeFrom( projectToolBar ); + actionFileExit->removeFrom( fileMenu ); + actionGroupNew->addTo( fileMenu ); + actionGroupNew->addTo( projectToolBar ); + actionFileSave->addTo( fileMenu ); + actionFileSave->addTo( projectToolBar ); + actionFileExit->addTo( fileMenu ); + } +} + +void MainWindow::setEditorsReadOnly( bool b ) +{ + editorsReadOnly = b; +} + +void MainWindow::setPluginDirectory( const TQString &pd ) +{ + pluginDir = pd; + if ( !qwf_plugin_dir ) + qwf_plugin_dir = new TQString( pd ); + else + *qwf_plugin_dir = pd; +} + +void MainWindow::toggleSignalHandlers( bool show ) +{ + if ( sSignalHandlers == show ) + return; + sSignalHandlers = show; + propertyEditor->setSignalHandlersEnabled( show ); +} + +void MainWindow::statusMessage( const TQString &msg ) +{ + m_part->statusMessage(msg); +} diff --git a/kdevdesigner/designer/mainwindow.h b/kdevdesigner/designer/mainwindow.h new file mode 100644 index 00000000..1b68c14d --- /dev/null +++ b/kdevdesigner/designer/mainwindow.h @@ -0,0 +1,513 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include "metadatabase.h" +#include "../interfaces/actioninterface.h" // for GCC 2.7.* compatibility +#include "../interfaces/editorinterface.h" +#include "../interfaces/templatewizardiface.h" +#include "../interfaces/languageinterface.h" +#include "../interfaces/filterinterface.h" +#include "../interfaces/interpreterinterface.h" +#include "../interfaces/preferenceinterface.h" +#include "../interfaces/projectsettingsiface.h" +#include "../interfaces/sourcetemplateiface.h" +#include "sourceeditor.h" + +#include <tqaction.h> +#include <tqmainwindow.h> +#include <tqmap.h> +#include <tqguardedptr.h> +#include <tqpluginmanager_p.h> +#include <tqobjectlist.h> + +class TQToolBox; +class PropertyEditor; +class TQWorkspace; +class TQMenuBar; +class FormWindow; +class TQPopupMenu; +class HierarchyView; +class TQCloseEvent; +class Workspace; +class ActionEditor; +class Project; +class OutputWindow; +class TQTimer; +class FindDialog; +struct DesignerProject; +class ReplaceDialog; +class GotoLineDialog; +class SourceFile; +class FormFile; +class TQAssistantClient; +class DesignerAction; + +#if defined(TQ_FULL_TEMPLATE_INSTANTIATION) +#include <tqtoolbar.h> +#else +class TQToolBar; +#endif +class Preferences; + +class KDevDesignerPart; + +class MainWindow : public TQMainWindow +{ + Q_OBJECT + + +public: + enum LineMode { Error, Step, StackFrame }; + + MainWindow( KDevDesignerPart *part, bool asClient, bool single = FALSE, const TQString &plgDir = "/designer" ); + ~MainWindow(); + + HierarchyView *objectHierarchy() const; + Workspace *workspace() const; + PropertyEditor *propertyeditor() const; + ActionEditor *actioneditor() const; + + void resetTool(); + int currentTool() const; + + FormWindow *formWindow(); + + bool unregisterClient( FormWindow *w ); + void editorClosed( SourceEditor *e ); + TQWidget *isAFormWindowChild( TQObject *o ) const; + TQWidget *isAToolBarChild( TQObject *o ) const; + + void insertFormWindow( FormWindow *fw ); + TQWorkspace *qWorkspace() const; + + void popupFormWindowMenu( const TQPoint &gp, FormWindow *fw ); + void popupWidgetMenu( const TQPoint &gp, FormWindow *fw, TQWidget *w ); + + TQPopupMenu *setupNormalHierarchyMenu( TQWidget *parent ); + TQPopupMenu *setupTabWidgetHierarchyMenu( TQWidget *parent, const char *addSlot, const char *removeSlot ); + + FormWindow *openFormWindow( const TQString &fn, bool validFileName = TRUE, FormFile *ff = 0 ); + bool isCustomWidgetUsed( MetaDataBase::CustomWidget *w ); + + void setGrid( const TQPoint &p ); + void setShowGrid( bool b ); + void setSnapGrid( bool b ); + TQPoint grid() const { return grd; } + bool showGrid() const { return sGrid; } + bool snapGrid() const { return snGrid && sGrid; } + + TQString documentationPath() const; + + static MainWindow *self; + + TQString templatePath() const { return templPath; } + + void editFunction( const TQString &func, bool rereadSource = FALSE ); + + bool isPreviewing() const { return previewing; } + + Project *currProject() const { return currentProject; } + + FormWindow *activeForm() const { return lastActiveFormWindow; } + + TemplateWizardInterface* templateWizardInterface( const TQString& className ); + TQStringList sourceTemplates() const; + SourceTemplateInterface* sourceTemplateInterface( const TQString& templ ); + TQUnknownInterface* designerInterface() const { return desInterface; } + TQPtrList<DesignerProject> projectList() const; + TQStringList projectNames() const; + TQStringList projectFileNames() const; + Project *findProject( const TQString &projectName ) const; + void setCurrentProject( Project *pro ); + void setCurrentProjectByFilename( const TQString& proFilename ); + OutputWindow *outputWindow() const { return oWindow; } + void addPreferencesTab( TQWidget *tab, const TQString &title, TQObject *receiver, const char *init_slot, const char *accept_slot ); + void addProjectTab( TQWidget *tab, const TQString &title, TQObject *receiver, const char *init_slot, const char *accept_slot ); + void setModified( bool b, TQWidget *window ); + void functionsChanged(); + void updateFunctionList(); + void updateWorkspace(); + void runProjectPrecondition(); + void runProjectPostcondition( TQObjectList *l ); + + void formNameChanged( FormWindow *fw ); + + int currentLayoutDefaultSpacing() const; + int currentLayoutDefaultMargin() const; + + void saveAllBreakPoints(); + void resetBreakPoints(); + + SourceFile *sourceFile(); + void createNewProject( const TQString &lang ); + + void popupProjectMenu( const TQPoint &pos ); + TQObject *findRealObject( TQObject *o ); + + void setSingleProject( Project *pro ); + bool singleProjectMode() const { return singleProject; } + + void showSourceLine( TQObject *o, int line, LineMode lm ); + + void shuttingDown(); + void showGUIStuff( bool b ); + void setEditorsReadOnly( bool b ); + bool areEditorsReadOnly() const { return editorsReadOnly; } + void toggleSignalHandlers( bool show ); + bool showSignalHandlers() const { return sSignalHandlers; } + void writeConfig(); + + void openProject( const TQString &fn ); + void setPluginDirectory( const TQString &pd ); + TQString pluginDirectory() const { return pluginDir; } + + TQAssistantClient* assistantClient() const { return assistant; } + + void addRecentlyOpenedFile( const TQString &fn ) { addRecentlyOpened( fn, recentlyFiles ); } + + void statusMessage(const TQString &msg); + + //integration + KDevDesignerPart *part() const { return m_part; } + +public slots: + void showProperties( TQObject *w ); + void updateProperties( TQObject *w ); + void showDialogHelp(); + void showDebugStep( TQObject *o, int line ); + void showStackFrame( TQObject *o, int line ); + void showErrorMessage( TQObject *o, int line, const TQString &errorMessage ); + void finishedRun(); + void breakPointsChanged(); + +signals: + void currentToolChanged(); + void hasActiveForm( bool ); + void hasActiveWindow( bool ); + void hasActiveWindowOrProject( bool ); + void hasNonDummyProject( bool ); + void formModified( bool ); + void formWindowsChanged(); + void formWindowChanged(); + void projectChanged(); + void editorChanged(); + +protected: + bool eventFilter( TQObject *o, TQEvent *e ); + void closeEvent( TQCloseEvent *e ); + +public slots: + void fileNew(); + void fileNewDialog(); + void fileNewFile(); + void fileClose(); + void fileQuit(); + void fileCloseProject(); // not visible in menu, called from fileClose + void fileOpen(); + void fileOpen( const TQString &filter, const TQString &extension, const TQString &filename = "" , bool inProject = TRUE ); + bool fileSave(); + bool fileSaveForm(); // not visible in menu, called from fileSave + bool fileSaveProject(); // not visible in menu, called from fileSaveProject + bool fileSaveAs(); + void fileSaveAll(); + void fileCreateTemplate(); + +public slots: + void editUndo(); + void editRedo(); + void editCut(); + void editCopy(); + void editPaste(); + void editDelete(); + void editSelectAll(); + void editLower(); + void editRaise(); + void editAdjustSize(); + void editLayoutHorizontal(); + void editLayoutVertical(); + void editLayoutHorizontalSplit(); + void editLayoutVerticalSplit(); + void editLayoutGrid(); + void editLayoutContainerHorizontal(); + void editLayoutContainerVertical(); + void editLayoutContainerGrid(); + void editBreakLayout(); + void editAccels(); + void editFunctions(); + void editConnections(); + SourceEditor *editSource(); + SourceEditor *editSource( SourceFile *f ); + SourceEditor *openSourceEditor(); + SourceEditor *createSourceEditor( TQObject *object, Project *project, + const TQString &lang = TQString(), + const TQString &func = TQString(), + bool rereadSource = FALSE ); + void editFormSettings(); + void editProjectSettings(); + void editPixmapCollection(); + void editDatabaseConnections(); + void editPreferences(); + + void projectInsertFile(); + + void searchFind(); + void searchIncremetalFindMenu(); + void searchIncremetalFind(); + void searchIncremetalFindNext(); + void searchReplace(); + void searchGotoLine(); + + void previewForm(); + void previewForm( const TQString& ); + + void toolsCustomWidget(); + void toolsConfigure(); + + void helpContents(); + void helpManual(); + void helpAbout(); + void helpAboutQt(); + void helpRegister(); + +private slots: + void activeWindowChanged( TQWidget *w ); + void updateUndoRedo( bool, bool, const TQString &, const TQString & ); + void updateEditorUndoRedo(); + + void toolSelected( TQAction* ); + + void clipboardChanged(); + void selectionChanged(); + + void windowsMenuActivated( int id ); + void setupWindowActions(); + + void createNewTemplate(); + void projectSelected( TQAction *a ); + + void setupRecentlyFilesMenu(); + void setupRecentlyProjectsMenu(); + void recentlyFilesMenuActivated( int id ); + void recentlyProjectsMenuActivated( int id ); + + void emitProjectSignals(); + + void showStartDialog(); + +private: + void setupMDI(); + void setupMenuBar(); + void setupEditActions(); + void setupProjectActions(); + void setupSearchActions(); + void setupToolActions(); + void setupLayoutActions(); + void setupFileActions(); + void setupPreviewActions(); + void setupHelpActions(); + void setupRMBMenus(); + + void setupPropertyEditor(); + void setupHierarchyView(); + void setupWorkspace(); + void setupActionEditor(); + void setupOutputWindow(); + void setupToolbox(); + + void setupActionManager(); + void setupPluginManagers(); + + void enableAll( bool enable ); + + TQWidget* previewFormInternal( TQStyle* style = 0, TQPalette* pal = 0 ); + + void readConfig(); + + void setupRMBProperties( TQValueList<uint> &ids, TQMap<TQString, int> &props, TQWidget *w ); + void handleRMBProperties( int id, TQMap<TQString, int> &props, TQWidget *w ); + void setupRMBSpecialCommands( TQValueList<uint> &ids, TQMap<TQString, int> &commands, TQWidget *w ); + void handleRMBSpecialCommands( int id, TQMap<TQString, int> &commands, TQWidget *w ); + void setupRMBSpecialCommands( TQValueList<uint> &ids, TQMap<TQString, int> &commands, FormWindow *w ); + void handleRMBSpecialCommands( int id, TQMap<TQString, int> &commands, FormWindow *w ); + bool openEditor( TQWidget *w, FormWindow *fw ); + void rebuildCustomWidgetGUI(); + void rebuildCommonWidgetsToolBoxPage(); + void checkTempFiles(); + + void addRecentlyOpened( const TQString &fn, TQStringList &lst ); + + TQString whatsThisFrom( const TQString &key ); + +private slots: + void doFunctionsChanged(); + bool openProjectSettings( Project *pro ); + +private: + struct Tab + { + TQWidget *w; + TQString title; + TQObject *receiver; + const char *init_slot, *accept_slot; + TQ_DUMMY_COMPARISON_OPERATOR( Tab ) + }; + +private: + PropertyEditor *propertyEditor; + HierarchyView *hierarchyView; + Workspace *wspace; + TQWidget *lastPressWidget; + TQWorkspace *qworkspace; + TQMenuBar *menubar; + TQGuardedPtr<FormWindow> lastActiveFormWindow; + bool breakLayout, layoutChilds, layoutSelected; + TQPoint grd; + bool sGrid, snGrid; + bool restoreConfig; + bool backPix; + bool splashScreen; + TQString fileFilter; + + TQMap<TQAction*, Project*> projects; + DesignerAction *actionEditUndo, *actionEditRedo, *actionEditCut, *actionEditCopy, + *actionEditPaste, *actionEditDelete, + *actionEditAdjustSize, + *actionEditHLayout, *actionEditVLayout, *actionEditGridLayout, + *actionEditSplitHorizontal, *actionEditSplitVertical, + *actionEditSelectAll, *actionEditBreakLayout, *actionEditFunctions, *actionEditConnections, + *actionEditLower, *actionEditRaise; + TQAction *actionInsertSpacer; + TQActionGroup *actionGroupTools, *actionGroupProjects; + TQAction* actionPointerTool, *actionConnectTool, *actionOrderTool, *actionBuddyTool; + TQAction* actionCurrentTool; + DesignerAction *actionHelpContents, *actionHelpAbout, *actionHelpAboutTQt, *actionHelpWhatsThis; + DesignerAction *actionHelpManual; +#if defined(TQT_NON_COMMERCIAL) + DesignerAction *actionHelpRegister; +#endif + DesignerAction *actionToolsCustomWidget, *actionEditPreferences; + DesignerAction *actionWindowTile, *actionWindowCascade, *actionWindowClose, *actionWindowCloseAll; + DesignerAction *actionWindowNext, *actionWindowPrevious; + DesignerAction *actionEditFormSettings, *actionEditAccels; + DesignerAction *actionEditSource, *actionNewFile, *actionFileSave, *actionFileExit; + DesignerAction *actionFileClose, *actionFileSaveAs, *actionFileSaveAll; + DesignerAction *actionSearchFind, *actionSearchIncremetal, *actionSearchReplace, *actionSearchGotoLine; + DesignerAction *actionProjectAddFile, *actionEditPixmapCollection, *actionEditDatabaseConnections, + *actionEditProjectSettings, *actionPreview; + TQActionGroup *actionGroupNew; + + TQPopupMenu *rmbWidgets; + TQPopupMenu *rmbFormWindow; + TQPopupMenu *customWidgetMenu, *windowMenu, *fileMenu, *recentlyFilesMenu, *recentlyProjectsMenu; + TQPopupMenu *toolsMenu, *layoutMenu, *previewMenu; + TQToolBar *customWidgetToolBar, *layoutToolBar, *projectToolBar, *customWidgetToolBar2, *toolsToolBar; + TQToolBar *commonWidgetsToolBar; + TQPtrList<TQToolBar> widgetToolBars; + + Preferences *prefDia; + TQMap<TQString,TQString> propertyDocumentation; + bool client; + TQString templPath; + ActionEditor *actionEditor; + Project *currentProject; + TQPluginManager<ActionInterface> *actionPluginManager; + TQPluginManager<EditorInterface> *editorPluginManager; + TQPluginManager<TemplateWizardInterface> *templateWizardPluginManager; + TQPluginManager<InterpreterInterface> *interpreterPluginManager; + TQPluginManager<PreferenceInterface> *preferencePluginManager; + TQPluginManager<ProjectSettingsInterface> *projectSettingsPluginManager; + TQPluginManager<SourceTemplateInterface> *sourceTemplatePluginManager; + TQPtrList<SourceEditor> sourceEditors; + bool previewing; + TQUnknownInterface *desInterface; + TQStringList recentlyFiles; + TQStringList recentlyProjects; + OutputWindow *oWindow; + TQValueList<Tab> preferenceTabs; + TQValueList<Tab> projectTabs; + bool databaseAutoEdit; + TQTimer *updateFunctionsTimer; + TQTimer *autoSaveTimer; + bool autoSaveEnabled; + int autoSaveInterval; + TQLineEdit *incrementalSearch; + TQGuardedPtr<FindDialog> findDialog; + TQGuardedPtr<ReplaceDialog> replaceDialog; + TQGuardedPtr<GotoLineDialog> gotoLineDialog; + Project *eProject; + bool inDebugMode; + TQObjectList debuggingForms; + TQString lastOpenFilter; + TQGuardedPtr<TQWidget> previewedForm; + TQPopupMenu *projectMenu; + TQString menuHelpFile; + bool singleProject; + TQToolBox *toolBox; + int toolsMenuId, toolsMenuIndex; + uint guiStuffVisible : 1; + uint editorsReadOnly : 1; + uint savePluginPaths : 1; + TQAssistantClient *assistant; + bool shStartDialog; + TQString pluginDir; + bool sSignalHandlers; + + KDevDesignerPart *m_part; + +public: + TQString lastSaveFilter; + TQPtrList<TQAction> toolActions; + TQPtrList<TQAction> commonWidgetsPage; + +friend class KDevDesignerPart; +}; + +class SenderObject : public TQObject +{ + Q_OBJECT + + +public: + SenderObject( TQUnknownInterface *i ) : iface( i ) { iface->addRef(); } + ~SenderObject() { iface->release(); } + +public slots: + void emitInitSignal() { emit initSignal( iface ); } + void emitAcceptSignal() { emit acceptSignal( iface ); } + +signals: + void initSignal( TQUnknownInterface * ); + void acceptSignal( TQUnknownInterface * ); + +private: + TQUnknownInterface *iface; + +}; + +#endif diff --git a/kdevdesigner/designer/mainwindowactions.cpp b/kdevdesigner/designer/mainwindowactions.cpp new file mode 100644 index 00000000..7fa1d1f7 --- /dev/null +++ b/kdevdesigner/designer/mainwindowactions.cpp @@ -0,0 +1,2067 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "mainwindow.h" + +#include <kiconloader.h> +#include <tdefiledialog.h> +#include <tdelocale.h> +#include <klineedit.h> + +#include <stdlib.h> +#include <tqaction.h> +#include <tqwhatsthis.h> +#include <tqpopupmenu.h> +#include <tqmenubar.h> +#include <tqtooltip.h> +#include <tqapplication.h> +#include <tqsignalmapper.h> +#include <tqstylefactory.h> +#include <tqworkspace.h> +#include <tqmessagebox.h> +#include <tqstatusbar.h> +#include <tqlistbox.h> +#include <tqclipboard.h> +#include <tqcombobox.h> +#include <tqspinbox.h> +#include <tqinputdialog.h> +#include <tqdatetimeedit.h> +#include <tqtextedit.h> + +#include "defs.h" +#include "project.h" +#include "widgetdatabase.h" +#include "widgetfactory.h" +#include "preferences.h" +#include "formwindow.h" +#include "newformimpl.h" +#include "resource.h" +#include "projectsettingsimpl.h" +#include "workspace.h" +#include "createtemplate.h" +#include "hierarchyview.h" +#include "editfunctionsimpl.h" +#include "finddialog.h" +#include "replacedialog.h" +#include "gotolinedialog.h" +#include "formsettingsimpl.h" +#include "pixmapcollectioneditor.h" +#include "styledbutton.h" +#include "customwidgeteditorimpl.h" +#ifndef TQT_NO_SQL +#include "dbconnectionsimpl.h" +#include "dbconnectionimpl.h" +#endif +#include "widgetaction.h" +#include <tqtoolbox.h> +#include "startdialogimpl.h" +#include "designerappiface.h" +#include "connectiondialog.h" +#include "configtoolboxdialog.h" +#include "designeraction.h" + +#include "kdevdesigner_part.h" + +static const char * whatsthis_image[] = { + "16 16 3 1", + " c None", + "o c #000000", + "a c #000080", + "o aaaaa ", + "oo aaa aaa ", + "ooo aaa aaa", + "oooo aa aa", + "ooooo aa aa", + "oooooo a aaa", + "ooooooo aaa ", + "oooooooo aaa ", + "ooooooooo aaa ", + "ooooo aaa ", + "oo ooo ", + "o ooo aaa ", + " ooo aaa ", + " ooo ", + " ooo ", + " ooo "}; + +const TQString toolbarHelp = "<p>Toolbars contain a number of buttons to " +"provide quick access to often used functions.%1" +"<br>Click on the toolbar handle to hide the toolbar, " +"or drag and place the toolbar to a different location.</p>"; + +static TQIconSet createIconSet( const TQString &name ) +{ + TQIconSet ic( BarIcon( "" + name, KDevDesignerPartFactory::instance() ) ); + TQString prefix = "designer_"; + int right = name.length() - prefix.length(); + ic.setPixmap( BarIcon( prefix + "d_" + name.right( right ), KDevDesignerPartFactory::instance() ), + TQIconSet::Small, TQIconSet::Disabled ); + return ic; +} + +void MainWindow::setupEditActions() +{ + actionEditUndo = new DesignerAction( i18n("Undo"), createIconSet( "designer_undo.png" ),i18n("&Undo: Not Available"), CTRL + Key_Z, TQT_TQOBJECT(this), 0 ); + actionEditUndo->setStatusTip( i18n( "Undoes the last action" ) ); + actionEditUndo->setWhatsThis( whatsThisFrom( "Edit|Undo" ) ); + connect( actionEditUndo, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editUndo() ) ); + actionEditUndo->setEnabled( FALSE ); + + actionEditRedo = new DesignerAction( i18n( "Redo" ), createIconSet("designer_redo.png"), i18n( "&Redo: Not Available" ), CTRL + Key_Y, TQT_TQOBJECT(this), 0 ); + actionEditRedo->setStatusTip( i18n( "Redoes the last undone operation") ); + actionEditRedo->setWhatsThis( whatsThisFrom( "Edit|Redo" ) ); + connect( actionEditRedo, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editRedo() ) ); + actionEditRedo->setEnabled( FALSE ); + + actionEditCut = new DesignerAction( i18n( "Cut" ), createIconSet("designer_editcut.png"), i18n( "Cu&t" ), CTRL + Key_X, TQT_TQOBJECT(this), 0 ); + actionEditCut->setStatusTip( i18n( "Cuts the selected widgets and puts them on the clipboard" ) ); + actionEditCut->setWhatsThis( whatsThisFrom( "Edit|Cut" ) ); + connect( actionEditCut, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editCut() ) ); + actionEditCut->setEnabled( FALSE ); + + actionEditCopy = new DesignerAction( i18n( "Copy" ), createIconSet("designer_editcopy.png"), i18n( "&Copy" ), CTRL + Key_C, TQT_TQOBJECT(this), 0 ); + actionEditCopy->setStatusTip( i18n( "Copies the selected widgets to the clipboard" ) ); + actionEditCopy->setWhatsThis( whatsThisFrom( "Edit|Copy" ) ); + connect( actionEditCopy, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editCopy() ) ); + actionEditCopy->setEnabled( FALSE ); + + actionEditPaste = new DesignerAction( i18n( "Paste" ), createIconSet("designer_editpaste.png"), i18n( "&Paste" ), CTRL + Key_V, TQT_TQOBJECT(this), 0 ); + actionEditPaste->setStatusTip( i18n( "Pastes the clipboard's contents" ) ); + actionEditPaste->setWhatsThis( whatsThisFrom( "Edit|Paste" ) ); + connect( actionEditPaste, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editPaste() ) ); + actionEditPaste->setEnabled( FALSE ); + + actionEditDelete = new DesignerAction( i18n( "Delete" ), TQPixmap(), i18n( "&Delete" ), Key_Delete, TQT_TQOBJECT(this), 0 ); + actionEditDelete->setStatusTip( i18n( "Deletes the selected widgets" ) ); + actionEditDelete->setWhatsThis( whatsThisFrom( "Edit|Delete" ) ); + connect( actionEditDelete, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editDelete() ) ); + actionEditDelete->setEnabled( FALSE ); +#ifdef TQ_WS_MAC + TQAction *macDelete = new DesignerAction( i18n( "Delete" ), TQPixmap(), i18n( "&Delete" ), Key_Backspace, TQT_TQOBJECT(this), 0 ); + connect( macDelete, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editDelete() ) ); +#endif + + actionEditSelectAll = new DesignerAction( i18n( "Select All" ), TQPixmap(), i18n( "Select &All" ), CTRL + Key_A, TQT_TQOBJECT(this), 0 ); + actionEditSelectAll->setStatusTip( i18n( "Selects all widgets" ) ); + actionEditSelectAll->setWhatsThis( whatsThisFrom( "Edit|Select All" ) ); + connect( actionEditSelectAll, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editSelectAll() ) ); + actionEditSelectAll->setEnabled( TRUE ); + + actionEditRaise = new DesignerAction( i18n( "Bring to Front" ), createIconSet("designer_editraise.png"), i18n( "Bring to &Front" ), 0, TQT_TQOBJECT(this), 0 ); + actionEditRaise->setStatusTip( i18n( "Raises the selected widgets" ) ); + actionEditRaise->setWhatsThis( i18n( "Raises the selected widgets" ) ); + connect( actionEditRaise, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editRaise() ) ); + actionEditRaise->setEnabled( FALSE ); + + actionEditLower = new DesignerAction( i18n( "Send to Back" ), createIconSet("designer_editlower.png"), i18n( "Send to &Back" ), 0, TQT_TQOBJECT(this), 0 ); + actionEditLower->setStatusTip( i18n( "Lowers the selected widgets" ) ); + actionEditLower->setWhatsThis( i18n( "Lowers the selected widgets" ) ); + connect( actionEditLower, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editLower() ) ); + actionEditLower->setEnabled( FALSE ); + + actionEditAccels = new DesignerAction( i18n( "Check Accelerators" ), TQPixmap(), + i18n( "Chec&k Accelerators" ), ALT + Key_R, TQT_TQOBJECT(this), 0 ); + actionEditAccels->setStatusTip( i18n("Checks if the accelerators used in the form are unique") ); + actionEditAccels->setWhatsThis( whatsThisFrom( "Edit|Check Accelerator" ) ); + connect( actionEditAccels, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editAccels() ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditAccels, TQT_SLOT( setEnabled(bool) ) ); + + actionEditFunctions = new DesignerAction( i18n( "Slots" ), createIconSet("designer_editslots.png"), + i18n( "S&lots..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditFunctions->setStatusTip( i18n("Opens a dialog for editing slots") ); + actionEditFunctions->setWhatsThis( whatsThisFrom( "Edit|Slots" ) ); + connect( actionEditFunctions, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editFunctions() ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditFunctions, TQT_SLOT( setEnabled(bool) ) ); + + actionEditConnections = new DesignerAction( i18n( "Connections" ), createIconSet("designer_connecttool.png"), + i18n( "Co&nnections..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditConnections->setStatusTip( i18n("Opens a dialog for editing connections") ); + actionEditConnections->setWhatsThis( whatsThisFrom( "Edit|Connections" ) ); + connect( actionEditConnections, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editConnections() ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditConnections, TQT_SLOT( setEnabled(bool) ) ); + + actionEditSource = new DesignerAction( i18n( "Source" ), TQIconSet(), + i18n( "&Source..." ), CTRL + Key_E, TQT_TQOBJECT(this), 0 ); + actionEditSource->setStatusTip( i18n("Opens an editor to edit the form's source code") ); + actionEditSource->setWhatsThis( whatsThisFrom( "Edit|Source" ) ); + connect( actionEditSource, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editSource() ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditSource, TQT_SLOT( setEnabled(bool) ) ); + + actionEditFormSettings = new DesignerAction( i18n( "Form Settings" ), TQPixmap(), + i18n( "&Form Settings..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditFormSettings->setStatusTip( i18n("Opens a dialog to change the form's settings") ); + actionEditFormSettings->setWhatsThis( whatsThisFrom( "Edit|Form Settings" ) ); + connect( actionEditFormSettings, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editFormSettings() ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), actionEditFormSettings, TQT_SLOT( setEnabled(bool) ) ); + + actionEditPreferences = new DesignerAction( i18n( "Preferences" ), TQPixmap(), + i18n( "Preferences..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditPreferences->setStatusTip( i18n("Opens a dialog to change preferences") ); + actionEditPreferences->setWhatsThis( whatsThisFrom( "Edit|Preferences" ) ); + connect( actionEditPreferences, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editPreferences() ) ); + +/* TQToolBar *tb = new TQToolBar( this, "Edit" ); + tb->setCloseMode( TQDockWindow::Undocked ); + TQWhatsThis::add( tb, i18n( "<b>The Edit toolbar</b>%1").arg(i18n(toolbarHelp).arg("")) ); + addToolBar( tb, i18n( "Edit" ) ); + actionEditUndo->addTo( tb ); + actionEditRedo->addTo( tb ); + tb->addSeparator(); + actionEditCut->addTo( tb ); + actionEditCopy->addTo( tb ); + actionEditPaste->addTo( tb );*/ +#if 0 + tb->addSeparator(); + actionEditLower->addTo( tb ); + actionEditRaise->addTo( tb ); +#endif + + TQPopupMenu *menu = new TQPopupMenu( this, "Edit" ); + connect( menu, TQT_SIGNAL( aboutToShow() ), TQT_TQOBJECT(this), TQT_SLOT( updateEditorUndoRedo() ) ); + menubar->insertItem( i18n( "&Edit" ), menu ); + actionEditUndo->addTo( menu ); + actionEditRedo->addTo( menu ); + menu->insertSeparator(); + actionEditCut->addTo( menu ); + actionEditCopy->addTo( menu ); + actionEditPaste->addTo( menu ); + actionEditDelete->addTo( menu ); + actionEditSelectAll->addTo( menu ); + actionEditAccels->addTo( menu ); +#if 0 + menu->insertSeparator(); + actionEditLower->addTo( menu ); + actionEditRaise->addTo( menu ); +#endif + menu->insertSeparator(); + if ( !singleProjectMode() ) { + actionEditFunctions->addTo( menu ); + actionEditConnections->addTo( menu ); + } + actionEditFormSettings->addTo( menu ); + menu->insertSeparator(); + actionEditPreferences->addTo( menu ); +} + +void MainWindow::setupSearchActions() +{ + actionSearchFind = new DesignerAction( i18n( "Find" ), createIconSet( "designer_searchfind.png" ), + i18n( "&Find..." ), CTRL + Key_F, TQT_TQOBJECT(this), 0 ); + connect( actionSearchFind, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( searchFind() ) ); + actionSearchFind->setEnabled( FALSE ); + actionSearchFind->setWhatsThis( whatsThisFrom( "Search|Find" ) ); + + actionSearchIncremetal = new DesignerAction( i18n( "Find Incremental" ), TQIconSet(), + i18n( "Find &Incremental" ), ALT + Key_I, TQT_TQOBJECT(this), 0 ); + connect( actionSearchIncremetal, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( searchIncremetalFindMenu() ) ); + actionSearchIncremetal->setEnabled( FALSE ); + actionSearchIncremetal->setWhatsThis( whatsThisFrom( "Search|Find Incremental" ) ); + + actionSearchReplace = new DesignerAction( i18n( "Replace" ), TQIconSet(), + i18n( "&Replace..." ), CTRL + Key_R, TQT_TQOBJECT(this), 0 ); + connect( actionSearchReplace, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( searchReplace() ) ); + actionSearchReplace->setEnabled( FALSE ); + actionSearchReplace->setWhatsThis( whatsThisFrom( "Search|Replace" ) ); + + actionSearchGotoLine = new DesignerAction( i18n( "Goto Line" ), TQIconSet(), + i18n( "&Goto Line..." ), ALT + Key_G, TQT_TQOBJECT(this), 0 ); + connect( actionSearchGotoLine, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( searchGotoLine() ) ); + actionSearchGotoLine->setEnabled( FALSE ); + actionSearchGotoLine->setWhatsThis( whatsThisFrom( "Search|Goto line" ) ); + +/* TQToolBar *tb = new TQToolBar( this, "Search" ); + tb->setCloseMode( TQDockWindow::Undocked ); + addToolBar( tb, i18n( "Search" ) ); + + actionSearchFind->addTo( tb );*/ + incrementalSearch = new TQLineEdit( 0 ); + incrementalSearch->hide(); + TQToolTip::add( incrementalSearch, i18n( "Incremental search (Alt+I)" ) ); + connect( incrementalSearch, TQT_SIGNAL( textChanged( const TQString & ) ), + this, TQT_SLOT( searchIncremetalFind() ) ); + connect( incrementalSearch, TQT_SIGNAL( returnPressed() ), + this, TQT_SLOT( searchIncremetalFindNext() ) ); + incrementalSearch->setEnabled( FALSE ); + + TQPopupMenu *menu = new TQPopupMenu( this, "Search" ); + menubar->insertItem( i18n( "&Search" ), menu ); + actionSearchFind->addTo( menu ); + actionSearchIncremetal->addTo( menu ); + actionSearchReplace->addTo( menu ); + menu->insertSeparator(); + actionSearchGotoLine->addTo( menu ); +} + +void MainWindow::setupLayoutActions() +{ + if ( !actionGroupTools ) { + actionGroupTools = new TQActionGroup( this ); + actionGroupTools->setExclusive( TRUE ); + connect( actionGroupTools, TQT_SIGNAL( selected(TQAction*) ), TQT_TQOBJECT(this), TQT_SLOT( toolSelected(TQAction*) ) ); + } + + actionEditAdjustSize = new DesignerAction( i18n( "Adjust Size" ), createIconSet("designer_adjustsize.png"), + i18n( "Adjust &Size" ), CTRL + Key_J, TQT_TQOBJECT(this), 0 ); + actionEditAdjustSize->setStatusTip(i18n("Adjusts the size of the selected widget") ); + actionEditAdjustSize->setWhatsThis( whatsThisFrom( "Layout|Adjust Size" ) ); + connect( actionEditAdjustSize, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editAdjustSize() ) ); + actionEditAdjustSize->setEnabled( FALSE ); + + actionEditHLayout = new DesignerAction( i18n( "Lay OutQt::Horizontally" ), createIconSet("designer_edithlayout.png"), + i18n( "Lay Out &Horizontally" ), CTRL + Key_H, TQT_TQOBJECT(this), 0 ); + actionEditHLayout->setStatusTip(i18n("Lays out the selected widgets horizontally") ); + actionEditHLayout->setWhatsThis( whatsThisFrom( "Layout|Lay OutQt::Horizontally" ) ); + connect( actionEditHLayout, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editLayoutHorizontal() ) ); + actionEditHLayout->setEnabled( FALSE ); + + actionEditVLayout = new DesignerAction( i18n( "Lay OutQt::Vertically" ), createIconSet("designer_editvlayout.png"), + i18n( "Lay Out &Vertically" ), CTRL + Key_L, TQT_TQOBJECT(this), 0 ); + actionEditVLayout->setStatusTip(i18n("Lays out the selected widgets vertically") ); + actionEditVLayout->setWhatsThis( whatsThisFrom( "Layout|Lay OutQt::Vertically" ) ); + connect( actionEditVLayout, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editLayoutVertical() ) ); + actionEditVLayout->setEnabled( FALSE ); + + actionEditGridLayout = new DesignerAction( i18n( "Lay Out in a Grid" ), createIconSet("designer_editgrid.png"), + i18n( "Lay Out in a &Grid" ), CTRL + Key_G, TQT_TQOBJECT(this), 0 ); + actionEditGridLayout->setStatusTip(i18n("Lays out the selected widgets in a grid") ); + actionEditGridLayout->setWhatsThis( whatsThisFrom( "Layout|Lay Out in a Grid" ) ); + connect( actionEditGridLayout, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editLayoutGrid() ) ); + actionEditGridLayout->setEnabled( FALSE ); + + actionEditSplitHorizontal = new DesignerAction( i18n( "Lay OutQt::Horizontally (in Splitter)" ), createIconSet("designer_editvlayoutsplit.png"), + i18n( "Lay OutQt::Horizontally (in S&plitter)" ), 0, TQT_TQOBJECT(this), 0 ); + actionEditSplitHorizontal->setStatusTip(i18n("Lays out the selected widgets horizontally in a splitter") ); + actionEditSplitHorizontal->setWhatsThis( whatsThisFrom( "Layout|Lay OutQt::Horizontally (in Splitter)" ) ); + connect( actionEditSplitHorizontal, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editLayoutHorizontalSplit() ) ); + actionEditSplitHorizontal->setEnabled( FALSE ); + + actionEditSplitVertical = new DesignerAction( i18n( "Lay OutQt::Vertically (in Splitter)" ), createIconSet("designer_edithlayoutsplit.png"), + i18n( "Lay OutQt::Vertically (in Sp&litter)" ), 0, TQT_TQOBJECT(this), 0 ); + actionEditSplitVertical->setStatusTip(i18n("Lays out the selected widgets vertically in a splitter") ); + actionEditSplitVertical->setWhatsThis( whatsThisFrom( "Layout|Lay OutQt::Vertically (in Splitter)" ) ); + connect( actionEditSplitVertical, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editLayoutVerticalSplit() ) ); + actionEditSplitVertical->setEnabled( FALSE ); + + actionEditBreakLayout = new DesignerAction( i18n( "Break Layout" ), createIconSet("designer_editbreaklayout.png"), + i18n( "&Break Layout" ), CTRL + Key_B, TQT_TQOBJECT(this), 0 ); + actionEditBreakLayout->setStatusTip(i18n("Breaks the selected layout") ); + actionEditBreakLayout->setWhatsThis( whatsThisFrom( "Layout|Break Layout" ) ); + connect( actionEditBreakLayout, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editBreakLayout() ) ); + actionEditBreakLayout->setEnabled( FALSE ); + + int id = WidgetDatabase::idFromClassName( "Spacer" ); + actionInsertSpacer = new WidgetAction( i18n( "Layout" ), actionGroupTools, TQString::number( id ).latin1() ); + actionInsertSpacer->setToggleAction( TRUE ); + actionInsertSpacer->setText( WidgetDatabase::className( id ) ); + actionInsertSpacer->setMenuText( i18n( "Add %1").arg( WidgetDatabase::className( id ) ) ); + actionInsertSpacer->setIconSet( WidgetDatabase::iconSet( id ) ); + actionInsertSpacer->setToolTip( WidgetDatabase::toolTip( id ) ); + actionInsertSpacer->setStatusTip( i18n( "Insert a %1").arg(WidgetDatabase::toolTip( id )) ); + actionInsertSpacer->setWhatsThis( i18n("<b>A %1</b><p>%2</p>" + "<p>Click to insert a single %3," + "or double click to keep the tool selected.") + .arg(WidgetDatabase::toolTip( id )) + .arg(WidgetDatabase::whatsThis( id )) + .arg(WidgetDatabase::toolTip( id ) )); + + actionInsertSpacer->addTo( commonWidgetsToolBar ); + commonWidgetsPage.append( actionInsertSpacer ); + TQWidget *w; + commonWidgetsToolBar->setStretchableWidget( ( w = new TQWidget( commonWidgetsToolBar ) ) ); + w->setBackgroundMode( commonWidgetsToolBar->backgroundMode() ); + TQWhatsThis::add( layoutToolBar, i18n( "<b>The Layout toolbar</b>%1" ).arg(i18n(toolbarHelp).arg("")) ); + actionEditAdjustSize->addTo( layoutToolBar ); + layoutToolBar->addSeparator(); + actionEditHLayout->addTo( layoutToolBar ); + actionEditVLayout->addTo( layoutToolBar ); + actionEditGridLayout->addTo( layoutToolBar ); + actionEditSplitHorizontal->addTo( layoutToolBar ); + actionEditSplitVertical->addTo( layoutToolBar ); + actionEditBreakLayout->addTo( layoutToolBar ); + layoutToolBar->addSeparator(); + actionInsertSpacer->addTo( layoutToolBar ); + + TQPopupMenu *menu = new TQPopupMenu( this, "Layout" ); + layoutMenu = menu; + menubar->insertItem( i18n( "&Layout" ), menu, toolsMenuId + 1 ); + actionEditAdjustSize->addTo( menu ); + menu->insertSeparator(); + actionEditHLayout->addTo( menu ); + actionEditVLayout->addTo( menu ); + actionEditGridLayout->addTo( menu ); + actionEditSplitHorizontal->addTo( menu ); + actionEditSplitVertical->addTo( menu ); + actionEditBreakLayout->addTo( menu ); + menu->insertSeparator(); + actionInsertSpacer->addTo( menu ); +} + +void MainWindow::setupToolActions() +{ + if ( !actionGroupTools ) { + actionGroupTools = new TQActionGroup( this ); + actionGroupTools->setExclusive( TRUE ); + connect( actionGroupTools, TQT_SIGNAL( selected(TQAction*) ), + this, TQT_SLOT( toolSelected(TQAction*) ) ); + } + + actionPointerTool = new DesignerAction( i18n("Pointer"), createIconSet("designer_pointer.png"), + i18n("&Pointer"), Key_F2, + actionGroupTools, + TQString::number(POINTER_TOOL).latin1(), TRUE ); + actionPointerTool->setStatusTip( i18n("Selects the pointer tool") ); + actionPointerTool->setWhatsThis( whatsThisFrom( "Tools|Pointer" ) ); + + actionConnectTool = new DesignerAction( i18n("Connect Signal/Slots"), + createIconSet("designer_connecttool.png"), + i18n("&Connect Signal/Slots"), + singleProjectMode() ? 0 : Key_F3, + actionGroupTools, + TQString::number(CONNECT_TOOL).latin1(), TRUE ); + actionConnectTool->setStatusTip( i18n("Selects the connection tool") ); + actionConnectTool->setWhatsThis( whatsThisFrom( "Tools|Connect Signals and Slots" ) ); + + actionOrderTool = new DesignerAction( i18n("Tab Order"), createIconSet("designer_ordertool.png"), + i18n("Tab &Order"), Key_F4, + actionGroupTools, + TQString::number(ORDER_TOOL).latin1(), TRUE ); + actionOrderTool->setStatusTip( i18n("Selects the tab order tool") ); + actionOrderTool->setWhatsThis( whatsThisFrom( "Tools|Tab Order" ) ); + + actionBuddyTool = new DesignerAction( i18n( "Set Buddy" ), createIconSet( "designer_setbuddy.png" ), + i18n( "Set &Buddy" ), Key_F12, + actionGroupTools, TQString::number( BUDDY_TOOL ).latin1(), + TRUE ); + actionBuddyTool->setStatusTip( i18n( "Sets a buddy to a label" ) ); + actionBuddyTool->setWhatsThis( whatsThisFrom( "Tools|Set Buddy" ) ); + + TQToolBar *tb = new TQToolBar( this, "Tools" ); + tb->setCloseMode( TQDockWindow::Undocked ); + toolsToolBar = tb; + TQWhatsThis::add( tb, i18n( "<b>The Tools toolbar</b>%1" ).arg(i18n(toolbarHelp).arg("")) ); + + addToolBar( tb, i18n( "Tools" ), TQMainWindow::DockTop, FALSE ); + actionPointerTool->addTo( tb ); + if ( !singleProjectMode() ) + actionConnectTool->addTo( tb ); + actionOrderTool->addTo( tb ); + actionBuddyTool->addTo( tb ); + + TQPopupMenu *mmenu = new TQPopupMenu( this, "Tools" ); + toolsMenu = mmenu; + toolsMenuId = 100; + menubar->insertItem( i18n( "&Tools" ), mmenu, toolsMenuId ); + toolsMenuIndex = menubar->indexOf( toolsMenuId ); + actionPointerTool->addTo( mmenu ); + if ( !singleProjectMode() ) + actionConnectTool->addTo( mmenu ); + actionOrderTool->addTo( mmenu ); + actionBuddyTool->addTo( mmenu ); + mmenu->insertSeparator(); + + customWidgetToolBar = 0; + customWidgetMenu = 0; + + actionToolsCustomWidget = new DesignerAction( i18n("Custom Widgets"), + createIconSet( "designer_customwidget.png" ), + i18n("Edit &Custom Widgets..."), 0, TQT_TQOBJECT(this), 0 ); + actionToolsCustomWidget->setStatusTip( i18n("Opens a dialog to add and change " + "custom widgets") ); + actionToolsCustomWidget->setWhatsThis( whatsThisFrom( "Tools|Custom|Edit Custom" + "Widgets" ) ); + connect( actionToolsCustomWidget, TQT_SIGNAL( activated() ), + this, TQT_SLOT( toolsCustomWidget() ) ); + + for ( int j = 0; j < WidgetDatabase::numWidgetGroups(); ++j ) { + TQString grp = WidgetDatabase::widgetGroup( j ); + if ( !WidgetDatabase::isGroupVisible( grp ) || + WidgetDatabase::isGroupEmpty( grp ) ) + continue; + TQToolBar *tb = new TQToolBar( this, grp.latin1() ); + tb->setCloseMode( TQDockWindow::Undocked ); + widgetToolBars.append( tb ); + bool plural = grp[(int)grp.length()-1] == 's'; + if ( plural ) { + TQWhatsThis::add( tb, i18n( "<b>The %1</b>%2" ).arg(grp).arg(i18n(toolbarHelp). + arg( i18n(" Click on a button to insert a single widget, " + "or double click to insert multiple %1.") ).arg(grp)) ); + } else { + TQWhatsThis::add( tb, i18n( "<b>The %1 Widgets</b>%2" ).arg(grp).arg(i18n(toolbarHelp). + arg( i18n(" Click on a button to insert a single %1 widget, " + "or double click to insert multiple widgets.") ).arg(grp)) ); + } + addToolBar( tb, grp ); + tb->hide(); + TQPopupMenu *menu = new TQPopupMenu( this, grp.latin1() ); + mmenu->insertItem( grp, menu ); + + TQToolBar *tb2 = new TQToolBar( grp, 0, toolBox, FALSE, grp.latin1() ); + tb2->setFrameStyle( TQFrame::NoFrame ); + tb2->setOrientation( Qt::Vertical ); + tb2->setBackgroundMode( PaletteBase ); + toolBox->addItem( tb2, grp ); + + if ( grp == "Custom" ) { + if ( !customWidgetMenu ) + actionToolsCustomWidget->addTo( menu ); + else + menu->insertSeparator(); + customWidgetMenu = menu; + customWidgetToolBar = tb; + } + + for ( int i = 0; i < WidgetDatabase::count(); ++i ) { + if ( WidgetDatabase::group( i ) != grp ) + continue; // only widgets, i.e. not forms and temp stuff + WidgetAction* a = + new WidgetAction( grp, actionGroupTools, TQString::number( i ).latin1() ); + a->setToggleAction( TRUE ); + TQString atext = WidgetDatabase::className( i ); + if ( atext[0] == 'Q' ) + atext = atext.mid(1); + while ( atext.length() && atext[0] >= 'a' && atext[0] <= 'z' ) + atext = atext.mid(1); + if ( atext.isEmpty() ) + atext = WidgetDatabase::className( i ); + a->setText( atext ); + TQString ttip = WidgetDatabase::toolTip( i ); + a->setIconSet( WidgetDatabase::iconSet( i ) ); + a->setToolTip( ttip ); + if ( !WidgetDatabase::isWhatsThisLoaded() ) + WidgetDatabase::loadWhatsThis( documentationPath() ); + a->setStatusTip( i18n( "Insert a %1").arg(WidgetDatabase::className( i )) ); + + TQString whats = i18n("<b>A %1</b>").arg( WidgetDatabase::className( i ) ); + if ( !WidgetDatabase::whatsThis( i ).isEmpty() ) + whats += TQString("<p>%1</p>").arg(WidgetDatabase::whatsThis( i )); + a->setWhatsThis( whats+ i18n("<p>Double click on this tool to keep it selected.</p>") ); + + if ( grp != "KDE" ) + a->addTo( tb ); + a->addTo( menu ); + a->addTo( tb2 ); + if ( WidgetDatabase::isCommon( i ) ) { + a->addTo( commonWidgetsToolBar ); + commonWidgetsPage.append( a ); + } + } + TQWidget *w; + tb2->setStretchableWidget( ( w = new TQWidget( tb2 ) ) ); + w->setBackgroundMode( tb2->backgroundMode() ); + } + + if ( !customWidgetToolBar ) { + TQToolBar *tb = new TQToolBar( this, "Custom Widgets" ); + tb->setCloseMode( TQDockWindow::Undocked ); + TQWhatsThis::add( tb, i18n( "<b>The Custom Widgets toolbar</b>%1" + "<p>Click <b>Edit Custom Widgets...</b>" + "in the <b>Tools|Custom</b> menu to " + "add and change custom widgets</p>" ). + arg(i18n(toolbarHelp). + arg( i18n(" Click on the buttons to insert a single widget, " + "or double click to insert multiple widgets.") )) ); + addToolBar( tb, i18n( "Custom" ) ); + tb->hide(); + widgetToolBars.append( tb ); + customWidgetToolBar = tb; + TQPopupMenu *menu = new TQPopupMenu( this, "Custom Widgets" ); + mmenu->insertItem( "Custom", menu ); + customWidgetMenu = menu; + customWidgetToolBar->hide(); + actionToolsCustomWidget->addTo( customWidgetMenu ); + customWidgetMenu->insertSeparator(); + TQToolBar *tb2 = new TQToolBar( "Custom Widgets", 0, + toolBox, FALSE, "Custom Widgets" ); + tb2->setBackgroundMode(PaletteBase); + tb2->setOrientation( Qt::Vertical ); + tb2->setFrameStyle( TQFrame::NoFrame ); + toolBox->addItem( tb2, "Custom Widgets" ); + customWidgetToolBar2 = tb2; + } + + TQAction *a = new DesignerAction( i18n( "Configure Toolbox" ), i18n( "Configure Toolbox..." ), 0, TQT_TQOBJECT(this) ); + a->setStatusTip( i18n( "Opens a dialog to configure the common " + "widgets page of the toolbox") ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( toolsConfigure() ) ); + mmenu->insertSeparator(); + a->addTo( mmenu ); + resetTool(); +} + +void MainWindow::setupFileActions() +{ + TQToolBar* tb = new TQToolBar( this, "File" ); + tb->setCloseMode( TQDockWindow::Undocked ); + projectToolBar = tb; + + TQWhatsThis::add( tb, i18n( "<b>The File toolbar</b>%1" ).arg(i18n(toolbarHelp).arg("")) ); + addToolBar( tb, i18n( "File" ) ); + fileMenu = new TQPopupMenu( this, "File" ); + menubar->insertItem( i18n( "&File" ), fileMenu ); + + DesignerAction *a = 0; + + if ( !singleProject ) { + DesignerAction *a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + a->setText( i18n( "New" ) ); + a->setToolTip( i18n( "New dialog or file" ) ); + a->setMenuText( i18n( "&New..." ) ); + a->setIconSet( createIconSet("designer_filenew.png") ); + a->setAccel( CTRL + Key_N ); + a->setStatusTip( i18n( "Creates a new project, form or source file." ) ); + a->setWhatsThis( whatsThisFrom( "File|New" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileNew() ) ); + a->addTo( tb ); + a->addTo( fileMenu ); + actionNewFile = a; + } else { + actionGroupNew = new TQActionGroup( this, 0, FALSE ); + TQActionGroup* a = actionGroupNew; + ( (TQActionGroup*)a )->setUsesDropDown( TRUE ); + a->setText( i18n( "New" ) ); + a->setMenuText( i18n( "&New..." ) ); + a->setIconSet( createIconSet("designer_form.png") ); + a->setStatusTip( i18n( "Creates a new dialog or file" ) ); + a->setWhatsThis( whatsThisFrom( "File|New" ) ); + + TQAction *newForm = new DesignerAction( a, 0 ); + newForm->setText( i18n( "New Dialog" ) ); + newForm->setMenuText( i18n( "&Dialog..." ) ); + newForm->setIconSet( createIconSet("designer_form.png") ); + newForm->setAccel( CTRL + Key_N ); + newForm->setStatusTip( i18n( "Creates a new dialog." ) ); + connect( newForm, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileNewDialog() ) ); + + DesignerAction *newFile = new DesignerAction( TQT_TQOBJECT(a), 0 ); + newFile->setText( i18n( "New File" ) ); + newFile->setMenuText( i18n( "&File..." ) ); + newFile->setIconSet( createIconSet("designer_filenew.png") ); + newFile->setAccel( ALT + Key_N ); + newFile->setStatusTip( i18n( "Creates a new file." ) ); + connect( newFile, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileNewFile() ) ); + actionNewFile = newFile; + + a->addTo( tb ); + a->addTo( fileMenu ); + + fileMenu->insertSeparator(); + } + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + a->setText( i18n( "Open" ) ); + a->setMenuText( i18n( "&Open..." ) ); + a->setIconSet( createIconSet("designer_fileopen.png") ); + a->setAccel( CTRL + Key_O ); + a->setStatusTip( i18n( "Opens an existing project, form or source file ") ); + a->setWhatsThis( whatsThisFrom( "File|Open" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileOpen() ) ); + if ( !singleProject ) { + a->addTo( tb ); + a->addTo( fileMenu ); + fileMenu->insertSeparator(); + } + + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + actionFileClose = a; + a->setText( i18n( "Close" ) ); + a->setMenuText( i18n( "&Close" ) ); + a->setStatusTip( i18n( "Closes the current project or document" ) ); + a->setWhatsThis(whatsThisFrom( "File|Close" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileClose() ) ); + connect( this, TQT_SIGNAL( hasActiveWindowOrProject(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + if ( !singleProject ) { + a->addTo( fileMenu ); + fileMenu->insertSeparator(); + } + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + actionFileSave = a; + a->setText( i18n( "Save" ) ); + a->setMenuText( i18n( "&Save" ) ); + a->setIconSet( createIconSet("designer_filesave.png") ); + a->setAccel( CTRL + Key_S ); + a->setStatusTip( i18n( "Saves the current project or document" ) ); + a->setWhatsThis(whatsThisFrom( "File|Save" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileSave() ) ); + connect( this, TQT_SIGNAL( hasActiveWindowOrProject(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + a->addTo( tb ); + a->addTo( fileMenu ); + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + actionFileSaveAs = a; + a->setText( i18n( "Save As" ) ); + a->setMenuText( i18n( "Save &As..." ) ); + a->setStatusTip( i18n( "Saves the current form with a new filename" ) ); + a->setWhatsThis( whatsThisFrom( "File|Save As" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileSaveAs() ) ); + connect( this, TQT_SIGNAL( hasActiveWindow(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + if ( !singleProject ) + a->addTo( fileMenu ); + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + actionFileSaveAll = a; + a->setText( i18n( "Save All" ) ); + a->setMenuText( i18n( "Sa&ve All" ) ); + a->setStatusTip( i18n( "Saves all open documents" ) ); + a->setWhatsThis( whatsThisFrom( "File|Save All" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileSaveAll() ) ); + connect( this, TQT_SIGNAL( hasActiveWindowOrProject(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + if ( !singleProject ) { + a->addTo( fileMenu ); + fileMenu->insertSeparator(); + } + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + a->setText( i18n( "Create Template" ) ); + a->setMenuText( i18n( "Create &Template..." ) ); + a->setStatusTip( i18n( "Creates a new template" ) ); + a->setWhatsThis( whatsThisFrom( "File|Create Template" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileCreateTemplate() ) ); + if ( !singleProject ) + a->addTo( fileMenu ); + + if ( !singleProject ) + fileMenu->insertSeparator(); + + recentlyFilesMenu = new TQPopupMenu( this ); + recentlyProjectsMenu = new TQPopupMenu( this ); + + if ( !singleProject ) { + fileMenu->insertItem( i18n( "Recently Opened Files " ), recentlyFilesMenu ); + fileMenu->insertItem( i18n( "Recently Opened Projects" ), recentlyProjectsMenu ); + } + + connect( recentlyFilesMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( setupRecentlyFilesMenu() ) ); + connect( recentlyProjectsMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( setupRecentlyProjectsMenu() ) ); + connect( recentlyFilesMenu, TQT_SIGNAL( activated( int ) ), + this, TQT_SLOT( recentlyFilesMenuActivated( int ) ) ); + connect( recentlyProjectsMenu, TQT_SIGNAL( activated( int ) ), + this, TQT_SLOT( recentlyProjectsMenuActivated( int ) ) ); + + if ( !singleProject ) + fileMenu->insertSeparator(); + + a = new DesignerAction( TQT_TQOBJECT(this), 0 ); + actionFileExit = a; + if ( !singleProjectMode() ) { + a->setText( i18n( "Exit" ) ); + a->setMenuText( i18n( "E&xit" ) ); + a->setStatusTip( i18n( "Quits the application and prompts to save any changed forms, source files or project settings" ) ); + a->setWhatsThis( whatsThisFrom( "File|Exit" ) ); + } else { + a->setText( i18n( "Close" ) ); + a->setMenuText( i18n( "&Close" ) ); + } + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( fileQuit() ) ); + a->addTo( fileMenu ); +} + +void MainWindow::setupProjectActions() +{ + projectMenu = new TQPopupMenu( this, "Project" ); + menubar->insertItem( i18n( "Pr&oject" ), projectMenu ); + + TQActionGroup *ag = new TQActionGroup( this, 0 ); + ag->setText( i18n( "Active Project" ) ); + ag->setMenuText( i18n( "Active Project" ) ); + ag->setExclusive( TRUE ); + ag->setUsesDropDown( TRUE ); + connect( ag, TQT_SIGNAL( selected( TQAction * ) ), TQT_TQOBJECT(this), TQT_SLOT( projectSelected( TQAction * ) ) ); + connect( ag, TQT_SIGNAL( selected( TQAction * ) ), TQT_TQOBJECT(this), TQT_SIGNAL( projectChanged() ) ); + DesignerAction *a = new DesignerAction( i18n( "<No Project>" ), i18n( "<No Project>" ), 0, ag, 0, TRUE ); + eProject = new Project( "", i18n( "<No Project>" ), projectSettingsPluginManager, TRUE ); + projects.insert( a, eProject ); + a->setOn( TRUE ); + ag->addTo( projectMenu ); + ag->addTo( projectToolBar ); + actionGroupProjects = ag; + + if ( !singleProject ) + projectMenu->insertSeparator(); + + a = new DesignerAction( i18n( "Add File" ), TQPixmap(), i18n( "&Add File..." ), 0, TQT_TQOBJECT(this), 0 ); + actionProjectAddFile = a; + a->setStatusTip( i18n("Adds a file to the current project") ); + a->setWhatsThis( whatsThisFrom( "Project|Add File" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( projectInsertFile() ) ); + a->setEnabled( FALSE ); + connect( this, TQT_SIGNAL( hasNonDummyProject(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + if ( !singleProject ) + a->addTo( projectMenu ); + + actionEditPixmapCollection = new DesignerAction( i18n( "Image Collection..." ), TQPixmap(), + i18n( "&Image Collection..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditPixmapCollection->setStatusTip( i18n("Opens a dialog for editing the current project's image collection") ); + actionEditPixmapCollection->setWhatsThis( whatsThisFrom( "Project|Image Collection" ) ); + connect( actionEditPixmapCollection, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editPixmapCollection() ) ); + actionEditPixmapCollection->setEnabled( FALSE ); + connect( this, TQT_SIGNAL( hasNonDummyProject(bool) ), actionEditPixmapCollection, TQT_SLOT( setEnabled(bool) ) ); + actionEditPixmapCollection->addTo( projectMenu ); + +#ifndef TQT_NO_SQL + actionEditDatabaseConnections = new DesignerAction( i18n( "Database Connections..." ), TQPixmap(), + i18n( "&Database Connections..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditDatabaseConnections->setStatusTip( i18n("Opens a dialog for editing the current project's database connections") ); + actionEditDatabaseConnections->setWhatsThis( whatsThisFrom( "Project|Database Connections" ) ); + connect( actionEditDatabaseConnections, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editDatabaseConnections() ) ); + //actionEditDatabaseConnections->setEnabled( FALSE ); + //connect( this, TQT_SIGNAL( hasNonDummyProject(bool) ), actionEditDatabaseConnections, TQT_SLOT( setEnabled(bool) ) ); + if ( !singleProject ) + actionEditDatabaseConnections->addTo( projectMenu ); +#endif + + actionEditProjectSettings = new DesignerAction( i18n( "Project Settings..." ), TQPixmap(), + i18n( "&Project Settings..." ), 0, TQT_TQOBJECT(this), 0 ); + actionEditProjectSettings->setStatusTip( i18n("Opens a dialog to change the project's settings") ); + actionEditProjectSettings->setWhatsThis( whatsThisFrom( "Project|Project Settings" ) ); + connect( actionEditProjectSettings, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( editProjectSettings() ) ); + actionEditProjectSettings->setEnabled( FALSE ); + connect( this, TQT_SIGNAL( hasNonDummyProject(bool) ), actionEditProjectSettings, TQT_SLOT( setEnabled(bool) ) ); + actionEditProjectSettings->addTo( projectMenu ); + +} + +void MainWindow::setupPreviewActions() +{ + DesignerAction* a = 0; + TQPopupMenu *menu = new TQPopupMenu( this, "Preview" ); + layoutMenu = menu; + menubar->insertItem( i18n( "&Preview" ), menu, toolsMenuId + 2 ); + + a = new DesignerAction( i18n( "Preview Form" ), TQPixmap(), i18n( "Preview &Form" ), 0, TQT_TQOBJECT(this), 0 ); + actionPreview = a; + a->setAccel( CTRL + Key_T ); + a->setStatusTip( i18n("Opens a preview") ); + a->setWhatsThis( whatsThisFrom( "Preview|Preview Form" ) ); + connect( a, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( previewForm() ) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + a->addTo( menu ); + + menu->insertSeparator(); + + TQSignalMapper *mapper = new TQSignalMapper( TQT_TQOBJECT(this) ); + connect( mapper, TQT_SIGNAL(mapped(const TQString&)), TQT_TQOBJECT(this), TQT_SLOT(previewForm(const TQString&)) ); + TQStringList styles = TQStyleFactory::keys(); + for ( TQStringList::Iterator it = styles.begin(); it != styles.end(); ++it ) { + TQString info; + if ( *it == "Motif" ) + info = i18n( "The preview will use the Motif look and feel which is used as the default style on most UNIX systems." ); + else if ( *it == "Windows" ) + info = i18n( "The preview will use the Windows look and feel." ); + else if ( *it == "Platinum" ) + info = i18n( "The preview will use the Platinum look and feel which is similar to the Macintosh GUI style." ); + else if ( *it == "CDE" ) + info = i18n( "The preview will use the CDE look and feel which is similar to some versions of the Common Desktop Environment." ); + else if ( *it == "SGI" ) + info = i18n( "The preview will use the Motif look and feel which is used as the default style on SGI systems." ); + else if ( *it == "MotifPlus" ) + info = i18n( "The preview will use the advanced Motif look and feel used by the GIMP toolkit (GTK) on Linux." ); + + a = new DesignerAction( i18n( "Preview Form in %1 Style" ).arg( *it ), TQPixmap(), + i18n( "... in %1 Style" ).arg( *it ), 0, TQT_TQOBJECT(this), 0 ); + a->setStatusTip( i18n("Opens a preview in %1 style").arg( *it ) ); + a->setWhatsThis( i18n("<b>Open a preview in %1 style.</b>" + "<p>Use the preview to test the design and " + "signal-slot connections of the current form. %2</p>").arg( *it ).arg( info ) ); + mapper->setMapping( a, *it ); + connect( a, TQT_SIGNAL(activated()), mapper, TQT_SLOT(map()) ); + connect( this, TQT_SIGNAL( hasActiveForm(bool) ), a, TQT_SLOT( setEnabled(bool) ) ); + a->addTo( menu ); + } +} + +void MainWindow::setupWindowActions() +{ +/* static bool windowActionsSetup = FALSE; + if ( !windowActionsSetup ) { + windowActionsSetup = TRUE; +*/ + actionWindowTile = new DesignerAction( i18n( "Tile" ), i18n( "&Tile" ), 0, TQT_TQOBJECT(this) ); + actionWindowTile->setStatusTip( i18n("Tiles the windows so that they are all visible") ); + actionWindowTile->setWhatsThis( whatsThisFrom( "Window|Tile" ) ); + connect( actionWindowTile, TQT_SIGNAL( activated() ), qworkspace, TQT_SLOT( tile() ) ); + actionWindowCascade = new DesignerAction( i18n( "Cascade" ), i18n( "&Cascade" ), 0, TQT_TQOBJECT(this) ); + actionWindowCascade->setStatusTip( i18n("Cascades the windows so that all their title bars are visible") ); + actionWindowCascade->setWhatsThis( whatsThisFrom( "Window|Cascade" ) ); + connect( actionWindowCascade, TQT_SIGNAL( activated() ), qworkspace, TQT_SLOT( cascade() ) ); + + actionWindowClose = new DesignerAction( i18n( "Close" ), i18n( "Cl&ose" ), CTRL + Key_F4, TQT_TQOBJECT(this) ); + actionWindowClose->setStatusTip( i18n( "Closes the active window") ); + actionWindowClose->setWhatsThis( whatsThisFrom( "Window|Close" ) ); + connect( actionWindowClose, TQT_SIGNAL( activated() ), qworkspace, TQT_SLOT( closeActiveWindow() ) ); + + actionWindowCloseAll = new DesignerAction( i18n( "Close All" ), i18n( "Close Al&l" ), 0, TQT_TQOBJECT(this) ); + actionWindowCloseAll->setStatusTip( i18n( "Closes all form windows") ); + actionWindowCloseAll->setWhatsThis( whatsThisFrom( "Window|Close All" ) ); + connect( actionWindowCloseAll, TQT_SIGNAL( activated() ), qworkspace, TQT_SLOT( closeAllWindows() ) ); + + actionWindowNext = new DesignerAction( i18n( "Next" ), i18n( "Ne&xt" ), CTRL + Key_F6, TQT_TQOBJECT(this) ); + actionWindowNext->setStatusTip( i18n( "Activates the next window" ) ); + actionWindowNext->setWhatsThis( whatsThisFrom( "Window|Next" ) ); + connect( actionWindowNext, TQT_SIGNAL( activated() ), qworkspace, TQT_SLOT( activateNextWindow() ) ); + + actionWindowPrevious = new DesignerAction( i18n( "Previous" ), i18n( "Pre&vious" ), CTRL + SHIFT + Key_F6, TQT_TQOBJECT(this) ); + actionWindowPrevious->setStatusTip( i18n( "Activates the previous window" ) ); + actionWindowPrevious->setWhatsThis( whatsThisFrom( "Window|Previous" ) ); + connect( actionWindowPrevious, TQT_SIGNAL( activated() ), qworkspace, TQT_SLOT( activatePreviousWindow() ) ); + // } + + if ( !windowMenu ) { + windowMenu = new TQPopupMenu( this, "Window" ); + menubar->insertItem( i18n( "&Window" ), windowMenu ); + connect( windowMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( setupWindowActions() ) ); + } else { + windowMenu->clear(); + } + + actionWindowClose->addTo( windowMenu ); + actionWindowCloseAll->addTo( windowMenu ); + windowMenu->insertSeparator(); + actionWindowNext->addTo( windowMenu ); + actionWindowPrevious->addTo( windowMenu ); + windowMenu->insertSeparator(); + actionWindowTile->addTo( windowMenu ); + actionWindowCascade->addTo( windowMenu ); + windowMenu->insertSeparator(); + windowMenu->insertItem( i18n( "Vie&ws" ), createDockWindowMenu( NoToolBars ) ); + windowMenu->insertItem( i18n( "Tool&bars" ), createDockWindowMenu( OnlyToolBars ) ); + TQWidgetList windows = qworkspace->windowList(); + if ( windows.count() && formWindow() ) + windowMenu->insertSeparator(); + int j = 0; + for ( int i = 0; i < int( windows.count() ); ++i ) { + TQWidget *w = windows.at( i ); + if ( !::tqqt_cast<FormWindow*>(w) && !::tqqt_cast<SourceEditor*>(w) ) + continue; + if ( ::tqqt_cast<FormWindow*>(w) && ( ( (FormWindow*)w )->isFake() ) ) + continue; + j++; + TQString itemText; + if ( j < 10 ) + itemText = TQString("&%1 ").arg( j ); + if ( ::tqqt_cast<FormWindow*>(w) ) + itemText += w->name(); + else + itemText += w->caption(); + + int id = windowMenu->insertItem( itemText, TQT_TQOBJECT(this), TQT_SLOT( windowsMenuActivated( int ) ) ); + windowMenu->setItemParameter( id, i ); + windowMenu->setItemChecked( id, qworkspace->activeWindow() == windows.at( i ) ); + } +} + +void MainWindow::setupHelpActions() +{ + actionHelpContents = new DesignerAction( i18n( "Contents" ), i18n( "&Contents" ), Key_F1, TQT_TQOBJECT(this), 0 ); + actionHelpContents->setStatusTip( i18n("Opens the online help") ); + actionHelpContents->setWhatsThis( whatsThisFrom( "Help|Contents" ) ); + connect( actionHelpContents, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( helpContents() ) ); + + actionHelpManual = new DesignerAction( i18n( "Manual" ), i18n( "&Manual" ), CTRL + Key_M, TQT_TQOBJECT(this), 0 ); + actionHelpManual->setStatusTip( i18n("Opens the TQt Designer manual") ); + actionHelpManual->setWhatsThis( whatsThisFrom( "Help|Manual" ) ); + connect( actionHelpManual, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( helpManual() ) ); + + actionHelpAbout = new DesignerAction( i18n("About"), TQPixmap(), i18n("&About"), 0, TQT_TQOBJECT(this), 0 ); + actionHelpAbout->setStatusTip( i18n("Displays information about TQt Designer") ); + actionHelpAbout->setWhatsThis( whatsThisFrom( "Help|About" ) ); + connect( actionHelpAbout, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( helpAbout() ) ); + + actionHelpAboutTQt = new DesignerAction( i18n("About TQt"), TQPixmap(), i18n("About &TQt"), 0, TQT_TQOBJECT(this), 0 ); + actionHelpAboutTQt->setStatusTip( i18n("Displays information about the TQt Toolkit") ); + actionHelpAboutTQt->setWhatsThis( whatsThisFrom( "Help|About TQt" ) ); + connect( actionHelpAboutTQt, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( helpAboutTQt() ) ); + +#if 0 //defined(TQT_NON_COMMERCIAL) + // ### not used anymore -- should be deleted? + actionHelpRegister = new DesignerAction( i18n("Register TQt"), TQPixmap(), i18n("&Register TQt..."), 0, TQT_TQOBJECT(this), 0 ); + actionHelpRegister->setStatusTip( i18n("Opens a web browser at the evaluation form on www.trolltech.com") ); + actionHelpRegister->setWhatsThis( i18n("Register with Trolltech") ); + connect( actionHelpRegister, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( helpRegister() ) ); +#endif + + actionHelpWhatsThis = new DesignerAction( i18n("What's This?"), TQIconSet( whatsthis_image, whatsthis_image ), + i18n("What's This?"), SHIFT + Key_F1, TQT_TQOBJECT(this), 0 ); + actionHelpWhatsThis->setStatusTip( i18n("\"What's This?\" context sensitive help") ); + actionHelpWhatsThis->setWhatsThis( whatsThisFrom( "Help|What's This?" ) ); + connect( actionHelpWhatsThis, TQT_SIGNAL( activated() ), TQT_TQOBJECT(this), TQT_SLOT( whatsThis() ) ); + +/* TQToolBar *tb = new TQToolBar( this, "Help" ); + tb->setCloseMode( TQDockWindow::Undocked ); + TQWhatsThis::add( tb, i18n( "<b>The Help toolbar</b>%1" ).arg(i18n(toolbarHelp).arg("") )); + addToolBar( tb, i18n( "Help" ) ); + actionHelpWhatsThis->addTo( tb );*/ + + TQPopupMenu *menu = new TQPopupMenu( this, "Help" ); + menubar->insertSeparator(); + menubar->insertItem( i18n( "&Help" ), menu ); + actionHelpContents->addTo( menu ); + actionHelpManual->addTo( menu ); + menu->insertSeparator(); + actionHelpAbout->addTo( menu ); + actionHelpAboutTQt->addTo( menu ); +#if 0 //defined(TQT_NON_COMMERCIAL) + // ### not used anymore -- should be deleted? + actionHelpRegister->addTo( menu ); +#endif + + menu->insertSeparator(); + actionHelpWhatsThis->addTo( menu ); +} + +void MainWindow::fileNew() +{ + statusMessage( i18n( "Create a new project, form or source file...") ); + NewForm dlg( this, projectNames(), currentProject->projectName(), templatePath() ); + dlg.exec(); + statusBar()->clear(); +} + +void MainWindow::fileNewDialog() +{ + static int forms = 0; + TQString n = "Dialog" + TQString::number( ++forms ); + while ( currentProject->findFormFile( n + ".ui" ) ) + n = "Dialog" + TQString::number( ++forms ); + FormWindow *fw = 0; + FormFile *ff = new FormFile( n + ".ui", FALSE, currentProject ); + fw = new FormWindow( ff, MainWindow::self, MainWindow::self->qWorkspace(), n ); + ff->setModified( TRUE ); + currentProject->setModified( TRUE ); + workspace()->update(); + fw->setProject( currentProject ); + MetaDataBase::addEntry( TQT_TQOBJECT(fw) ); + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQDIALOG_OBJECT_NAME_STRING ), fw, n.latin1() ); + fw->setMainContainer( w ); + fw->setCaption( n ); + fw->resize( 600, 480 ); + insertFormWindow( fw ); + fw->killAccels( TQT_TQOBJECT(fw) ); + fw->project()->setModified( TRUE ); + fw->setFocus(); + fw->setSavePixmapInProject( TRUE ); + fw->setSavePixmapInline( FALSE ); +} + +void MainWindow::fileNewFile() +{ + TQString name = TQInputDialog::getText( i18n( "Name of File" ), i18n( "Enter the name of the new source file:" ) ); + if ( name.isEmpty() ) + return; + if ( name.right( 3 ) != ".qs" ) + name += ".qs"; + SourceFile *f = new SourceFile( name, FALSE, currentProject ); + MainWindow::self->editSource( f ); + f->setModified( TRUE ); + currentProject->setModified( TRUE ); + workspace()->update(); +} + +void MainWindow::fileQuit() +{ + close(); + if ( !singleProjectMode() ) + tqApp->closeAllWindows(); +} + +void MainWindow::fileClose() +{ + if ( !currentProject->isDummy() ) { + fileCloseProject(); + } else { + TQWidget *w = qworkspace->activeWindow(); + if ( w ) { + if ( ::tqqt_cast<FormWindow*>(w) ) + ( (FormWindow*)w )->formFile()->close(); + else if ( ::tqqt_cast<SourceEditor*>(w) ) + ( (SourceEditor*)w )->close(); + } + } +} + + +void MainWindow::fileCloseProject() +{ + if ( currentProject->isDummy() ) + return; + Project *pro = currentProject; + TQAction* a = 0; + TQAction* lastValid = 0; + for ( TQMap<TQAction*, Project* >::Iterator it = projects.begin(); it != projects.end(); ++it ) { + if ( it.data() == pro ) { + a = it.key(); + if ( lastValid ) + break; + } + lastValid = it.key(); + } + if ( a ) { + if ( pro->isModified() ) { + switch ( TQMessageBox::warning( this, i18n( "Save Project Settings" ), + i18n( "Save changes to '%1'?" ).arg( pro->fileName() ), + i18n( "&Yes" ), i18n( "&No" ), i18n( "&Cancel" ), 0, 2 ) ) { + case 0: // save + pro->save(); + break; + case 1: // don't save + break; + case 2: // cancel + return; + default: + break; + } + } + + TQWidgetList windows = qWorkspace()->windowList(); + qWorkspace()->blockSignals( TRUE ); + TQWidgetListIt wit( windows ); + while ( wit.current() ) { + TQWidget *w = wit.current(); + ++wit; + if ( ::tqqt_cast<FormWindow*>(w) ) { + if ( ( (FormWindow*)w )->project() == pro ) { + if ( ( (FormWindow*)w )->formFile()->editor() ) + windows.removeRef( ( (FormWindow*)w )->formFile()->editor() ); + if ( !( (FormWindow*)w )->formFile()->close() ) + return; + } + } else if ( ::tqqt_cast<SourceEditor*>(w) ) { + if ( !( (SourceEditor*)w )->close() ) + return; + } + } + hierarchyView->clear(); + windows = qWorkspace()->windowList(); + qWorkspace()->blockSignals( FALSE ); + actionGroupProjects->removeChild( a ); + projects.remove( a ); + delete a; + currentProject = 0; + if ( lastValid ) { + projectSelected( lastValid ); + statusMessage( i18n( "Selected project '%1'" ).arg( currentProject->projectName() ) ); + } + if ( !windows.isEmpty() ) { + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + if ( !::tqqt_cast<FormWindow*>(w) ) + continue; + w->setFocus(); + activeWindowChanged( w ); + break; + } + } else { + emit hasActiveWindow( FALSE ); + emit hasActiveForm( FALSE ); + updateUndoRedo( FALSE, FALSE, TQString(), TQString() ); + } + } +} + +void MainWindow::fileOpen() // as called by the menu +{ + fileOpen( "", "", "", FALSE ); +} + +void MainWindow::projectInsertFile() +{ + fileOpen( "", "" ); +} + +void MainWindow::fileOpen( const TQString &filter, const TQString &extension, const TQString &fn, bool inProject ) +{ + statusMessage( i18n( "Open a file...") ); + + TQPluginManager<ImportFilterInterface> manager( IID_ImportFilter, TQApplication::libraryPaths(), pluginDirectory() ); + + Project* project = inProject ? currentProject : eProject; + + TQStringList additionalSources; + + { + TQStringList filterlist; + if ( filter.isEmpty() ) { + if ( !inProject ) + filterlist << i18n( "*.ui *.pro|Designer Files" ); + filterlist << i18n( "*.ui|TQt User-Interface Files" ); + if ( !inProject ) + filterlist << i18n( "*.pro|TQMAKE Project Files" ); + TQStringList list = manager.featureList(); + for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) + filterlist << *it; + LanguageInterface *iface = MetaDataBase::languageInterface( project->language() ); + if ( iface ) { + filterlist += iface->fileFilterList(); + additionalSources += iface->fileExtensionList(); + } + filterlist << i18n( "*|All Files" ); + } else { + filterlist << filter; + } + + TQString filters = filterlist.join( "\n" ); + + TQStringList filenames; + if ( fn.isEmpty() ) { + if ( !inProject ) { + TQString f = KFileDialog::getOpenFileName( TQString(), filters, this, /*0,*/ + i18n("Open" )/*, &lastOpenFilter */); + filenames << f; + } else { + filenames = KFileDialog::getOpenFileNames( TQString(), filters, this, /*0,*/ + i18n("Add")/*, &lastOpenFilter */); + } + } else { + filenames << fn; + } + + for ( TQStringList::Iterator fit = filenames.begin(); fit != filenames.end(); ++fit ) { + TQString filename = *fit; + if ( !filename.isEmpty() ) { + TQFileInfo fi( filename ); + + if ( fi.extension( FALSE ) == "pro" && ( extension.isEmpty() || extension.find( ";pro" ) != -1 ) ) { + addRecentlyOpened( filename, recentlyProjects ); + openProject( filename ); + } else if ( fi.extension( FALSE ) == "ui" && ( extension.isEmpty() || extension.find( ";ui" ) != -1 ) ) { + if ( !inProject ) + setCurrentProject( eProject ); + openFormWindow( filename ); + addRecentlyOpened( filename, recentlyFiles ); + } else if ( !extension.isEmpty() && extension.find( ";" + fi.extension( FALSE ) ) != -1 || + additionalSources.find( fi.extension( FALSE ) ) != additionalSources.end() ) { + SourceFile *sf = project->findSourceFile( project->makeRelative( filename ) ); + if ( !sf ) + sf = new SourceFile( project->makeRelative( filename ), FALSE, project ); + editSource( sf ); + } else if ( extension.isEmpty() ) { + TQString filter; + for ( TQStringList::Iterator it2 = filterlist.begin(); it2 != filterlist.end(); ++it2 ) { + if ( (*it2).contains( "." + fi.extension( FALSE ), FALSE ) ) { + filter = *it2; + break; + } + } + + ImportFilterInterface* iface = 0; + manager.queryInterface( filter, &iface ); + if ( !iface ) { + statusMessage( i18n( "No import filter is available to import '%1'"). + arg( filename )/*, 3000*/ ); + return; + } + statusMessage( i18n( "Importing '%1' using import filter ...").arg( filename ) ); + TQStringList list = iface->import( filter, filename ); + iface->release(); + if ( list.isEmpty() ) { + statusMessage( i18n( "Nothing to load in '%1'").arg( filename )/*, 3000*/ ); + return; + } + if ( !inProject ) + setCurrentProject( eProject ); + addRecentlyOpened( filename, recentlyFiles ); + for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + openFormWindow( *it, FALSE ); + TQFile::remove( *it ); + } + statusBar()->clear(); + } + } + } + } +} + +FormWindow *MainWindow::openFormWindow( const TQString &filename, bool validFileName, FormFile *ff ) +{ + if ( filename.isEmpty() ) + return 0; + + bool makeNew = FALSE; + + if ( !TQFile::exists( filename ) ) { + makeNew = TRUE; + } else { + TQFile f( filename ); + f.open( IO_ReadOnly ); + TQTextStream ts( &f ); + makeNew = ts.read().length() < 2; + } + if ( makeNew ) { + fileNew(); + if ( formWindow() ) + formWindow()->setFileName( filename ); + return formWindow(); + } + + statusMessage( i18n( "Reading file '%1'...").arg( filename ) ); + FormFile *ff2 = currentProject->findFormFile( currentProject->makeRelative(filename) ); + if ( ff2 && ff2->formWindow() ) { + ff2->formWindow()->setFocus(); + return ff2->formWindow(); + } + + if ( ff2 ) + ff = ff2; + TQApplication::setOverrideCursor( WaitCursor ); + Resource resource( this ); + if ( !ff ) + ff = new FormFile( currentProject->makeRelative( filename ), FALSE, currentProject ); + bool b = resource.load( ff ) && (FormWindow*)resource.widget(); + if ( !validFileName && resource.widget() ) + ( (FormWindow*)resource.widget() )->setFileName( TQString() ); + TQApplication::restoreOverrideCursor(); + if ( b ) { + rebuildCustomWidgetGUI(); + statusMessage( i18n( "Loaded file '%1'").arg( filename )/*, 3000 */); + } else { + statusMessage( i18n( "Failed to load file '%1'").arg( filename )/*, 5000 */); + TQMessageBox::information( this, i18n("Load File"), i18n("Could not load file '%1'.").arg( filename ) ); + delete ff; + } + return (FormWindow*)resource.widget(); +} + +bool MainWindow::fileSave() +{ + + if ( !currentProject->isDummy() ) + return fileSaveProject(); + return fileSaveForm(); +} + +bool MainWindow::fileSaveForm() +{ + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( TQT_BASE_OBJECT(e->object()) == formWindow() || e == qWorkspace()->activeWindow() ) { + e->save(); + } + } + + FormWindow *fw = 0; + + TQWidget *w = qWorkspace()->activeWindow(); + if ( w ) { + if ( ::tqqt_cast<SourceEditor*>(w) ) { + SourceEditor *se = (SourceEditor*)w; + if ( se->formWindow() ) + fw = se->formWindow(); + else if ( se->sourceFile() ) { + se->sourceFile()->save(); + return TRUE; + } + } + } + + if ( !fw ) + fw = formWindow(); + if ( !fw || !fw->formFile()->save() ) + return FALSE; + TQApplication::restoreOverrideCursor(); + return TRUE; +} + +bool MainWindow::fileSaveProject() +{ + currentProject->save(); + statusMessage( i18n( "Project '%1' saved.").arg( currentProject->projectName() )/*, 3000 */); + return TRUE; +} + +bool MainWindow::fileSaveAs() +{ + statusMessage( i18n( "Enter a filename..." ) ); + + TQWidget *w = qworkspace->activeWindow(); + if ( !w ) + return TRUE; + if ( ::tqqt_cast<FormWindow*>(w) ) + return ( (FormWindow*)w )->formFile()->saveAs(); + else if ( ::tqqt_cast<SourceEditor*>(w) ) + return ( (SourceEditor*)w )->saveAs(); + return FALSE; +} + +void MainWindow::fileSaveAll() +{ + for ( TQMap<TQAction*, Project* >::Iterator it = projects.begin(); it != projects.end(); ++it ) + (*it)->save(); +} + +void MainWindow::fileCreateTemplate() +{ + CreateTemplate dia( this, 0, TRUE ); + + int i = 0; + for ( i = 0; i < WidgetDatabase::count(); ++i ) { + if ( WidgetDatabase::isForm( i ) && WidgetDatabase::group( i ) != "Temp") { + dia.listClass->insertItem( WidgetDatabase::className( i ) ); + } + } + for ( i = 0; i < WidgetDatabase::count(); ++i ) { + if ( WidgetDatabase::isContainer( i ) && !WidgetDatabase::isForm(i) && + WidgetDatabase::className( i ) != TQTABWIDGET_OBJECT_NAME_STRING && WidgetDatabase::group( i ) != "Temp" ) { + dia.listClass->insertItem( WidgetDatabase::className( i ) ); + } + } + + TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); + for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { + if ( w->isContainer ) + dia.listClass->insertItem( w->className ); + } + + dia.editName->setText( i18n( "NewTemplate" ) ); + connect( dia.buttonCreate, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( createNewTemplate() ) ); + dia.exec(); +} + +void MainWindow::createNewTemplate() +{ + CreateTemplate *dia = (CreateTemplate*)TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->parent(); + TQString fn = dia->editName->text(); + TQString cn = dia->listClass->currentText(); + if ( fn.isEmpty() || cn.isEmpty() ) { + TQMessageBox::information( this, i18n( "Create Template" ), i18n( "Could not create the template." ) ); + return; + } + + TQStringList templRoots; + const char *qtdir = getenv( "QTDIR" ); + if(qtdir) + templRoots << qtdir; + templRoots << tqInstallPathData(); + if(qtdir) //try the tools/designer directory last! + templRoots << (TQString(qtdir) + "/tools/designer"); + TQFile f; + for ( TQStringList::Iterator it = templRoots.begin(); it != templRoots.end(); ++it ) { + if ( TQFile::exists( (*it) + "/templates/" )) { + TQString tmpfn = (*it) + "/templates/" + fn + ".ui"; + f.setName(tmpfn); + if(f.open(IO_WriteOnly)) + break; + } + } + if ( !f.isOpen() ) { + TQMessageBox::information( this, i18n( "Create Template" ), i18n( "Could not create the template." ) ); + return; + } + TQTextStream ts( &f ); + + ts << "<!DOCTYPE UI><UI>" << endl; + ts << "<widget>" << endl; + ts << "<class>" << cn << "</class>" << endl; + ts << "<property stdset=\"1\">" << endl; + ts << " <name>name</name>" << endl; + ts << " <cstring>" << cn << "Form</cstring>" << endl; + ts << "</property>" << endl; + ts << "<property stdset=\"1\">" << endl; + ts << " <name>geometry</name>" << endl; + ts << " <rect>" << endl; + ts << " <width>300</width>" << endl; + ts << " <height>400</height>" << endl; + ts << " </rect>" << endl; + ts << "</property>" << endl; + ts << "</widget>" << endl; + ts << "</UI>" << endl; + + dia->editName->setText( i18n( "NewTemplate" ) ); + + f.close(); +} + +void MainWindow::editUndo() +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (SourceEditor*)qWorkspace()->activeWindow() )->editUndo(); + return; + } + if ( formWindow() ) + formWindow()->undo(); +} + +void MainWindow::editRedo() +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (SourceEditor*)qWorkspace()->activeWindow() )->editRedo(); + return; + } + if ( formWindow() ) + formWindow()->redo(); +} + +void MainWindow::editCut() +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (SourceEditor*)qWorkspace()->activeWindow() )->editCut(); + return; + } + editCopy(); + editDelete(); +} + +void MainWindow::editCopy() +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (SourceEditor*)qWorkspace()->activeWindow() )->editCopy(); + return; + } + if ( formWindow() ) + tqApp->clipboard()->setText( formWindow()->copy() ); +} + +void MainWindow::editPaste() +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (SourceEditor*)qWorkspace()->activeWindow() )->editPaste(); + return; + } + if ( !formWindow() ) + return; + + TQWidget *w = formWindow()->mainContainer(); + TQWidgetList l( formWindow()->selectedWidgets() ); + if ( l.count() == 1 ) { + w = l.first(); + if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout || + ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) ) && + w != formWindow()->mainContainer() ) ) + w = formWindow()->mainContainer(); + } + + if ( w && WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout ) { + formWindow()->paste( tqApp->clipboard()->text(), WidgetFactory::containerOfWidget( w ) ); + hierarchyView->widgetInserted( 0 ); + formWindow()->commandHistory()->setModified( TRUE ); + } else { + TQMessageBox::information( this, i18n( "Paste Error" ), + i18n( "Cannot paste widgets. Designer could not find a container\n" + "to paste into which does not contain a layout. Break the layout\n" + "of the container you want to paste into and select this container\n" + "and then paste again." ) ); + } +} + +void MainWindow::editDelete() +{ + if ( formWindow() ) + formWindow()->deleteWidgets(); +} + +void MainWindow::editSelectAll() +{ + if ( qWorkspace()->activeWindow() && + ::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) { + ( (SourceEditor*)qWorkspace()->activeWindow() )->editSelectAll(); + return; + } + if ( formWindow() ) + formWindow()->selectAll(); +} + + +void MainWindow::editLower() +{ + if ( formWindow() ) + formWindow()->lowerWidgets(); +} + +void MainWindow::editRaise() +{ + if ( formWindow() ) + formWindow()->raiseWidgets(); +} + +void MainWindow::editAdjustSize() +{ + if ( formWindow() ) + formWindow()->editAdjustSize(); +} + +void MainWindow::editLayoutHorizontal() +{ + if ( layoutChilds ) + editLayoutContainerHorizontal(); + else if ( layoutSelected && formWindow() ) + formWindow()->layoutHorizontal(); +} + +void MainWindow::editLayoutVertical() +{ + if ( layoutChilds ) + editLayoutContainerVertical(); + else if ( layoutSelected && formWindow() ) + formWindow()->layoutVertical(); +} + +void MainWindow::editLayoutHorizontalSplit() +{ + if ( layoutChilds ) + ; // no way to do that + else if ( layoutSelected && formWindow() ) + formWindow()->layoutHorizontalSplit(); +} + +void MainWindow::editLayoutVerticalSplit() +{ + if ( layoutChilds ) + ; // no way to do that + else if ( layoutSelected && formWindow() ) + formWindow()->layoutVerticalSplit(); +} + +void MainWindow::editLayoutGrid() +{ + if ( layoutChilds ) + editLayoutContainerGrid(); + else if ( layoutSelected && formWindow() ) + formWindow()->layoutGrid(); +} + +void MainWindow::editLayoutContainerVertical() +{ + if ( !formWindow() ) + return; + TQWidget *w = formWindow()->mainContainer(); + TQWidgetList l( formWindow()->selectedWidgets() ); + if ( l.count() == 1 ) + w = l.first(); + if ( w ) + formWindow()->layoutVerticalContainer( w ); +} + +void MainWindow::editLayoutContainerHorizontal() +{ + if ( !formWindow() ) + return; + TQWidget *w = formWindow()->mainContainer(); + TQWidgetList l( formWindow()->selectedWidgets() ); + if ( l.count() == 1 ) + w = l.first(); + if ( w ) + formWindow()->layoutHorizontalContainer( w ); +} + +void MainWindow::editLayoutContainerGrid() +{ + if ( !formWindow() ) + return; + TQWidget *w = formWindow()->mainContainer(); + TQWidgetList l( formWindow()->selectedWidgets() ); + if ( l.count() == 1 ) + w = l.first(); + if ( w ) + formWindow()->layoutGridContainer( w ); +} + +void MainWindow::editBreakLayout() +{ + if ( !formWindow() || !breakLayout ) + return; + TQWidget *w = formWindow()->mainContainer(); + if ( formWindow()->currentWidget() ) + w = formWindow()->currentWidget(); + if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout || + w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) { + formWindow()->breakLayout( w ); + return; + } else { + TQWidgetList widgets = formWindow()->selectedWidgets(); + for ( w = widgets.first(); w; w = widgets.next() ) { + if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout || + w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) + break; + } + if ( w ) { + formWindow()->breakLayout( w ); + return; + } + } + + w = formWindow()->mainContainer(); + if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout || + w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) + formWindow()->breakLayout( w ); +} + +void MainWindow::editAccels() +{ + if ( !formWindow() ) + return; + formWindow()->checkAccels(); +} + +void MainWindow::editFunctions() +{ + if ( !formWindow() ) + return; + + statusMessage( i18n( "Edit the current form's slots..." ) ); + EditFunctions dlg( this, formWindow(), TRUE ); + dlg.exec(); + statusBar()->clear(); +} + +void MainWindow::editConnections() +{ + if ( !formWindow() ) + return; + + statusMessage( i18n( "Edit the current form's connections..." ) ); + ConnectionDialog dlg( this ); + dlg.exec(); + + statusBar()->clear(); +} + +SourceEditor *MainWindow::editSource() +{ + if ( !formWindow() ) + return 0; + return formWindow()->formFile()->showEditor(); +} + +SourceEditor *MainWindow::openSourceEditor() +{ + if ( !formWindow() ) + return 0; + + TQString lang = currentProject->language(); + if ( !MetaDataBase::hasEditor( lang ) ) { + TQMessageBox::information( this, i18n( "Edit Source" ), + i18n( "There is no plugin for editing %1 code installed.\n" + "Note: Plugins are not available in static TQt configurations." ).arg( lang ) ); + return 0; + } + + SourceEditor *editor = 0; + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) { + if ( e->language() == lang && e->formWindow() == formWindow() ) { + editor = e; + break; + } + } + + if ( !editor ) +editor = createSourceEditor( TQT_TQOBJECT(formWindow()), formWindow()->project(), lang ); + return editor; +} + +SourceEditor *MainWindow::editSource( SourceFile *f ) +{ + TQString lang = currentProject->language(); + if ( !MetaDataBase::hasEditor( lang ) ) { + TQMessageBox::information( this, i18n( "Edit Source" ), + i18n( "There is no plugin for editing %1 code installed.\n" + "Note: Plugins are not available in static TQt configurations." ).arg( lang ) ); + return 0; + } + + SourceEditor *editor = 0; + if ( f ) + editor = f->editor(); + if ( !editor ) + editor = createSourceEditor( f, currentProject, lang ); + editor->setActiveWindow(); + editor->setFocus(); + return editor; +} + +SourceEditor *MainWindow::createSourceEditor( TQObject *object, Project *project, + const TQString &lang, const TQString &func, + bool rereadSource ) +{ + SourceEditor *editor = 0; + EditorInterface *eIface = 0; + editorPluginManager->queryInterface( lang, &eIface ); + if ( !eIface ) + return 0; + LanguageInterface *lIface = MetaDataBase::languageInterface( lang ); + if ( !lIface ) + return 0; + TQApplication::setOverrideCursor( WaitCursor ); + editor = new SourceEditor( qWorkspace(), eIface, lIface ); + eIface->release(); + lIface->release(); + + editor->setLanguage( lang ); + sourceEditors.append( editor ); + TQApplication::restoreOverrideCursor(); + + if ( editor->object() != object ) + editor->setObject( object, project ); + else if ( rereadSource ) + editor->refresh( FALSE ); + + editor->show(); + editor->setFocus(); + if ( !func.isEmpty() ) + editor->setFunction( func ); + emit editorChanged(); + + return editor; +} + +void MainWindow::editFormSettings() +{ + if ( !formWindow() ) + return; + + statusMessage( i18n( "Edit the current form's settings..." ) ); + FormSettings dlg( this, formWindow() ); + dlg.exec(); + statusBar()->clear(); +} + +void MainWindow::editProjectSettings() +{ + openProjectSettings( currentProject ); + wspace->setCurrentProject( currentProject ); +} + +void MainWindow::editPixmapCollection() +{ + PixmapCollectionEditor dia( this, 0, TRUE ); + dia.setProject( currentProject ); + dia.exec(); +} + +void MainWindow::editDatabaseConnections() +{ +#ifndef TQT_NO_SQL + DatabaseConnectionsEditor dia( currentProject, this, 0, TRUE ); + dia.exec(); +#endif +} + +void MainWindow::editPreferences() +{ + statusMessage( i18n( "Edit preferences..." ) ); + Preferences *dia = new Preferences( this, 0, TRUE ); + prefDia = dia; + connect( dia->helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + dia->buttonColor->setEditor( StyledButton::ColorEditor ); + dia->buttonPixmap->setEditor( StyledButton::PixmapEditor ); + dia->groupBoxGrid->setChecked( sGrid ); + dia->checkBoxSnapGrid->setChecked( snGrid ); + dia->spinGridX->setValue( grid().x() ); + dia->spinGridY->setValue( grid().y() ); + dia->checkBoxWorkspace->setChecked( restoreConfig ); + dia->checkBoxTextLabels->setChecked( usesTextLabel() ); + dia->buttonColor->setColor( qworkspace->backgroundColor() ); + TQString pluginPaths = TQApplication::libraryPaths().join("\n"); + dia->textEditPluginPaths->setText(pluginPaths); + if ( qworkspace->backgroundPixmap() ) + dia->buttonPixmap->setPixmap( *qworkspace->backgroundPixmap() ); + if ( backPix ) + dia->radioPixmap->setChecked( TRUE ); + else + dia->radioColor->setChecked( TRUE ); + dia->checkBoxSplash->setChecked( splashScreen ); + dia->checkAutoEdit->setChecked( !databaseAutoEdit ); + dia->checkBoxStartDialog->setChecked( shStartDialog ); + dia->checkBoxAutoSave->setChecked( autoSaveEnabled ); + int h = autoSaveInterval / 3600; + int m = ( autoSaveInterval - h * 3600 ) / 60; + int s = autoSaveInterval - ( h * 3600 + m * 60 ); + TQTime t( h, m, s ); + dia->timeEditAutoSave->setTime( t ); + + SenderObject *senderObject = new SenderObject( designerInterface() ); + TQValueList<Tab>::Iterator it; + for ( it = preferenceTabs.begin(); it != preferenceTabs.end(); ++it ) { + Tab t = *it; + dia->tabWidget->addTab( t.w, t.title ); + if ( t.receiver ) { + connect( dia->buttonOk, TQT_SIGNAL( clicked() ), senderObject, TQT_SLOT( emitAcceptSignal() ) ); + connect( senderObject, TQT_SIGNAL( acceptSignal( TQUnknownInterface * ) ), t.receiver, t.accept_slot ); + connect( senderObject, TQT_SIGNAL( initSignal( TQUnknownInterface * ) ), t.receiver, t.init_slot ); + senderObject->emitInitSignal(); + disconnect( senderObject, TQT_SIGNAL( initSignal( TQUnknownInterface * ) ), t.receiver, t.init_slot ); + } + } + + if ( dia->exec() == TQDialog::Accepted ) { + setSnapGrid( dia->checkBoxSnapGrid->isChecked() ); + setShowGrid( dia->groupBoxGrid->isChecked() ); + setGrid( TQPoint( dia->spinGridX->value(), + dia->spinGridY->value() ) ); + restoreConfig = dia->checkBoxWorkspace->isChecked(); + setUsesTextLabel( dia->checkBoxTextLabels->isChecked() ); + if (dia->textEditPluginPaths->isModified()) { + pluginPaths = dia->textEditPluginPaths->text(); + TQApplication::setLibraryPaths(TQStringList::split("\n", pluginPaths)); + savePluginPaths = TRUE; + } + + if ( dia->radioPixmap->isChecked() && dia->buttonPixmap->pixmap() ) { + qworkspace->setBackgroundPixmap( *dia->buttonPixmap->pixmap() ); + backPix = TRUE; + } else { + qworkspace->setBackgroundColor( dia->buttonColor->color() ); + backPix = FALSE; + } + splashScreen = dia->checkBoxSplash->isChecked(); + databaseAutoEdit = !dia->checkAutoEdit->isChecked(); + shStartDialog = dia->checkBoxStartDialog->isChecked(); + autoSaveEnabled = dia->checkBoxAutoSave->isChecked(); + TQTime time = dia->timeEditAutoSave->time(); + autoSaveInterval = time.hour() * 3600 + time.minute() * 60 + time.second(); + if ( autoSaveEnabled ) + autoSaveTimer->start( autoSaveInterval * 1000 ); + else + autoSaveTimer->stop(); + } + delete senderObject; + for ( it = preferenceTabs.begin(); it != preferenceTabs.end(); ++it ) { + Tab t = *it; + dia->tabWidget->removePage( t.w ); + t.w->reparent( 0, TQPoint(0,0), FALSE ); + } + + for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) + e->configChanged(); + + delete dia; + prefDia = 0; + statusBar()->clear(); +} + +void MainWindow::searchFind() +{ + if ( !qWorkspace()->activeWindow() || + !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + + if ( !findDialog ) + findDialog = new FindDialog( this, 0, FALSE ); + findDialog->show(); + findDialog->raise(); + findDialog->setEditor( ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface(), + ( (SourceEditor*)qWorkspace()->activeWindow() )->object() ); + findDialog->comboFind->setFocus(); + findDialog->comboFind->lineEdit()->selectAll(); +} + +void MainWindow::searchIncremetalFindMenu() +{ + incrementalSearch->selectAll(); + incrementalSearch->setFocus(); +} + +void MainWindow::searchIncremetalFind() +{ + if ( !qWorkspace()->activeWindow() || + !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + + ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface()->find( incrementalSearch->text(), + FALSE, FALSE, TRUE, FALSE ); +} + +void MainWindow::searchIncremetalFindNext() +{ + if ( !qWorkspace()->activeWindow() || + !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + + ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface()->find( incrementalSearch->text(), + FALSE, FALSE, TRUE, TRUE ); +} + +void MainWindow::searchReplace() +{ + if ( !qWorkspace()->activeWindow() || + !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + + if ( !replaceDialog ) + replaceDialog = new ReplaceDialog( this, 0, FALSE ); + replaceDialog->show(); + replaceDialog->raise(); + replaceDialog->setEditor( ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface(), + ( (SourceEditor*)qWorkspace()->activeWindow() )->object() ); + replaceDialog->comboFind->setFocus(); + replaceDialog->comboFind->lineEdit()->selectAll(); +} + +void MainWindow::searchGotoLine() +{ + if ( !qWorkspace()->activeWindow() || + !::tqqt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) + return; + + if ( !gotoLineDialog ) + gotoLineDialog = new GotoLineDialog( this, 0, FALSE ); + gotoLineDialog->show(); + gotoLineDialog->raise(); + gotoLineDialog->setEditor( ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface() ); + gotoLineDialog->spinLine->setFocus(); + gotoLineDialog->spinLine->setMinValue( 1 ); + gotoLineDialog->spinLine->setMaxValue( ( (SourceEditor*)qWorkspace()->activeWindow() )->numLines() ); + gotoLineDialog->spinLine->selectAll(); +} + +void MainWindow::toolsCustomWidget() +{ + statusMessage( i18n( "Edit custom widgets..." ) ); + CustomWidgetEditor edit( this, this ); + edit.exec(); + rebuildCustomWidgetGUI(); + statusBar()->clear(); +} + +void MainWindow::toolsConfigure() +{ + ConfigToolboxDialog dlg( this ); + if ( dlg.exec() != TQDialog::Accepted ) + return; + rebuildCommonWidgetsToolBoxPage(); +} + +void MainWindow::showStartDialog() +{ + if ( singleProjectMode() ) + return; + for ( int i = 1; i < tqApp->argc(); ++i ) { + TQString arg = tqApp->argv()[i]; + if ( arg[0] != '-' ) + return; + } + StartDialog *sd = new StartDialog( this, templatePath() ); + sd->setRecentlyFiles( recentlyFiles ); + sd->setRecentlyProjects( recentlyProjects ); + sd->exec(); + shStartDialog = sd->showDialogInFuture(); +} diff --git a/kdevdesigner/designer/menubareditor.cpp b/kdevdesigner/designer/menubareditor.cpp new file mode 100644 index 00000000..f62e15e0 --- /dev/null +++ b/kdevdesigner/designer/menubareditor.cpp @@ -0,0 +1,1129 @@ +/********************************************************************** +** Copyright (C) 2003 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqaction.h> +#include <tqapplication.h> +#include <tqbitmap.h> +#include <tqdragobject.h> +#include <tqlineedit.h> +#include <tqmainwindow.h> +#include <tqpainter.h> +#include <tqstyle.h> +#include "command.h" +#include "formwindow.h" +#include "menubareditor.h" +#include "popupmenueditor.h" + +#include <tdelocale.h> + +extern void find_accel( const TQString &txt, TQMap<TQChar, TQWidgetList > &accels, TQWidget *w ); + +// Drag Object Declaration ------------------------------------------- + +class MenuBarEditorItemPtrDrag : public TQStoredDrag +{ +public: + MenuBarEditorItemPtrDrag( MenuBarEditorItem * item, + TQWidget * parent = 0, + const char * name = 0 ); + ~MenuBarEditorItemPtrDrag() {}; + static bool canDecode( TQDragMoveEvent * e ); + static bool decode( TQDropEvent * e, MenuBarEditorItem ** i ); +}; + +// Drag Object Implementation --------------------------------------- + +MenuBarEditorItemPtrDrag::MenuBarEditorItemPtrDrag( MenuBarEditorItem * item, + TQWidget * parent, + const char * name ) + : TQStoredDrag( "qt/menubareditoritemptr", parent, name ) +{ + TQByteArray data( sizeof( TQ_LONG ) ); + TQDataStream stream( data, IO_WriteOnly ); + stream << ( TQ_LONG ) item; + setEncodedData( data ); +} + +bool MenuBarEditorItemPtrDrag::canDecode( TQDragMoveEvent * e ) +{ + return e->provides( "qt/menubareditoritemptr" ); +} + +bool MenuBarEditorItemPtrDrag::decode( TQDropEvent * e, MenuBarEditorItem ** i ) +{ + TQByteArray data = e->encodedData( "qt/menubareditoritemptr" ); + TQDataStream stream( data, IO_ReadOnly ); + + if ( !data.size() ) + return FALSE; + + TQ_LONG p = 0; + stream >> p; + *i = ( MenuBarEditorItem *) p; + + return TRUE; +} + +// MenuBarEditorItem --------------------------------------------------- + +MenuBarEditorItem::MenuBarEditorItem( MenuBarEditor * bar, TQObject * parent, const char * name ) + : TQObject( parent, name ), + menuBar( bar ), + popupMenu( 0 ), + visible( TRUE ), + separator( FALSE ), + removable( FALSE ) +{ } + +MenuBarEditorItem::MenuBarEditorItem( PopupMenuEditor * menu, MenuBarEditor * bar, + TQObject * parent, const char * name ) + : TQObject( parent, name ), + menuBar( bar ), + popupMenu( menu ), + visible( TRUE ), + separator( FALSE ), + removable( TRUE ) +{ + text = menu->name(); +} + +MenuBarEditorItem::MenuBarEditorItem( TQActionGroup * actionGroup, MenuBarEditor * bar, + TQObject * parent, const char * name ) + : TQObject( parent, name ), + menuBar( bar ), + popupMenu( 0 ), + visible( TRUE ), + separator( FALSE ), + removable( TRUE ) +{ + text = actionGroup->menuText(); + popupMenu = new PopupMenuEditor( menuBar->formWindow(), menuBar ); + popupMenu->insert( actionGroup ); +} + +MenuBarEditorItem::MenuBarEditorItem( MenuBarEditorItem * item, TQObject * parent, const char * name ) + : TQObject( parent, name ), + menuBar( item->menuBar ), + popupMenu( 0 ), + text( item->text ), + visible( item->visible ), + separator( item->separator ), + removable( item->removable ) +{ + popupMenu = new PopupMenuEditor( menuBar->formWindow(), item->popupMenu, menuBar ); +} + +// MenuBarEditor -------------------------------------------------------- + +int MenuBarEditor::clipboardOperation = 0; +MenuBarEditorItem * MenuBarEditor::clipboardItem = 0; + +MenuBarEditor::MenuBarEditor( FormWindow * fw, TQWidget * parent, const char * name ) + : TQMenuBar( parent, name ), + formWnd( fw ), + draggedItem( 0 ), + currentIndex( 0 ), + itemHeight( 0 ), + separatorWidth( 32 ), + hideWhenEmpty( TRUE ), + hasSeparator( FALSE ) +{ + setAcceptDrops( TRUE ); + setFocusPolicy( TQ_StrongFocus ); + + addItem.setMenuText( i18n("new menu") ); + addSeparator.setMenuText( i18n("new separator") ); + + lineEdit = new TQLineEdit( this, "menubar lineedit" ); + lineEdit->hide(); + lineEdit->setFrameStyle(TQFrame::Plain | TQFrame::NoFrame); + lineEdit->polish(); + lineEdit->setBackgroundMode(PaletteButton); + lineEdit->setBackgroundOrigin(ParentOrigin); + lineEdit->installEventFilter( this ); + + dropLine = new TQWidget( this, "menubar dropline", TQt::WStyle_NoBorder | WStyle_StaysOnTop ); + dropLine->setBackgroundColor( TQt::red ); + dropLine->hide(); + + setMinimumHeight( fontMetrics().height() + 2 * borderSize() ); +} + +MenuBarEditor::~MenuBarEditor() +{ + itemList.setAutoDelete( TRUE ); +} + +FormWindow * MenuBarEditor::formWindow() +{ + return formWnd; +} + +MenuBarEditorItem * MenuBarEditor::createItem( int index, bool addToCmdStack ) +{ + MenuBarEditorItem * i = + new MenuBarEditorItem( new PopupMenuEditor( formWnd, ( TQWidget * ) parent() ), this ); + if ( addToCmdStack ) { + AddMenuCommand * cmd = new AddMenuCommand( i18n( "Add Menu" ), formWnd, this, i, index ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else { + AddMenuCommand cmd( i18n( "Add Menu" ), formWnd, this, i, index ); + cmd.execute(); + } + return i; +} + +void MenuBarEditor::insertItem( MenuBarEditorItem * item, int index ) +{ + item->menu()->parentMenu = this; + + if ( index != -1 ) + itemList.insert( index, item ); + else + itemList.append( item ); + + if ( hideWhenEmpty && itemList.count() == 1 ) + show(); // calls resizeInternals(); + else + resizeInternals(); + + if ( isVisible() ) + update(); +} + +void MenuBarEditor::insertItem( TQString text, PopupMenuEditor * menu, int index ) +{ + MenuBarEditorItem * item = new MenuBarEditorItem( menu, this ); + if ( !text.isNull() ) + item->setMenuText( text ); + insertItem( item, index ); +} + +void MenuBarEditor::insertItem( TQString text, TQActionGroup * group, int index ) +{ + MenuBarEditorItem * item = new MenuBarEditorItem( group, this ); + if ( !text.isNull() ) + item->setMenuText( text ); + insertItem( item, index ); +} + + +void MenuBarEditor::insertSeparator( int index ) +{ + if ( hasSeparator ) + return; + + MenuBarEditorItem * i = createItem( index ); + i->setSeparator( TRUE ); + i->setMenuText( i18n( "separator" ) ); + hasSeparator = TRUE; +} + +void MenuBarEditor::removeItemAt( int index ) +{ + removeItem( item( index ) ); +} + +void MenuBarEditor::removeItem( MenuBarEditorItem * item ) +{ + if ( item && + item->isRemovable() && + itemList.removeRef( item ) ) { + + if ( item->isSeparator() ) + hasSeparator = FALSE; + + if ( hideWhenEmpty && itemList.count() == 0 ) + hide(); + else + resizeInternals(); + + int n = count() + 1; + if ( currentIndex >= n ) + currentIndex = n; + + if ( isVisible() ) + update(); + } +} + +int MenuBarEditor::findItem( MenuBarEditorItem * item ) +{ + return itemList.findRef( item ); +} + +int MenuBarEditor::findItem( PopupMenuEditor * menu ) +{ + MenuBarEditorItem * i = itemList.first(); + + while ( i ) { + if ( i->menu() == menu ) + return itemList.at(); + i = itemList.next(); + } + + return -1; +} + +int MenuBarEditor::findItem( TQPoint & pos ) +{ + int x = borderSize(); + int dx = 0; + int y = 0; + int w = width(); + TQSize s; + TQRect r; + + MenuBarEditorItem * i = itemList.first(); + + while ( i ) { + + if ( i->isVisible() ) { + + s = itemSize( i ); + dx = s.width(); + + if ( x + dx > w && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + + r = TQRect( x, y, s.width(), s.height() ); + + if ( r.contains( pos ) ) + return itemList.at(); + + addItemSizeToCoords( i, x, y, w ); + } + + i = itemList.next(); + } + + // check add item + s = itemSize( &addItem ); + dx = s.width(); + + if ( x + dx > w && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + + r = TQRect( x, y, s.width(), s.height() ); + + if ( r.contains( pos ) ) + return itemList.count(); + + return itemList.count() + 1; +} + +MenuBarEditorItem * MenuBarEditor::item( int index ) +{ + if ( index == -1 ) + return itemList.at( currentIndex ); + + int c = itemList.count(); + if ( index == c ) + return &addItem; + else if ( index > c ) + return &addSeparator; + + return itemList.at( index ); +} + +int MenuBarEditor::count() +{ + return itemList.count(); +} + +int MenuBarEditor::current() +{ + return currentIndex; +} + +void MenuBarEditor::cut( int index ) +{ + if ( clipboardItem && clipboardOperation == Cut ) + delete clipboardItem; + + clipboardOperation = Cut; + clipboardItem = itemList.at( index ); + + if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) { + clipboardOperation = None; + clipboardItem = 0; + return; // do nothing + } + + RemoveMenuCommand * cmd = new RemoveMenuCommand( i18n( "Cut Menu" ), formWnd, this, index ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void MenuBarEditor::copy( int index ) +{ + if ( clipboardItem && clipboardOperation == Cut ) + delete clipboardItem; + + clipboardOperation = Copy; + clipboardItem = itemList.at( index ); + + if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) { + clipboardOperation = None; + clipboardItem = 0; + } +} + +void MenuBarEditor::paste( int index ) +{ + if ( clipboardItem && clipboardOperation ) { + MenuBarEditorItem * i = new MenuBarEditorItem( clipboardItem ); + AddMenuCommand * cmd = new AddMenuCommand( i18n( "Paste Menu" ), formWnd, this, i, index ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +void MenuBarEditor::exchange( int a, int b ) +{ + MenuBarEditorItem * ia = itemList.at( a ); + MenuBarEditorItem * ib = itemList.at( b ); + if ( !ia || !ib || + ia == &addItem || ia == &addSeparator || + ib == &addItem || ib == &addSeparator ) + return; // do nothing + itemList.replace( b, ia ); + itemList.replace( a, ib ); +} + +void MenuBarEditor::showLineEdit( int index ) +{ + if ( index == -1 ) + index = currentIndex; + + MenuBarEditorItem * i = 0; + + if ( (uint) index >= itemList.count() ) + i = &addItem; + else + i = itemList.at( index ); + + if ( i && i->isSeparator() ) + return; + + // open edit field for item name + lineEdit->setText( i->menuText() ); + lineEdit->selectAll(); + TQPoint pos = itemPos( index ); + lineEdit->move( pos.x() + borderSize(), pos.y() - ( borderSize() / 2 ) ); + lineEdit->resize( itemSize( i ) ); + lineEdit->show(); + lineEdit->setFocus(); +} + +void MenuBarEditor::showItem( int index ) +{ + if ( index == -1 ) + index = currentIndex; + + if ( (uint)index < itemList.count() ) { + MenuBarEditorItem * i = itemList.at( index ); + if ( i->isSeparator() || draggedItem ) + return; + PopupMenuEditor * m = i->menu(); + TQPoint pos = itemPos( index ); + m->move( pos.x(), pos.y() + itemHeight - 1 ); + m->raise(); + m->show(); + setFocus(); + } +} + +void MenuBarEditor::hideItem( int index ) +{ + if ( index == -1 ) + index = currentIndex; + + if ( (uint)index < itemList.count() ) { + PopupMenuEditor * m = itemList.at( index )->menu(); + m->hideSubMenu(); + m->hide(); + } +} + +void MenuBarEditor::focusItem( int index ) +{ + if ( index == -1 ) + index = currentIndex; + + if ( (uint)index < itemList.count() ) { + PopupMenuEditor * m = itemList.at( index )->menu(); + m->setFocus(); + m->update(); + update(); + } +} + +void MenuBarEditor::deleteItem( int index ) +{ + if ( index == -1 ) + index = currentIndex; + + if ( (uint)index < itemList.count() ) { + RemoveMenuCommand * cmd = new RemoveMenuCommand( i18n( "Delete Menu" ), + formWnd, + this, + currentIndex ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +TQSize MenuBarEditor::sizeHint() const +{ + return TQSize( parentWidget()->width(), heightForWidth( parentWidget()->width() ) ); +} + +int MenuBarEditor::heightForWidth( int max_width ) const +{ + MenuBarEditor * that = ( MenuBarEditor * ) this; + int x = borderSize(); + int y = 0; + + TQPainter p( this ); + that->itemHeight = that->itemSize( &(that->addItem) ).height(); + + MenuBarEditorItem * i = that->itemList.first(); + while ( i ) { + if ( i->isVisible() ) + that->addItemSizeToCoords( i, x, y, max_width ); + i = that->itemList.next(); + } + + that->addItemSizeToCoords( &(that->addItem), x, y, max_width ); + that->addItemSizeToCoords( &(that->addSeparator), x, y, max_width ); + + return y + itemHeight; +} + +void MenuBarEditor::show() +{ + TQWidget::show(); + resizeInternals(); + + TQResizeEvent e( parentWidget()->size(), parentWidget()->size() ); + TQApplication::sendEvent( parentWidget(), &e ); +} + +void MenuBarEditor::checkAccels( TQMap<TQChar, TQWidgetList > &accels ) +{ + TQString t; + MenuBarEditorItem * i = itemList.first(); + while ( i ) { + t = i->menuText(); + find_accel( t, accels, this ); + // do not check the accelerators in the popup menus + i = itemList.next(); + } +} + +// public slots + +void MenuBarEditor::cut() +{ + cut( currentIndex ); +} + +void MenuBarEditor::copy() +{ + copy( currentIndex ); +} + +void MenuBarEditor::paste() +{ + paste( currentIndex ); +} + +// protected + +bool MenuBarEditor::eventFilter( TQObject * o, TQEvent * e ) +{ + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(lineEdit) && e->type() == TQEvent::FocusOut ) { + leaveEditMode(); + lineEdit->hide(); + update(); + } else if ( e->type() == TQEvent::LayoutHint ) { + resize( sizeHint() ); + } + return TQMenuBar::eventFilter( o, e ); +} + +void MenuBarEditor::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + TQRect r = rect(); + style().tqdrawPrimitive( TQStyle::PE_PanelMenuBar, &p, + r, colorGroup() ); + drawItems( p ); +} + +void MenuBarEditor::mousePressEvent( TQMouseEvent * e ) +{ + mousePressPos = e->pos(); + hideItem(); + lineEdit->hide(); + currentIndex = findItem( mousePressPos ); + showItem(); + update(); + e->accept(); +} + +void MenuBarEditor::mouseDoubleClickEvent( TQMouseEvent * e ) +{ + mousePressPos = e->pos(); + currentIndex = findItem( mousePressPos ); + lineEdit->hide(); + if ( currentIndex > (int)itemList.count() ) { + insertSeparator(); + update(); + } else { + showLineEdit(); + } +} + +void MenuBarEditor::mouseMoveEvent( TQMouseEvent * e ) +{ + if ( e->state() & Qt::LeftButton ) { + if ( ( e->pos() - mousePressPos ).manhattanLength() > 3 ) { + bool itemCreated = FALSE; + bool isSeparator = FALSE; + draggedItem = item( findItem( mousePressPos ) ); + if ( draggedItem == &addItem ) { + draggedItem = createItem(); + itemCreated = TRUE; + } else if ( draggedItem == &addSeparator ) { + if (hasSeparator) // we can only have one separator + return; + draggedItem = createItem(); + draggedItem->setSeparator( TRUE ); + draggedItem->setMenuText( "separator" ); + isSeparator = TRUE; + itemCreated = TRUE; + } else { + isSeparator = draggedItem->isSeparator(); + } + + MenuBarEditorItemPtrDrag * d = + new MenuBarEditorItemPtrDrag( draggedItem, this ); + d->setPixmap( createTextPixmap( draggedItem->menuText() ) ); + hideItem(); + draggedItem->setVisible( FALSE ); + update(); + + // If the item is dropped in the same list, + // we will have two instances of the same pointer + // in the list. + itemList.find( draggedItem ); + TQLNode * node = itemList.currentNode(); + dropConfirmed = FALSE; + d->dragCopy(); // dragevents and stuff happens + if ( draggedItem ) { // item was not dropped + if ( itemCreated ) { + removeItem( draggedItem ); + } else { + hideItem(); + draggedItem->setVisible( TRUE ); + draggedItem = 0; + showItem(); + } + } else if ( dropConfirmed ) { // item was dropped + dropConfirmed = FALSE; + hideItem(); + itemList.takeNode( node )->setVisible( TRUE ); + hasSeparator = isSeparator || hasSeparator; + showItem(); + } else { + hasSeparator = isSeparator || hasSeparator; + } + update(); + } + } +} + +void MenuBarEditor::dragEnterEvent( TQDragEnterEvent * e ) +{ + if ( MenuBarEditorItemPtrDrag::canDecode( e ) ) { + e->accept(); + dropLine->show(); + } +} + +void MenuBarEditor::dragLeaveEvent( TQDragLeaveEvent * ) +{ + dropLine->hide(); +} + +void MenuBarEditor::dragMoveEvent( TQDragMoveEvent * e ) +{ + + TQPoint pos = e->pos(); + dropLine->move( snapToItem( pos ) ); + + int idx = findItem( pos ); + if ( currentIndex != idx ) { + hideItem(); + currentIndex = idx; + showItem(); + } +} + +void MenuBarEditor::dropEvent( TQDropEvent * e ) +{ + MenuBarEditorItem * i = 0; + + if ( MenuBarEditorItemPtrDrag::decode( e, &i ) ) { + draggedItem = 0; + hideItem(); + dropInPlace( i, e->pos() ); + e->accept(); + } + + dropLine->hide(); +} + +void MenuBarEditor::keyPressEvent( TQKeyEvent * e ) +{ + if ( lineEdit->isHidden() ) { // In navigation mode + switch ( e->key() ) { + + case TQt::Key_Delete: + hideItem(); + deleteItem(); + showItem(); + break; + + case TQt::Key_Left: + e->accept(); + navigateLeft( e->state() & TQt::ControlButton ); + return; + + case TQt::Key_Right: + e->accept(); + navigateRight( e->state() & TQt::ControlButton ); + return; // no update + + case TQt::Key_Down: + e->accept(); + focusItem(); + return; // no update + + case TQt::Key_PageUp: + currentIndex = 0; + break; + + case TQt::Key_PageDown: + currentIndex = itemList.count(); + break; + + case TQt::Key_Enter: + case TQt::Key_Return: + case TQt::Key_F2: + e->accept(); + enterEditMode(); + return; // no update + + case TQt::Key_Up: + case TQt::Key_Alt: + case TQt::Key_Shift: + case TQt::Key_Control: + case TQt::Key_Escape: + e->ignore(); + setFocus(); // FIXME: this is because some other widget get the focus when CTRL is pressed + return; // no update + + case TQt::Key_C: + if ( e->state() & TQt::ControlButton && currentIndex < (int)itemList.count() ) { + copy( currentIndex ); + break; + } + + case TQt::Key_X: + if ( e->state() & TQt::ControlButton && currentIndex < (int)itemList.count() ) { + hideItem(); + cut( currentIndex ); + showItem(); + break; + } + + case TQt::Key_V: + if ( e->state() & TQt::ControlButton ) { + hideItem(); + paste( currentIndex < (int)itemList.count() ? currentIndex + 1: itemList.count() ); + showItem(); + break; + } + + default: + if ( e->ascii() >= 32 || e->ascii() == 0 ) { + showLineEdit(); + TQApplication::sendEvent( lineEdit, e ); + e->accept(); + } else { + e->ignore(); + } + return; + } + } else { // In edit mode + + switch ( e->key() ) { + case TQt::Key_Control: + e->ignore(); + return; + case TQt::Key_Enter: + case TQt::Key_Return: + leaveEditMode(); + case TQt::Key_Escape: + lineEdit->hide(); + setFocus(); + break; + } + } + e->accept(); + update(); +} + +void MenuBarEditor::focusOutEvent( TQFocusEvent * e ) +{ + TQWidget * fw = tqApp->focusWidget(); + if ( e->lostFocus() && !::tqqt_cast<PopupMenuEditor*>(fw) ) + hideItem(); + update(); +} + +void MenuBarEditor::resizeInternals() +{ + dropLine->resize( 2, itemHeight ); + updateGeometry(); +} + +void MenuBarEditor::drawItems( TQPainter & p ) +{ + TQPoint pos( borderSize(), 0 ); + uint c = 0; + + p.setPen( colorGroup().buttonText() ); + + MenuBarEditorItem * i = itemList.first(); + while ( i ) { + if ( i->isVisible() ) + drawItem( p, i, c++, pos ); // updates x y + i = itemList.next(); + } + + p.setPen( darkBlue ); + drawItem( p, &addItem, c++, pos ); + if ( !hasSeparator ) + drawItem( p, &addSeparator, c, pos ); +} + +void MenuBarEditor::drawItem( TQPainter & p, + MenuBarEditorItem * i, + int idx, + TQPoint & pos ) +{ + int w = itemSize( i ).width(); + + // If the item passes the right border, and it is not the first item on the line + if ( pos.x() + w > width() && pos.x() > borderSize() ) { // wrap + pos.ry() += itemHeight; + pos.setX( borderSize() ); + } + + if ( i->isSeparator() ) { + drawSeparator( p, pos ); + } else { + int flags = TQPainter::AlignLeft | TQPainter::AlignVCenter | + TQt::ShowPrefix | TQt::SingleLine; + p.drawText( pos.x() + borderSize(), pos.y(), w - borderSize(), itemHeight, + flags, i->menuText() ); + } + + if ( hasFocus() && idx == currentIndex && !draggedItem ) + p.drawWinFocusRect( pos.x(), pos.y() + 1, w, itemHeight - 2 ); + + pos.rx() += w; +} + +void MenuBarEditor::drawSeparator( TQPainter & p, TQPoint & pos ) +{ + p.save(); + p.setPen( darkBlue ); + + int left = pos.x(); + int top = pos.y() + 2; + int right = left + separatorWidth - 1; + int bottom = pos.y() + itemHeight - 4; + + p.drawLine( left, top, left, bottom ); + p.drawLine( right, top, right, bottom ); + + p.fillRect( left, pos.y() + borderSize() * 2, + separatorWidth - 1, itemHeight - borderSize() * 4, + TQBrush( darkBlue, TQt::Dense5Pattern ) ); + + p.restore(); +} + +TQSize MenuBarEditor::itemSize( MenuBarEditorItem * i ) +{ + if ( i->isSeparator() ) + return TQSize( separatorWidth, itemHeight ); + TQRect r = fontMetrics().boundingRect( i->menuText().remove( "&") ); + return TQSize( r.width() + borderSize() * 2, r.height() + borderSize() * 4 ); +} + +void MenuBarEditor::addItemSizeToCoords( MenuBarEditorItem * i, int & x, int & y, int w ) +{ + int dx = itemSize( i ).width(); + if ( x + dx > w && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + x += dx; +} + +TQPoint MenuBarEditor::itemPos( int index ) +{ + int x = borderSize(); + int y = 0; + int w = width(); + int dx = 0; + int c = 0; + + MenuBarEditorItem * i = itemList.first(); + + while ( i ) { + if ( i->isVisible() ) { + dx = itemSize( i ).width(); + if ( x + dx > w && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + if ( c == index ) + return TQPoint( x, y ); + x += dx; + c++; + } + i = itemList.next(); + } + dx = itemSize( &addItem ).width(); + if ( x + dx > width() && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + + return TQPoint( x, y ); +} + +TQPoint MenuBarEditor::snapToItem( const TQPoint & pos ) +{ + int x = borderSize(); + int y = 0; + int dx = 0; + + MenuBarEditorItem * n = itemList.first(); + + while ( n ) { + if ( n->isVisible() ) { + dx = itemSize( n ).width(); + if ( x + dx > width() && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + if ( pos.y() > y && + pos.y() < y + itemHeight && + pos.x() < x + dx / 2 ) { + return TQPoint( x, y ); + } + x += dx; + } + n = itemList.next(); + } + + return TQPoint( x, y ); +} + +void MenuBarEditor::dropInPlace( MenuBarEditorItem * i, const TQPoint & pos ) +{ + int x = borderSize(); + int y = 0; + int dx = 0; + int idx = 0; + + MenuBarEditorItem * n = itemList.first(); + + while ( n ) { + if ( n->isVisible() ) { + dx = itemSize( n ).width(); + if ( x + dx > width() && x > borderSize() ) { + y += itemHeight; + x = borderSize(); + } + if ( pos.y() > y && + pos.y() < y + itemHeight && + pos.x() < x + dx / 2 ) + break; + x += dx; + } + n = itemList.next(); + idx++; + } + + hideItem(); + Command * cmd = 0; + int iidx = itemList.findRef( i ); + if ( iidx != -1 ) { // internal dnd + cmd = new MoveMenuCommand( i18n( "Item Dragged" ), formWnd, this, iidx, idx ); + item( iidx )->setVisible( TRUE ); + } else { + cmd = new AddMenuCommand( i18n( "Add Menu" ), formWnd, this, i, idx ); + dropConfirmed = TRUE; // let mouseMoveEvent set the item visible + } + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + currentIndex = ( iidx >= 0 && iidx < idx ) ? idx - 1 : idx; + showItem(); +} + + +void MenuBarEditor::safeDec() +{ + do { + currentIndex--; + } while ( currentIndex > 0 && !( item( currentIndex )->isVisible() ) ); +} + +void MenuBarEditor::safeInc() +{ + int max = (int)itemList.count(); + if ( !hasSeparator ) + max += 1; + if ( currentIndex < max ) { + do { + currentIndex++; + // skip invisible items + } while ( currentIndex < max && !( item( currentIndex )->isVisible() ) ); + } +} + +void MenuBarEditor::navigateLeft( bool ctrl ) +{ + // FIXME: handle invisible items + if ( currentIndex > 0 ) { + hideItem(); + if ( ctrl ) { + ExchangeMenuCommand * cmd = new ExchangeMenuCommand( i18n( "Move Menu Left" ), + formWnd, + this, + currentIndex, + currentIndex - 1 ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + safeDec(); + } else { + safeDec(); + } + showItem(); + } + update(); +} + +void MenuBarEditor::navigateRight( bool ctrl ) +{ +// FIXME: handle invisible items + hideItem(); + if ( ctrl ) { + if ( currentIndex < ( (int)itemList.count() - 1 ) ) { + ExchangeMenuCommand * cmd = new ExchangeMenuCommand( i18n( "Move Menu Right" ), + formWnd, + this, + currentIndex, + currentIndex + 1 ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + safeInc(); + } + } else { + safeInc(); + } + showItem(); + update(); +} + +void MenuBarEditor::enterEditMode() +{ + if ( currentIndex > (int)itemList.count() ) { + insertSeparator(); + } else { + showLineEdit(); + } +} + +void MenuBarEditor::leaveEditMode() +{ + MenuBarEditorItem * i = 0; + if ( currentIndex >= (int)itemList.count() ) { + i = createItem(); + // do not put rename on cmd stack + RenameMenuCommand rename( i18n( "Rename Menu" ), formWnd, this, lineEdit->text(), i ); + rename.execute(); + } else { + i = itemList.at( currentIndex ); + RenameMenuCommand * cmd = + new RenameMenuCommand( i18n( "Rename Menu" ), formWnd, this, lineEdit->text(), i ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + showItem(); +} + +TQPixmap MenuBarEditor::createTextPixmap( const TQString &text ) +{ + TQSize sz( fontMetrics().boundingRect( text ).size() ); + TQPixmap pix( sz.width() + 20, sz.height() * 2 ); + pix.fill( white ); + TQPainter p( &pix, this ); + p.drawText( 2, 0, pix.width(), pix.height(), 0, text ); + p.end(); + TQBitmap bm( pix.size() ); + bm.fill( color0 ); + p.begin( &bm ); + p.setPen( color1 ); + p.drawText( 2, 0, pix.width(), pix.height(), 0, text ); + p.end(); + pix.setMask( bm ); + return pix; +} diff --git a/kdevdesigner/designer/menubareditor.h b/kdevdesigner/designer/menubareditor.h new file mode 100644 index 00000000..f6279f2b --- /dev/null +++ b/kdevdesigner/designer/menubareditor.h @@ -0,0 +1,200 @@ +/********************************************************************** +** Copyright (C) 2003 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef MENUBAREDITOR_H +#define MENUBAREDITOR_H + +#include <tqmenubar.h> +#include <tqptrlist.h> + +class PopupMenuEditor; +class MenuBarEditor; +class TQActionGroup; + +class MenuBarEditorItem : public TQObject +{ + Q_OBJECT + + + friend class MenuBarEditor; + + MenuBarEditorItem( MenuBarEditor * bar = 0, TQObject * parent = 0, const char * name = 0 ); + +public: + MenuBarEditorItem( PopupMenuEditor * menu, MenuBarEditor * bar, + TQObject * parent = 0, const char * name = 0); + MenuBarEditorItem( TQActionGroup * actionGroup, MenuBarEditor * bar, + TQObject * parent = 0, const char * name = 0); + MenuBarEditorItem( MenuBarEditorItem * item, + TQObject * parent = 0, const char * name = 0); + ~MenuBarEditorItem() { }; + + PopupMenuEditor * menu() { return popupMenu; } + + void setMenuText( const TQString t ) { text = t; }; + TQString menuText() { return text; } + + void setVisible( bool enable ) { visible = enable; } + bool isVisible() { return visible; } + + void setRemovable( bool enable ) { removable = enable; } + bool isRemovable() { return removable; } + + bool isSeparator() { return separator; } +protected: + void setSeparator( bool enable ) { separator = enable; } + +private: + MenuBarEditor * menuBar; + PopupMenuEditor * popupMenu; + TQString text; + uint visible : 1; + uint separator : 1; + uint removable : 1; +}; + +class TQLineEdit; +class FormWindow; + +class MenuBarEditor : public TQMenuBar +{ + Q_OBJECT + + +public: + MenuBarEditor( FormWindow * fw, TQWidget * parent = 0, const char * name = 0 ); + ~MenuBarEditor(); + + FormWindow * formWindow(); + + MenuBarEditorItem * createItem( int index = -1, bool addToCmdStack = TRUE ); + void insertItem( MenuBarEditorItem * item, int index = -1 ); + void insertItem( TQString text, PopupMenuEditor * menu, int index = -1 ); + void insertItem( TQString text, TQActionGroup * group, int index = -1 ); + + void insertSeparator( int index = -1 ); + + void removeItemAt( int index ); + void removeItem( MenuBarEditorItem * item ); + + int findItem( MenuBarEditorItem * item ); + int findItem( PopupMenuEditor * menu ); + int findItem( TQPoint & pos ); + + MenuBarEditorItem * item( int index = -1 ); + + int count(); + int current(); + + void cut( int index ); + void copy( int index ); + void paste( int index ); + void exchange( int a, int b ); + + void showLineEdit( int index = -1); + void showItem( int index = -1 ); + void hideItem( int index = -1 ); + void focusItem( int index = -1 ); + void deleteItem( int index = -1 ); + + TQSize sizeHint() const; + TQSize minimumSize() const { return sizeHint(); } + TQSize minimumSizeHint() const { return sizeHint(); } + int heightForWidth( int max_width ) const; + + void show(); + + void checkAccels( TQMap<TQChar, TQWidgetList > &accels ); + +public slots: + void cut(); + void copy(); + void paste(); + +protected: + bool eventFilter( TQObject * o, TQEvent * e ); + void paintEvent( TQPaintEvent * e ); + void mousePressEvent( TQMouseEvent * e ); + void mouseDoubleClickEvent( TQMouseEvent * e ); + void mouseMoveEvent( TQMouseEvent * e ); + void dragEnterEvent( TQDragEnterEvent * e ); + void dragLeaveEvent( TQDragLeaveEvent * e ); + void dragMoveEvent( TQDragMoveEvent * e ); + void dropEvent( TQDropEvent * e ); + void keyPressEvent( TQKeyEvent * e ); + void focusOutEvent( TQFocusEvent * e ); + void resizeEvent( TQResizeEvent * e ) { TQFrame::resizeEvent( e ); } + + void resizeInternals(); + + void drawItems( TQPainter & p ); + void drawItem( TQPainter & p, MenuBarEditorItem * i, int idx, TQPoint & pos ); + void drawSeparator( TQPainter & p, TQPoint & pos ); + + TQSize itemSize( MenuBarEditorItem * i ); + void addItemSizeToCoords( MenuBarEditorItem * i, int & x, int & y, int w ); + + TQPoint itemPos( int index ); + TQPoint snapToItem( const TQPoint & pos ); + void dropInPlace( MenuBarEditorItem * i, const TQPoint & pos ); + + void safeDec(); + void safeInc(); + + void navigateLeft( bool ctrl ); + void navigateRight( bool ctrl ); + void enterEditMode(); + void leaveEditMode(); + + TQPixmap createTextPixmap( const TQString &text ); + int borderSize() const { return margin() + 4; } // add 4 pixels to the margin + +private: + FormWindow * formWnd; + TQLineEdit * lineEdit; + TQWidget * dropLine; + TQPtrList<MenuBarEditorItem> itemList; + MenuBarEditorItem addItem; + MenuBarEditorItem addSeparator; + MenuBarEditorItem * draggedItem; + TQPoint mousePressPos; + int currentIndex; + int itemHeight; + int separatorWidth; + bool hideWhenEmpty; + bool hasSeparator; + bool dropConfirmed; + + enum ClipboardOperation { + None = 0, + Cut = 1, + Copy = 2 + }; + static int clipboardOperation; + static MenuBarEditorItem * clipboardItem; +}; + +#endif //MENUBAREDITOR_H diff --git a/kdevdesigner/designer/metadatabase.cpp b/kdevdesigner/designer/metadatabase.cpp new file mode 100644 index 00000000..7aa004d7 --- /dev/null +++ b/kdevdesigner/designer/metadatabase.cpp @@ -0,0 +1,1692 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "metadatabase.h" +#include "widgetfactory.h" +#include "formwindow.h" +#include "parser.h" +#include "widgetdatabase.h" +#include "formfile.h" +#include "propertyobject.h" +#include "project.h" +#include "mainwindow.h" + +#include "kdevdesigner_part.h" + +#include <kiconloader.h> +#include <tdeapplication.h> +#include <kstandarddirs.h> + +#include <tqapplication.h> +#include <tqobject.h> +#include <tqlayout.h> +#include <tqptrdict.h> +#include <tqobjectlist.h> +#include <tqstrlist.h> +#include <tqmetaobject.h> +#include <tqwidgetlist.h> +#include <tqmainwindow.h> +#include <tqregexp.h> +#include <tqpluginmanager_p.h> +#include <tqdatetime.h> +#include <tqfile.h> +#include <tqfileinfo.h> +#include <tqtextstream.h> + +#include <stdlib.h> + +class MetaDataBaseRecord +{ +public: + TQObject *object; + TQStringList changedProperties; + TQMap<TQString,TQVariant> fakeProperties; + TQMap<TQString, TQString> propertyComments; + int spacing, margin; + TQString resizeMode; + TQValueList<MetaDataBase::Connection> connections; + TQValueList<MetaDataBase::Function> functionList; + TQValueList<MetaDataBase::Include> includes; + TQValueList<MetaDataBase::Variable> variables; + TQStringList forwards, sigs; + TQWidgetList tabOrder; + MetaDataBase::MetaInfo metaInfo; + TQCursor cursor; + TQMap<int, TQString> pixmapArguments; + TQMap<int, TQString> pixmapKeys; + TQMap<TQString, TQString> columnFields; + TQValueList<uint> breakPoints; + TQMap<int, TQString> breakPointConditions; + TQString exportMacro; +}; + +static TQPtrDict<MetaDataBaseRecord> *db = 0; +static TQPtrList<MetaDataBase::CustomWidget> *cWidgets = 0; +static bool doUpdate = TRUE; +static TQStringList langList; +static TQStringList editorLangList; +static TQPluginManager<LanguageInterface> *languageInterfaceManager = 0; + +/*! + \class MetaDataBase metadatabase.h + \brief Database which stores meta data of widgets + + The MetaDataBase stores meta information of widgets, which are not + stored directly in widgets (properties). This is e.g. the + information which properties have been modified. +*/ + +MetaDataBase::MetaDataBase() +{ +} + +inline void setupDataBase() +{ + if ( !db || !cWidgets ) { + db = new TQPtrDict<MetaDataBaseRecord>( 1481 ); + db->setAutoDelete( TRUE ); + cWidgets = new TQPtrList<MetaDataBase::CustomWidget>; + cWidgets->setAutoDelete( TRUE ); + } +} + +void MetaDataBase::clearDataBase() +{ + delete db; + db = 0; + delete cWidgets; + cWidgets = 0; +} + +void MetaDataBase::addEntry( TQObject *o ) +{ + if ( !o ) + return; + setupDataBase(); + if ( db->find( o ) ) + return; + MetaDataBaseRecord *r = new MetaDataBaseRecord; + r->object = o; + r->spacing = r->margin = -1; + db->insert( (void*)o, r ); + + WidgetFactory::initChangedProperties( o ); +} + +void MetaDataBase::removeEntry( TQObject *o ) +{ + setupDataBase(); + db->remove( o ); +} + +void MetaDataBase::setPropertyChanged( TQObject *o, const TQString &property, bool changed ) +{ + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) { + ( (PropertyObject*)o )->mdPropertyChanged( property, changed ); + return; + } + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + if ( changed ) { + if ( r->changedProperties.findIndex( property ) == -1 ) + r->changedProperties.append( property ); + } else { + if ( r->changedProperties.findIndex( property ) != -1 ) + r->changedProperties.remove( property ); + } + + if ( doUpdate && + ( property == "hAlign" || property == "vAlign" || property == "wordwrap" ) ) { + doUpdate = FALSE; + setPropertyChanged( o, "alignment", changed || + isPropertyChanged( o, "hAlign" ) || + isPropertyChanged( o, "vAlign" ) || + isPropertyChanged( o, "wordwrap" ) ); + doUpdate = TRUE; + } + + if ( doUpdate && property == "alignment" ) { + doUpdate = FALSE; + setPropertyChanged( o, "hAlign", changed ); + setPropertyChanged( o, "vAlign", changed ); + setPropertyChanged( o, "wordwrap", changed ); + doUpdate = TRUE; + } +} + +bool MetaDataBase::isPropertyChanged( TQObject *o, const TQString &property ) +{ + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) + return ( (PropertyObject*)o )->mdIsPropertyChanged( property ); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return FALSE; + } + + return r->changedProperties.findIndex( property ) != -1; +} + +TQStringList MetaDataBase::changedProperties( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQStringList(); + } + + TQStringList lst( r->changedProperties ); + return lst; +} + +void MetaDataBase::setPropertyComment( TQObject *o, const TQString &property, const TQString &comment ) +{ + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) { + ( (PropertyObject*)o )->mdSetPropertyComment( property, comment ); + return; + } + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->propertyComments.insert( property, comment ); +} + +TQString MetaDataBase::propertyComment( TQObject *o, const TQString &property ) +{ + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) + return ( (PropertyObject*)o )->mdPropertyComment( property ); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQString(); + } + + return *r->propertyComments.find( property ); +} + +void MetaDataBase::setFakeProperty( TQObject *o, const TQString &property, const TQVariant& value ) +{ + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) { + ( (PropertyObject*)o )->mdSetFakeProperty( property, value ); + return; + } + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + r->fakeProperties[property] = value; +} + +TQVariant MetaDataBase::fakeProperty( TQObject * o, const TQString &property) +{ + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) + return ( (PropertyObject*)o )->mdFakeProperty( property ); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQVariant(); + } + TQMap<TQString, TQVariant>::Iterator it = r->fakeProperties.find( property ); + if ( it != r->fakeProperties.end() ) + return r->fakeProperties[property]; + return WidgetFactory::defaultValue( o, property ); + +} + +TQMap<TQString,TQVariant>* MetaDataBase::fakeProperties( TQObject* o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return 0; + } + return &r->fakeProperties; +} + +void MetaDataBase::setSpacing( TQObject *o, int spacing ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r || !o->isWidgetType() ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->spacing = spacing; + TQLayout * layout = 0; + WidgetFactory::layoutType( (TQWidget*)o, layout ); + if ( layout ) { + int spadef = 6; + if ( MainWindow::self->formWindow() ) + spadef = MainWindow::self->formWindow()->layoutDefaultSpacing(); + if ( spacing == -1 ) + layout->setSpacing( spadef ); + else + layout->setSpacing( spacing ); + } +} + +int MetaDataBase::spacing( TQObject *o ) +{ + if ( !o ) + return -1; + setupDataBase(); + if ( ::tqqt_cast<TQMainWindow*>(o) ) + o = TQT_TQOBJECT(( (TQMainWindow*)o )->centralWidget()); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r || !o->isWidgetType() ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return -1; + } + + return r->spacing; +} + +void MetaDataBase::setMargin( TQObject *o, int margin ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r || !o->isWidgetType() ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->margin = margin; + TQLayout * layout = 0; + WidgetFactory::layoutType( (TQWidget*)o, layout ); + + bool isInnerLayout = TRUE; + + TQWidget *widget = (TQWidget*)o; + if ( widget && !::tqqt_cast<TQLayoutWidget*>(widget) && + ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(widget) ) ) ) || + widget && widget->parentWidget() && ::tqqt_cast<FormWindow*>(widget->parentWidget()) ) ) + isInnerLayout = FALSE; + + + if ( layout ) { + int mardef = 11; + if ( MainWindow::self->formWindow() ) + mardef = MainWindow::self->formWindow()->layoutDefaultMargin(); + if ( margin == -1 ) { + if ( isInnerLayout ) + layout->setMargin( 1 ); + else + layout->setMargin( TQMAX( 1, mardef ) ); + } + else + layout->setMargin( TQMAX( 1, margin ) ); + } +} + +int MetaDataBase::margin( TQObject *o ) +{ + if ( !o ) + return -1; + setupDataBase(); + if ( ::tqqt_cast<TQMainWindow*>(o) ) + o = TQT_TQOBJECT(( (TQMainWindow*)o )->centralWidget()); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r || !o->isWidgetType() ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return -1; + } + return r->margin; +} + +void MetaDataBase::setResizeMode( TQObject *o, const TQString &mode ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r || !o->isWidgetType() ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->resizeMode = mode; +} + +TQString MetaDataBase::resizeMode( TQObject *o ) +{ + if ( !o ) + return TQString(); + setupDataBase(); + if ( ::tqqt_cast<TQMainWindow*>(o) ) + o = TQT_TQOBJECT(( (TQMainWindow*)o )->centralWidget()); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r || !o->isWidgetType() ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQString(); + } + return r->resizeMode; +} + +void MetaDataBase::addConnection( TQObject *o, TQObject *sender, const TQCString &signal, + TQObject *receiver, const TQCString &slot, bool addCode ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + if ( !(sender && receiver) ) + return; + Connection conn; + conn.sender = sender; + conn.signal = signal; + conn.receiver = receiver; + conn.slot = slot; + r->connections.append( conn ); + if ( addCode ) { + TQString rec = receiver->name(); + if ( ::tqqt_cast<FormWindow*>(o) && TQT_BASE_OBJECT(receiver) ==( (FormWindow*)o )->mainContainer() ) + rec = "this"; + TQString sen = sender->name(); + if ( ::tqqt_cast<FormWindow*>(o) && TQT_BASE_OBJECT(sender) ==( (FormWindow*)o )->mainContainer() ) + sen = "this"; + FormFile *ff = 0; + if ( ::tqqt_cast<FormFile*>(o) ) + ff = (FormFile*)o; + else if ( ::tqqt_cast<FormWindow*>(o) ) + ff = ( (FormWindow*)o )->formFile(); + ff->addConnection( sen, signal, rec, slot ); + } +} + +void MetaDataBase::removeConnection( TQObject *o, TQObject *sender, const TQCString &signal, + TQObject *receiver, const TQCString &slot ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + if ( !(sender && receiver) ) + return; + for ( TQValueList<Connection>::Iterator it = r->connections.begin(); it != r->connections.end(); ++it ) { + Connection conn = *it; + if ( TQT_BASE_OBJECT(conn.sender) ==sender && + conn.signal == signal && + TQT_BASE_OBJECT(conn.receiver) ==receiver && + conn.slot == slot ) { + r->connections.remove( it ); + break; + } + } + if ( ::tqqt_cast<FormWindow*>(o) ) { + TQString rec = receiver->name(); + if ( TQT_BASE_OBJECT(receiver) ==( (FormWindow*)o )->mainContainer() ) + rec = "this"; + ( (FormWindow*)o )->formFile()->removeConnection( sender->name(), signal, rec, slot ); + } +} + +void MetaDataBase::setupConnections( TQObject *o, const TQValueList<LanguageInterface::Connection> &conns ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + if ( !::tqqt_cast<FormFile*>(o) ) + return; + + FormFile *formfile = (FormFile*)o; + + r->connections.clear(); + + for ( TQValueList<LanguageInterface::Connection>::ConstIterator cit = conns.begin(); + cit != conns.end(); ++cit ) { + // #### get the correct sender object out of Bla.Blub.sender + TQString senderName = (*cit).sender; + if ( senderName.find( '.' ) != -1 ) + senderName = senderName.mid( senderName.findRev( '.' ) + 1 ); + TQObject *sender = 0; + if ( formfile->formWindow() ) + sender = formfile->formWindow()->child( senderName ); + if ( !sender && formfile->isFake() ) + sender = formfile->project()->objectForFakeFormFile( formfile ); + if ( !sender && senderName == "this" ) + sender = formfile->formWindow() ? + TQT_TQOBJECT(formfile->formWindow()->mainContainer()) : + TQT_TQOBJECT(formfile->project()->objectForFakeFormFile( formfile )); + if ( !sender ) + continue; + MetaDataBase::addConnection( formfile->formWindow() ? + (TQObject*)formfile->formWindow() : + (TQObject*)formfile, + sender, + (*cit).signal.latin1(), + formfile->formWindow() ? + TQT_TQOBJECT(formfile->formWindow()->mainContainer()) : + TQT_TQOBJECT(formfile->project()->objectForFakeFormFile( formfile )), + (*cit).slot.latin1(), + FALSE ); + } +} + +bool MetaDataBase::hasConnection( TQObject *o, TQObject *sender, const TQCString &signal, + TQObject *receiver, const TQCString &slot ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return FALSE; + } + + for ( TQValueList<Connection>::Iterator it = r->connections.begin(); it != r->connections.end(); ++it ) { + Connection conn = *it; + if ( TQT_BASE_OBJECT(conn.sender) ==sender && + conn.signal == signal && + TQT_BASE_OBJECT(conn.receiver) ==receiver && + conn.slot == slot ) + return TRUE; + } + return FALSE; +} + + +TQValueList<MetaDataBase::Connection> MetaDataBase::connections( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<Connection>(); + } + return r->connections; +} + +TQValueList<MetaDataBase::Connection> MetaDataBase::connections( TQObject *o, TQObject *sender, + TQObject *receiver ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<Connection>(); + } + TQValueList<Connection>::Iterator it = r->connections.begin(); + TQValueList<Connection> ret; + TQValueList<Connection>::Iterator conn; + while ( ( conn = it ) != r->connections.end() ) { + ++it; + if ( TQT_BASE_OBJECT((*conn).sender) ==sender && + TQT_BASE_OBJECT((*conn).receiver) ==receiver ) + ret << *conn; + } + + return ret; +} + +TQValueList<MetaDataBase::Connection> MetaDataBase::connections( TQObject *o, TQObject *object ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<Connection>(); + } + TQValueList<Connection>::Iterator it = r->connections.begin(); + TQValueList<Connection> ret; + TQValueList<Connection>::Iterator conn; + while ( ( conn = it ) != r->connections.end() ) { + ++it; + if ( TQT_BASE_OBJECT((*conn).sender) ==object || + TQT_BASE_OBJECT((*conn).receiver) ==object ) + ret << *conn; + } + return ret; +} + +void MetaDataBase::doConnections( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + TQObject *sender = 0, *receiver = 0; + TQObjectList *l = 0; + TQValueList<Connection>::Iterator it = r->connections.begin(); + for ( ; it != r->connections.end(); ++it ) { + Connection conn = *it; + if ( qstrcmp( conn.sender->name(), o->name() ) == 0 ) { + sender = o; + } else { + l = o->queryList( 0, conn.sender->name(), FALSE ); + if ( !l || !l->first() ) { + delete l; + continue; + } + sender = l->first(); + delete l; + } + if ( qstrcmp( conn.receiver->name(), o->name() ) == 0 ) { + receiver = o; + } else { + l = o->queryList( 0, conn.receiver->name(), FALSE ); + if ( !l || !l->first() ) { + delete l; + continue; + } + receiver = l->first(); + delete l; + } + TQString s = "2""%1"; + s = s.arg( conn.signal.data() ); + TQString s2 = "1""%1"; + s2 = s2.arg( conn.slot.data() ); + + TQStrList signalList = sender->metaObject()->signalNames( TRUE ); + TQStrList slotList = receiver->metaObject()->slotNames( TRUE ); + + // avoid warnings + if ( signalList.find( conn.signal ) == -1 || + slotList.find( conn.slot ) == -1 ) + continue; + + TQObject::connect( sender, s, receiver, s2 ); + } +} + +bool MetaDataBase::hasSlot( TQObject *o, const TQCString &slot, bool onlyCustom ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return FALSE; + } + + if ( !onlyCustom ) { + TQStrList slotList = o->metaObject()->slotNames( TRUE ); + if ( slotList.find( slot ) != -1 ) + return TRUE; + + if ( ::tqqt_cast<FormWindow*>(o) ) { + o = TQT_TQOBJECT(( (FormWindow*)o )->mainContainer()); + slotList = o->metaObject()->slotNames( TRUE ); + if ( slotList.find( slot ) != -1 ) + return TRUE; + } + + //if ( ::tqqt_cast<CustomWidget*>(o) ) { + if ( o->inherits( "CustomWidget" ) ) { + MetaDataBase::CustomWidget *w = ( (::CustomWidget*)o )->customWidget(); + for ( TQValueList<Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) { + TQCString s = (*it).function; + if ( !s.data() ) + continue; + if ( s == slot ) + return TRUE; + } + } + } + + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + Function f = *it; + if ( normalizeFunction( f.function ) == normalizeFunction( slot ) && f.type == "slot" ) + return TRUE; + } + + return FALSE; +} + +bool MetaDataBase::isSlotUsed( TQObject *o, const TQCString &slot ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return FALSE; + } + + TQValueList<Connection> conns = connections( o ); + for ( TQValueList<Connection>::Iterator it = conns.begin(); it != conns.end(); ++it ) { + if ( (*it).slot == slot ) + return TRUE; + } + return FALSE; +} + + +void MetaDataBase::addFunction( TQObject *o, const TQCString &function, const TQString &specifier, + const TQString &access, const TQString &type, const TQString &language, + const TQString &returnType ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + Function f; + f.function = function; + f.specifier = specifier; + f.access = access; + f.type = type; + f.language = language; + f.returnType = returnType; + TQValueList<MetaDataBase::Function>::Iterator it = r->functionList.find( f ); + if ( it != r->functionList.end() ) + r->functionList.remove( it ); + r->functionList.append( f ); + ( (FormWindow*)o )->formFile()->addFunctionCode( f ); +} + +void MetaDataBase::setFunctionList( TQObject *o, const TQValueList<Function> &functionList ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + r->functionList = functionList; +} + +void MetaDataBase::removeFunction( TQObject *o, const TQCString &function, const TQString &specifier, + const TQString &access, const TQString &type, const TQString &language, + const TQString &returnType ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + if ( MetaDataBase::normalizeFunction( (*it).function ) == + MetaDataBase::normalizeFunction( function ) && + (*it).specifier == specifier && + (*it).access == access && + (*it).type == type && + ( language.isEmpty() || (*it).language == language ) && + ( returnType.isEmpty() || (*it).returnType == returnType ) ) { + ( (FormWindow*)o )->formFile()->removeFunctionCode( *it ); + r->functionList.remove( it ); + break; + } + } +} + +void MetaDataBase::removeFunction( TQObject *o, const TQString &function ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + if ( normalizeFunction( (*it).function ) == normalizeFunction( function ) ) { + ( (FormWindow*)o )->formFile()->removeFunctionCode( *it ); + r->functionList.remove( it ); + break; + } + } +} + +TQValueList<MetaDataBase::Function> MetaDataBase::functionList( TQObject *o, bool onlyFunctions ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<Function>(); + } + if ( !onlyFunctions ) + return r->functionList; + TQValueList<Function> fList; + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + if ( (*it).type == "function" ) + fList.append( *it ); + } + return fList; +} + +TQValueList<MetaDataBase::Function> MetaDataBase::slotList( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<Function>(); + } + TQValueList<Function> slotList; + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + if ( (*it).type == "slot" ) + slotList.append( *it ); + } + return slotList; +} + +void MetaDataBase::changeFunction( TQObject *o, const TQString &function, const TQString &newName, + const TQString &returnType ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + Function f = *it; + if ( normalizeFunction( f.function ) == normalizeFunction( function ) ) { + (*it).function = newName; + if ( !returnType.isNull() ) + (*it).returnType = returnType; + return; + } + } +} + +void MetaDataBase::changeFunctionAttributes( TQObject *o, const TQString &oldName, const TQString &newName, + const TQString &specifier, const TQString &access, + const TQString &type, const TQString &language, + const TQString &returnType ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + Function f = *it; + if ( normalizeFunction( f.function ) == normalizeFunction( oldName ) ) { + (*it).function = newName; + (*it).specifier = specifier; + (*it).access = access; + (*it).type = type; + (*it).language = language; + (*it).returnType = returnType; + return; + } + } +} + +bool MetaDataBase::hasFunction( TQObject *o, const TQCString &function, bool onlyCustom ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return FALSE; + } + + if ( !onlyCustom ) { + TQStrList functionList = o->metaObject()->slotNames( TRUE ); + if ( functionList.find( function ) != -1 ) + return TRUE; + + if ( ::tqqt_cast<FormWindow*>(o) ) { + o = TQT_TQOBJECT(( (FormWindow*)o )->mainContainer()); + functionList = o->metaObject()->slotNames( TRUE ); + if ( functionList.find( function ) != -1 ) + return TRUE; + } + + //if ( ::tqqt_cast<CustomWidget*>(o) ) { + if ( o->inherits( "CustomWidget" ) ) { + MetaDataBase::CustomWidget *w = ( (::CustomWidget*)o )->customWidget(); + for ( TQValueList<Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) { + TQCString s = (*it).function; + if ( !s.data() ) + continue; + if ( s == function ) + return TRUE; + } + } + } + + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + Function f = *it; + if ( normalizeFunction( f.function ) == normalizeFunction( function ) ) + return TRUE; + } + + return FALSE; +} + +TQString MetaDataBase::languageOfFunction( TQObject *o, const TQCString &function ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQString(); + } + + TQString fu = normalizeFunction( function ); + for ( TQValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) { + if ( fu == normalizeFunction( (*it).function ) ) + return (*it).language; + } + return TQString(); +} + +bool MetaDataBase::addCustomWidget( CustomWidget *wid ) +{ + setupDataBase(); + + for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) { + if ( *wid == *w ) { + for ( TQValueList<TQCString>::ConstIterator it = wid->lstSignals.begin(); it != wid->lstSignals.end(); ++it ) { + if ( !w->hasSignal( *it ) ) + w->lstSignals.append( *it ); + } + for ( TQValueList<Function>::ConstIterator it2 = wid->lstSlots.begin(); it2 != wid->lstSlots.end(); ++it2 ) { + if ( !w->hasSlot( MetaDataBase::normalizeFunction( (*it2).function ).latin1() ) ) + w->lstSlots.append( *it2 ); + } + for ( TQValueList<Property>::ConstIterator it3 = wid->lstProperties.begin(); it3 != wid->lstProperties.end(); ++it3 ) { + if ( !w->hasProperty( (*it3).property ) ) + w->lstProperties.append( *it3 ); + } + delete wid; + return FALSE; + } + } + + + WidgetDatabaseRecord *r = new WidgetDatabaseRecord; + r->name = wid->className; + r->group = WidgetDatabase::widgetGroup( "Custom" ); + r->toolTip = wid->className; + r->icon = new TQIconSet( *wid->pixmap, *wid->pixmap ); + r->isContainer = wid->isContainer; + wid->id = WidgetDatabase::addCustomWidget( r ); + cWidgets->append( wid ); + return TRUE; +} + +void MetaDataBase::removeCustomWidget( CustomWidget *w ) +{ + cWidgets->removeRef( w ); +} + +TQPtrList<MetaDataBase::CustomWidget> *MetaDataBase::customWidgets() +{ + setupDataBase(); + return cWidgets; +} + +MetaDataBase::CustomWidget *MetaDataBase::customWidget( int id ) +{ + for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) { + if ( id == w->id ) + return w; + } + return 0; +} + +bool MetaDataBase::isWidgetNameUsed( CustomWidget *wid ) +{ + for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) { + if ( w == wid ) + continue; + if ( wid->className == w->className ) + return TRUE; + } + return FALSE; +} + +bool MetaDataBase::hasCustomWidget( const TQString &className ) +{ + for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) { + if ( w->className == className ) + return TRUE; + } + return FALSE; +} + +void MetaDataBase::setTabOrder( TQWidget *w, const TQWidgetList &order ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*) w ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + w, w->name(), w->className() ); + return; + } + + r->tabOrder = order; +} + +TQWidgetList MetaDataBase::tabOrder( TQWidget *w ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*) w ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + w, w->name(), w->className() ); + return TQWidgetList(); + } + + return r->tabOrder; +} + +void MetaDataBase::setIncludes( TQObject *o, const TQValueList<Include> &incs ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->includes = incs; +} + +TQValueList<MetaDataBase::Include> MetaDataBase::includes( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<Include>(); + } + + return r->includes; +} + +void MetaDataBase::setForwards( TQObject *o, const TQStringList &fwds ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->forwards = fwds; +} + +TQStringList MetaDataBase::forwards( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQStringList(); + } + + return r->forwards; +} + +void MetaDataBase::setVariables( TQObject *o, const TQValueList<Variable> &vars ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->variables = vars; +} + +void MetaDataBase::addVariable( TQObject *o, const TQString &name, const TQString &access ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + Variable v; + v.varName = name; + v.varAccess = access; + r->variables << v; +} + +void MetaDataBase::removeVariable( TQObject *o, const TQString &name ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + TQValueList<Variable>::Iterator it = r->variables.begin(); + for ( ; it != r->variables.end(); ++it ) { + if ( (*it).varName == name ) { + r->variables.remove( it ); + break; + } + } +} + +TQValueList<MetaDataBase::Variable> MetaDataBase::variables( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<MetaDataBase::Variable>(); + } + + return r->variables; +} + +bool MetaDataBase::hasVariable( TQObject *o, const TQString &name ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return FALSE; + } + + TQValueList<Variable>::Iterator it = r->variables.begin(); + for ( ; it != r->variables.end(); ++it ) { + if ( extractVariableName( name ) == extractVariableName( (*it).varName ) ) + return TRUE; + } + return FALSE; +} + +TQString MetaDataBase::extractVariableName( const TQString &name ) +{ + TQString n = name.right( name.length() - name.findRev( ' ' ) - 1 ); + if ( n[ 0 ] == '*' || n[ 0 ] == '&' ) + n[ 0 ] = ' '; + if ( n[ (int)n.length() - 1 ] == ';' ) + n[ (int)n.length() - 1 ] = ' '; + return n.simplifyWhiteSpace(); +} + +void MetaDataBase::setSignalList( TQObject *o, const TQStringList &sigs ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->sigs.clear(); + + for ( TQStringList::ConstIterator it = sigs.begin(); it != sigs.end(); ++it ) { + TQString s = (*it).simplifyWhiteSpace(); + bool hasSemicolon = s.endsWith( ";" ); + if ( hasSemicolon ) + s = s.left( s.length() - 1 ); + int p = s.find( '(' ); + if ( p < 0 ) + p = s.length(); + int sp = s.find( ' ' ); + if ( sp >= 0 && sp < p ) { + s = s.mid( sp+1 ); + p -= sp + 1; + } + if ( p == (int) s.length() ) + s += "()"; + if ( hasSemicolon ) + s += ";"; + r->sigs << s; + } +} + +TQStringList MetaDataBase::signalList( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQStringList(); + } + + return r->sigs; +} + +void MetaDataBase::setMetaInfo( TQObject *o, MetaInfo mi ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->metaInfo = mi; +} + +MetaDataBase::MetaInfo MetaDataBase::metaInfo( TQObject *o ) +{ + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return MetaInfo(); + } + + return r->metaInfo; +} + + + + +MetaDataBase::CustomWidget::CustomWidget() +{ + className = "MyCustomWidget"; + includeFile = "mywidget.h"; + includePolicy = Local; + sizeHint = TQSize( -1, -1 ); + pixmap = new TQPixmap( BarIcon( "designer_customwidget.png", KDevDesignerPartFactory::instance() ) ); + id = -1; + sizePolicy = TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ); + isContainer = FALSE; +} + +MetaDataBase::CustomWidget::CustomWidget( const CustomWidget &w ) +{ + className = w.className; + includeFile = w.includeFile; + includePolicy = w.includePolicy; + sizeHint = w.sizeHint; + if ( w.pixmap ) + pixmap = new TQPixmap( *w.pixmap ); + else + pixmap = 0; + id = w.id; + isContainer = w.isContainer; +} + +void MetaDataBase::setCursor( TQWidget *w, const TQCursor &c ) +{ + setupDataBase(); + if ( w->isA( "PropertyObject" ) ) { + ( (PropertyObject*)w )->mdSetCursor( c ); + return; + } + MetaDataBaseRecord *r = db->find( (void*)w ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + w, w->name(), w->className() ); + return; + } + + r->cursor = c; +} + +TQCursor MetaDataBase::cursor( TQWidget *w ) +{ + setupDataBase(); + if ( w->isA( "PropertyObject" ) ) + return ( (PropertyObject*)w )->mdCursor(); + MetaDataBaseRecord *r = db->find( (void*)w ); + if ( !r ) { + w->unsetCursor(); + return w->cursor(); + } + + return r->cursor; +} + +bool MetaDataBase::CustomWidget::operator==( const CustomWidget &w ) const +{ + return className == w.className; +} + +MetaDataBase::CustomWidget &MetaDataBase::CustomWidget::operator=( const CustomWidget &w ) +{ + delete pixmap; + className = w.className; + includeFile = w.includeFile; + includePolicy = w.includePolicy; + sizeHint = w.sizeHint; + if ( w.pixmap ) + pixmap = new TQPixmap( *w.pixmap ); + else + pixmap = 0; + lstSignals = w.lstSignals; + lstSlots = w.lstSlots; + lstProperties = w.lstProperties; + id = w.id; + isContainer = w.isContainer; + return *this; +} + +bool MetaDataBase::CustomWidget::hasSignal( const TQCString &signal ) const +{ + TQStrList sigList = TQWidget::staticMetaObject()->signalNames( TRUE ); + if ( sigList.find( signal ) != -1 ) + return TRUE; + for ( TQValueList<TQCString>::ConstIterator it = lstSignals.begin(); it != lstSignals.end(); ++it ) { + if ( normalizeFunction( *it ) == normalizeFunction( signal ) ) + return TRUE; + } + return FALSE; +} + +bool MetaDataBase::CustomWidget::hasSlot( const TQCString &slot ) const +{ + TQStrList slotList = TQWidget::staticMetaObject()->slotNames( TRUE ); + if ( slotList.find( normalizeFunction( slot ) ) != -1 ) + return TRUE; + + for ( TQValueList<MetaDataBase::Function>::ConstIterator it = lstSlots.begin(); it != lstSlots.end(); ++it ) { + if ( normalizeFunction( (*it).function ) == normalizeFunction( slot ) ) + return TRUE; + } + return FALSE; +} + +bool MetaDataBase::CustomWidget::hasProperty( const TQCString &prop ) const +{ + TQStrList propList = TQWidget::staticMetaObject()->propertyNames( TRUE ); + if ( propList.find( prop ) != -1 ) + return TRUE; + + for ( TQValueList<MetaDataBase::Property>::ConstIterator it = lstProperties.begin(); it != lstProperties.end(); ++it ) { + if ( (*it).property == prop ) + return TRUE; + } + return FALSE; +} + +void MetaDataBase::setPixmapArgument( TQObject *o, int pixmap, const TQString &arg ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->pixmapArguments.remove( pixmap ); + r->pixmapArguments.insert( pixmap, arg ); +} + +TQString MetaDataBase::pixmapArgument( TQObject *o, int pixmap ) +{ + if ( !o ) + return TQString(); + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQString(); + } + + return *r->pixmapArguments.find( pixmap ); +} + +void MetaDataBase::clearPixmapArguments( TQObject *o ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->pixmapArguments.clear(); +} + + +void MetaDataBase::setPixmapKey( TQObject *o, int pixmap, const TQString &arg ) +{ + if ( !o ) + return; + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) { + ( (PropertyObject*)o )->mdSetPixmapKey( pixmap, arg ); + return; + } + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->pixmapKeys.remove( pixmap ); + r->pixmapKeys.insert( pixmap, arg ); +} + +TQString MetaDataBase::pixmapKey( TQObject *o, int pixmap ) +{ + if ( !o ) + return TQString(); + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) + return ( (PropertyObject*)o )->mdPixmapKey( pixmap ); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQString(); + } + + TQString s = *r->pixmapKeys.find( pixmap ); + if ( !s.isNull() ) + return s; + if ( !o->isWidgetType() ) + return s; + TQWidget *w = (TQWidget*)o; + if ( w->icon() ) + return *r->pixmapKeys.find( w->icon()->serialNumber() ); + return s; +} + +void MetaDataBase::clearPixmapKeys( TQObject *o ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->pixmapKeys.clear(); +} + + + +void MetaDataBase::setColumnFields( TQObject *o, const TQMap<TQString, TQString> &columnFields ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->columnFields = columnFields; +} + +TQMap<TQString, TQString> MetaDataBase::columnFields( TQObject *o ) +{ + if ( !o ) + return TQMap<TQString, TQString>(); + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQMap<TQString, TQString>(); + } + + return r->columnFields; +} + +void MetaDataBase::setEditor( const TQStringList &langs ) +{ + editorLangList = langs; +} + +bool MetaDataBase::hasEditor( const TQString &lang ) +{ + return editorLangList.find( lang ) != editorLangList.end(); +} + +void MetaDataBase::setupInterfaceManagers( const TQString &plugDir ) +{ + if ( !languageInterfaceManager ) { + languageInterfaceManager = + new TQPluginManager<LanguageInterface>( IID_Language, + TQApplication::libraryPaths(), +// kapp->dirs()->resourceDirs("qtplugins"), + plugDir ); + + langList = languageInterfaceManager->featureList(); + langList.remove( "C++" ); + langList << "C++"; + } +} + +TQStringList MetaDataBase::languages() +{ + return langList; +} + +TQString MetaDataBase::normalizeFunction( const TQString &f ) +{ + return Parser::cleanArgs( f ); +} + +LanguageInterface *MetaDataBase::languageInterface( const TQString &lang ) +{ + LanguageInterface* iface = 0; + languageInterfaceManager->queryInterface( lang, &iface ); + return iface; +} + +void MetaDataBase::clear( TQObject *o ) +{ + if ( !o ) + return; + setupDataBase(); + db->remove( (void*)o ); + for ( TQPtrDictIterator<TQWidget> it( *( (FormWindow*)o )->widgets() ); it.current(); ++it ) + db->remove( (void*)it.current() ); +} + +void MetaDataBase::setBreakPoints( TQObject *o, const TQValueList<uint> &l ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->breakPoints = l; + + TQMap<int, TQString>::Iterator it = r->breakPointConditions.begin(); + while ( it != r->breakPointConditions.end() ) { + int line = it.key(); + ++it; + if ( r->breakPoints.find( line ) == r->breakPoints.end() ) + r->breakPointConditions.remove( r->breakPointConditions.find( line ) ); + } +} + +TQValueList<uint> MetaDataBase::breakPoints( TQObject *o ) +{ + if ( !o ) + return TQValueList<uint>(); + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQValueList<uint>(); + } + + return r->breakPoints; +} + +void MetaDataBase::setBreakPointCondition( TQObject *o, int line, const TQString &condition ) +{ + if ( !o ) + return; + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + r->breakPointConditions.replace( line, condition ); +} + +TQString MetaDataBase::breakPointCondition( TQObject *o, int line ) +{ + if ( !o ) + return TQString(); + setupDataBase(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return TQString(); + } + TQMap<int, TQString>::Iterator it = r->breakPointConditions.find( line ); + if ( it == r->breakPointConditions.end() ) + return TQString(); + return *it; +} + +void MetaDataBase::setExportMacro( TQObject *o, const TQString ¯o ) +{ + if ( !o ) + return; + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) { + ( (PropertyObject*)o )->mdSetExportMacro( macro ); + return; + } + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return; + } + + r->exportMacro = macro; +} + +TQString MetaDataBase::exportMacro( TQObject *o ) +{ + if ( !o ) + return ""; + setupDataBase(); + if ( o->isA( "PropertyObject" ) ) + return ( (PropertyObject*)o )->mdExportMacro(); + MetaDataBaseRecord *r = db->find( (void*)o ); + if ( !r ) { + tqWarning( "No entry for %p (%s, %s) found in MetaDataBase", + o, o->name(), o->className() ); + return ""; + } + + return r->exportMacro; +} + +bool MetaDataBase::hasObject( TQObject *o ) +{ + return !!db->find( o ); +} diff --git a/kdevdesigner/designer/metadatabase.h b/kdevdesigner/designer/metadatabase.h new file mode 100644 index 00000000..352e10d7 --- /dev/null +++ b/kdevdesigner/designer/metadatabase.h @@ -0,0 +1,269 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef METADATABASE_H +#define METADATABASE_H + +#include <tqvariant.h> +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqmap.h> +#include <tqptrlist.h> +#include <tqsizepolicy.h> +#include <tqsize.h> +#include <tqwidgetlist.h> +#include <tqcursor.h> + +#include "pixmapchooser.h" +#include "../interfaces/languageinterface.h" + +class TQObject; +class TQPixmap; +struct LanguageInterface; + +class MetaDataBase +{ +public: + struct Connection + { + TQObject *sender, *receiver; + TQCString signal, slot; + bool operator==( const Connection &c ) const { + return sender == c.sender && receiver == c.receiver && + signal == c.signal && slot == c.slot ; + } + }; + + struct Function + { + TQString returnType; + TQCString function; + TQString specifier; + TQString access; + TQString type; + TQString language; + bool operator==( const Function &f ) const { + return ( returnType == f.returnType && + function == f.function && + specifier == f.specifier && + access == f.access && + type == f.type && + language == f.language + ); + } + }; + + struct Property + { + TQCString property; + TQString type; + bool operator==( const Property &p ) const { + return property == p.property && + type == p.type; + } + }; + + struct CustomWidget + { + CustomWidget(); + CustomWidget( const CustomWidget &w ); + ~CustomWidget() { delete pixmap; } // inlined to work around 2.7.2.3 bug + bool operator==( const CustomWidget &w ) const; + CustomWidget &operator=( const CustomWidget &w ); + + bool hasSignal( const TQCString &signal ) const; + bool hasSlot( const TQCString &slot ) const; + bool hasProperty( const TQCString &prop ) const; + + enum IncludePolicy { Global, Local }; + TQString className; + TQString includeFile; + IncludePolicy includePolicy; + TQSize sizeHint; + TQSizePolicy sizePolicy; + TQPixmap *pixmap; + TQValueList<TQCString> lstSignals; + TQValueList<Function> lstSlots; + TQValueList<Property> lstProperties; + int id; + bool isContainer; + }; + + struct Include + { + Include() : header(), location(), implDecl( "in implementation" ) {} + TQString header; + TQString location; + bool operator==( const Include &i ) const { + return header == i.header && location == i.location; + } + TQString implDecl; + }; + + struct Variable + { + TQString varName; + TQString varAccess; + bool operator==( const Variable &v ) const { + return varName == v.varName && + varAccess == v.varAccess; + } + }; + + struct MetaInfo + { + MetaInfo() : classNameChanged( FALSE ) { } + TQString className; + bool classNameChanged; + TQString comment; + TQString author; + }; + + MetaDataBase(); + static void clearDataBase(); + + static void addEntry( TQObject *o ); + static void removeEntry( TQObject *o ); + static void setPropertyChanged( TQObject *o, const TQString &property, bool changed ); + static bool isPropertyChanged( TQObject *o, const TQString &property ); + static void setPropertyComment( TQObject *o, const TQString &property, const TQString &comment ); + static TQString propertyComment( TQObject *o, const TQString &property ); + static TQStringList changedProperties( TQObject *o ); + + static void setFakeProperty( TQObject *o, const TQString &property, const TQVariant& value ); + static TQVariant fakeProperty( TQObject * o, const TQString &property ); + static TQMap<TQString,TQVariant>* fakeProperties( TQObject* o ); + + static void setSpacing( TQObject *o, int spacing ); + static int spacing( TQObject *o ); + static void setMargin( TQObject *o, int margin ); + static int margin( TQObject *o ); + + static void setResizeMode( TQObject *o, const TQString &mode ); + static TQString resizeMode( TQObject *o ); + + static void addConnection( TQObject *o, TQObject *sender, const TQCString &signal, + TQObject *receiver, const TQCString &slot, bool addCode = TRUE ); + static void removeConnection( TQObject *o, TQObject *sender, const TQCString &signal, + TQObject *receiver, const TQCString &slot ); + static bool hasConnection( TQObject *o, TQObject *sender, const TQCString &signal, + TQObject *receiver, const TQCString &slot ); + static void setupConnections( TQObject *o, const TQValueList<LanguageInterface::Connection> &conns ); + static TQValueList<Connection> connections( TQObject *o ); + static TQValueList<Connection> connections( TQObject *o, TQObject *sender, TQObject *receiver ); + static TQValueList<Connection> connections( TQObject *o, TQObject *object ); + static void doConnections( TQObject *o ); + + static void addFunction( TQObject *o, const TQCString &function, const TQString &specifier, + const TQString &access, const TQString &type, const TQString &language, + const TQString &returnType ); + static void removeFunction( TQObject *o, const TQCString &function, const TQString &specifier, + const TQString &access, const TQString &type, const TQString &language, + const TQString &returnType ); + static void removeFunction( TQObject *o, const TQString &function ); + static TQValueList<Function> functionList( TQObject *o, bool onlyFunctions = FALSE ); + static TQValueList<Function> slotList( TQObject *o ); + static bool isSlotUsed( TQObject *o, const TQCString &slot ); + static bool hasFunction( TQObject *o, const TQCString &function, bool onlyCustom = FALSE ); + static bool hasSlot( TQObject *o, const TQCString &slot, bool onlyCustom = FALSE ); + static void changeFunction( TQObject *o, const TQString &function, const TQString &newName, + const TQString &returnType ); + static void changeFunctionAttributes( TQObject *o, const TQString &oldName, const TQString &newName, + const TQString &specifier, const TQString &access, + const TQString &type, const TQString &language, + const TQString &returnType ); + static TQString languageOfFunction( TQObject *o, const TQCString &function ); + static void setFunctionList( TQObject *o, const TQValueList<Function> &functionList ); + + + static bool addCustomWidget( CustomWidget *w ); + static void removeCustomWidget( CustomWidget *w ); + static TQPtrList<CustomWidget> *customWidgets(); + static CustomWidget *customWidget( int id ); + static bool isWidgetNameUsed( CustomWidget *w ); + static bool hasCustomWidget( const TQString &className ); + + static void setTabOrder( TQWidget *w, const TQWidgetList &order ); + static TQWidgetList tabOrder( TQWidget *w ); + + static void setIncludes( TQObject *o, const TQValueList<Include> &incs ); + static TQValueList<Include> includes( TQObject *o ); + + static void setForwards( TQObject *o, const TQStringList &fwds ); + static TQStringList forwards( TQObject *o ); + + static void setVariables( TQObject *o, const TQValueList<Variable> &vars ); + static void addVariable( TQObject *o, const TQString &name, const TQString &access ); + static void removeVariable( TQObject *o, const TQString &name ); + static TQValueList<Variable> variables( TQObject *o ); + static bool hasVariable( TQObject *o, const TQString &name ); + static TQString extractVariableName( const TQString &name ); + + static void setSignalList( TQObject *o, const TQStringList &sigs ); + static TQStringList signalList( TQObject *o ); + + static void setMetaInfo( TQObject *o, MetaInfo mi ); + static MetaInfo metaInfo( TQObject *o ); + + static void setCursor( TQWidget *w, const TQCursor &c ); + static TQCursor cursor( TQWidget *w ); + + static void setPixmapArgument( TQObject *o, int pixmap, const TQString &arg ); + static TQString pixmapArgument( TQObject *o, int pixmap ); + static void clearPixmapArguments( TQObject *o ); + + static void setPixmapKey( TQObject *o, int pixmap, const TQString &arg ); + static TQString pixmapKey( TQObject *o, int pixmap ); + static void clearPixmapKeys( TQObject *o ); + + static void setColumnFields( TQObject *o, const TQMap<TQString, TQString> &columnFields ); + static TQMap<TQString, TQString> columnFields( TQObject *o ); + + static void setEditor( const TQStringList &langs ); + static bool hasEditor( const TQString &lang ); + + static void setupInterfaceManagers( const TQString &plugDir ); + static TQStringList languages(); + + static LanguageInterface *languageInterface( const TQString &lang ); + + static TQString normalizeFunction( const TQString &f ); + + static void clear( TQObject *o ); + + static void setBreakPoints( TQObject *o, const TQValueList<uint> &l ); + static void setBreakPointCondition( TQObject *o, int line, const TQString &condition ); + static TQValueList<uint> breakPoints( TQObject *o ); + static TQString breakPointCondition( TQObject *o, int line ); + + static void setExportMacro( TQObject *o, const TQString ¯o ); + static TQString exportMacro( TQObject *o ); + + static bool hasObject( TQObject *o ); + +}; + +#endif diff --git a/kdevdesigner/designer/multilineeditor.ui b/kdevdesigner/designer/multilineeditor.ui new file mode 100644 index 00000000..f0ff2129 --- /dev/null +++ b/kdevdesigner/designer/multilineeditor.ui @@ -0,0 +1,181 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>MultiLineEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQMainWindow"> + <property name="name"> + <cstring>MultiLineEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>598</width> + <height>307</height> + </rect> + </property> + <property name="caption"> + <string>Edit Text</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Multiline Edit</b><p>This is a simple richtext editor. To improve its usability it provides toolbar items for the most common html tags: by clicking on a toolbar item, the corresponding tag will be written to the editor, where you can insert your text. If you have already written some text and want to format it, hilight it and click on the desired button. To improve visualization this editor also supports a simple html-syntax-highlighting scheme.</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>OkButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="on"> + <bool>false</bool> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>applyButton</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>cancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </hbox> +</widget> +<menubar> + <property name="name"> + <cstring>menuBar</cstring> + </property> +</menubar> +<toolbars> +</toolbars> +<connections> + <connection> + <sender>OkButton</sender> + <signal>clicked()</signal> + <receiver>MultiLineEditorBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>applyButton</sender> + <signal>clicked()</signal> + <receiver>MultiLineEditorBase</receiver> + <slot>applyClicked()</slot> + </connection> + <connection> + <sender>cancelButton</sender> + <signal>clicked()</signal> + <receiver>MultiLineEditorBase</receiver> + <slot>cancelClicked()</slot> + </connection> +</connections> +<Q_SLOTS> + <slot>applyClicked()</slot> + <slot>okClicked()</slot> + <slot>cancelClicked()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/multilineeditorimpl.cpp b/kdevdesigner/designer/multilineeditorimpl.cpp new file mode 100644 index 00000000..ef06f77b --- /dev/null +++ b/kdevdesigner/designer/multilineeditorimpl.cpp @@ -0,0 +1,415 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "multilineeditorimpl.h" +#include "formwindow.h" +#include "command.h" +#include "mainwindow.h" +#include "richtextfontdialog.h" +#include "syntaxhighlighter_html.h" +#include "widgetfactory.h" + +#include <kiconloader.h> +#include "kdevdesigner_part.h" + +#include <tqtextedit.h> +#include <tqrichtext_p.h> +#include <tqpushbutton.h> +#include <tqlayout.h> +#include <tqtoolbutton.h> +#include <tqapplication.h> +#include <tqaction.h> +#include <tqmetaobject.h> + +#include <tdelocale.h> + +ToolBarItem::ToolBarItem( TQWidget *parent, TQWidget *toolBar, + const TQString &label, const TQString &tagstr, + const TQIconSet &icon, const TQKeySequence &key ) + : TQAction( parent ) +{ + setIconSet( icon ); + setText( label ); + setAccel( key ); + addTo( toolBar ); + tag = tagstr; + connect( this, TQT_SIGNAL( activated() ), this, TQT_SLOT( wasActivated() ) ); +} + +ToolBarItem::~ToolBarItem() +{ + +} + +void ToolBarItem::wasActivated() +{ + emit clicked( tag ); +} + +TextEdit::TextEdit( TQWidget *parent, const char *name ) + : TQTextEdit( parent, name ) +{ + setTextFormat( TQt::PlainText ); +} + +TQTextParagraph* TextEdit::paragraph() +{ + TQTextCursor *tc = new TQTextCursor( TQTextEdit::document() ); + return tc->paragraph(); +} + + +MultiLineEditor::MultiLineEditor( bool call_static, bool richtextMode, TQWidget *parent, TQWidget *editWidget, + FormWindow *fw, const TQString &text ) + : MultiLineEditorBase( parent, 0, WType_Dialog | WShowModal ), formwindow( fw ), doWrap( FALSE ) +{ + callStatic = call_static; + + if ( callStatic ) + applyButton->hide(); + + textEdit = new TextEdit( centralWidget(), "textedit" ); + Layout4->insertWidget( 0, textEdit ); + + if ( richtextMode ) { + TQPopupMenu *stylesMenu = new TQPopupMenu( this ); + menuBar->insertItem( i18n( "&Styles" ), stylesMenu ); + + basicToolBar = new TQToolBar( i18n( "Basics" ), this, DockTop ); + + ToolBarItem *it = new ToolBarItem( this, basicToolBar, i18n( "Italic" ), + "i", BarIcon( "designer_textitalic.png", KDevDesignerPartFactory::instance() ), CTRL+Key_I ); + it->addTo( stylesMenu ); + connect( it, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *b = new ToolBarItem( this, basicToolBar, i18n( "Bold" ), + "b", BarIcon( "designer_textbold.png", KDevDesignerPartFactory::instance() ), CTRL+Key_B ); + b->addTo( stylesMenu ); + connect( b, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *ul = new ToolBarItem( this, basicToolBar, i18n( "Underline" ), + "u", BarIcon( "designer_textunderline.png" , KDevDesignerPartFactory::instance()), CTRL+Key_U ); + ul->addTo( stylesMenu ); + connect( ul, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *tt = new ToolBarItem( this, basicToolBar, i18n( "Typewriter" ), + "tt", BarIcon( "designer_textteletext.png", KDevDesignerPartFactory::instance() ) ); + tt->addTo( stylesMenu ); + connect( tt, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + basicToolBar->addSeparator(); + + TQPopupMenu *layoutMenu = new TQPopupMenu( this ); + menuBar->insertItem( i18n( "&Layout" ), layoutMenu ); + + TQAction *brAction = new TQAction( this ); + brAction->setIconSet( BarIcon( "designer_textlinebreak.png", KDevDesignerPartFactory::instance() ) ); + brAction->setText( i18n("Break" ) ); + brAction->addTo( basicToolBar ); + brAction->addTo( layoutMenu ); + connect( brAction, TQT_SIGNAL( activated() ) , this, TQT_SLOT( insertBR() ) ); + + ToolBarItem *p = new ToolBarItem( this, basicToolBar, i18n( "Paragraph" ), + "p", BarIcon( "designer_textparagraph.png", KDevDesignerPartFactory::instance() ) ); + p->addTo( layoutMenu ); + connect( p, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + layoutMenu->insertSeparator(); + basicToolBar->addSeparator(); + + ToolBarItem *al = new ToolBarItem( this, basicToolBar, i18n( "Align left" ), + "p align=\"left\"", BarIcon( "designer_textleft.png", KDevDesignerPartFactory::instance() ) ); + al->addTo( layoutMenu ); + connect( al, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *ac = new ToolBarItem( this, basicToolBar, i18n( "Align center" ), + "p align=\"center\"", BarIcon( "designer_textcenter.png", KDevDesignerPartFactory::instance() ) ); + ac->addTo( layoutMenu ); + connect( ac, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *ar = new ToolBarItem( this, basicToolBar, i18n( "Align right" ), + "p align=\"right\"", BarIcon( "designer_textright.png", KDevDesignerPartFactory::instance() ) ); + ar->addTo( layoutMenu ); + connect( ar, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *block = new ToolBarItem( this, basicToolBar, i18n( "Blockquote" ), + "blockquote", BarIcon( "designer_textjustify.png", KDevDesignerPartFactory::instance() ) ); + block->addTo( layoutMenu ); + connect( block, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + + TQPopupMenu *fontMenu = new TQPopupMenu( this ); + menuBar->insertItem( i18n( "&Font" ), fontMenu ); + + fontToolBar = new TQToolBar( "Fonts", this, DockTop ); + + TQAction *fontAction = new TQAction( this ); + fontAction->setIconSet( BarIcon( "designer_textfont.png", KDevDesignerPartFactory::instance() ) ); + fontAction->setText( i18n("Font" ) ); + fontAction->addTo( fontToolBar ); + fontAction->addTo( fontMenu ); + connect( fontAction, TQT_SIGNAL( activated() ) , this, TQT_SLOT( showFontDialog() ) ); + + + ToolBarItem *fp1 = new ToolBarItem( this, fontToolBar, i18n( "Fontsize +1" ), + "font size=\"+1\"", BarIcon( "designer_textlarger.png", KDevDesignerPartFactory::instance() ) ); + connect( fp1, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *fm1 = new ToolBarItem( this, fontToolBar, i18n( "Fontsize -1" ), + "font size=\"-1\"", BarIcon( "designer_textsmaller.png", KDevDesignerPartFactory::instance() ) ); + connect( fm1, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *h1 = new ToolBarItem( this, fontToolBar, i18n( "Headline 1" ), + "h1", BarIcon( "designer_texth1.png", KDevDesignerPartFactory::instance() ) ); + connect( h1, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *h2 = new ToolBarItem( this, fontToolBar, i18n( "Headline 2" ), + "h2", BarIcon( "designer_texth2.png", KDevDesignerPartFactory::instance() ) ); + connect( h2, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + ToolBarItem *h3 = new ToolBarItem( this, fontToolBar, i18n( "Headline 3" ), + "h3", BarIcon( "designer_texth3.png", KDevDesignerPartFactory::instance() ) ); + connect( h3, TQT_SIGNAL( clicked( const TQString& ) ), + this, TQT_SLOT( insertTags( const TQString& ))); + + TQPopupMenu *optionsMenu = new TQPopupMenu( this ); + menuBar->insertItem( i18n( "O&ptions" ), optionsMenu ); + + optionsToolBar = new TQToolBar( "Options", this, DockTop ); + wrapAction = new TQAction( this ); + wrapAction->setToggleAction( TRUE ); + wrapAction->setIconSet( BarIcon( "designer_wordwrap.png", KDevDesignerPartFactory::instance() ) ); + wrapAction->setText( i18n( "Word Wrapping" ) ); + wrapAction->addTo( optionsToolBar ); + wrapAction->addTo( optionsMenu ); + connect( wrapAction, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( changeWrapMode( bool ) ) ); + + oldDoWrap = doWrap; + wrapAction->setOn( doWrap ); + + connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + textEdit->document()->setFormatter( new TQTextFormatterBreakInWords ); + textEdit->document()->setUseFormatCollection( FALSE ); + textEdit->document()->setPreProcessor( new SyntaxHighlighter_HTML ); + + if ( !callStatic && ::tqqt_cast<TQTextEdit*>(editWidget) ) { + mlined = (TQTextEdit*)editWidget; + mlined->setReadOnly( TRUE ); + + const TQMetaProperty *wordWrap = mlined->metaObject()->property( + mlined->metaObject()->findProperty( "wordWrap", TRUE ), TRUE ); + oldWrapMode = 0; + oldWrapString = "NoWrap"; + if ( wordWrap ) { + oldWrapMode = mlined->property( "wordWrap" ); + oldWrapString = TQString( wordWrap->valueToKey( oldWrapMode.toInt() ) ); + if ( oldWrapString != "NoWrap" ) + doWrap = TRUE; + } + textEdit->setAlignment( mlined->alignment() ); + textEdit->setWordWrap( mlined->wordWrap() ); + textEdit->setWrapColumnOrWidth( mlined->wrapColumnOrWidth() ); + textEdit->setWrapPolicy( mlined->wrapPolicy() ); + textEdit->setText( mlined->text() ); + if ( !mlined->text().isEmpty() ) + textEdit->selectAll(); + } else { + textEdit->setText( text ); + textEdit->selectAll(); + } + } else { + textEdit->setText( text ); + textEdit->selectAll(); + } + textEdit->setFocus(); +} + +int MultiLineEditor::exec() +{ + res = 1; + show(); + tqApp->enter_loop(); + return res; +} + +void MultiLineEditor::okClicked() +{ + applyClicked(); + close(); +} + +void MultiLineEditor::applyClicked() +{ + if ( !callStatic ) { + PopulateMultiLineEditCommand *cmd = new PopulateMultiLineEditCommand( i18n( "Set the Text of '%1'" ).arg( mlined->name() ), + formwindow, mlined, textEdit->text() ); + cmd->execute(); + formwindow->commandHistory()->addCommand( cmd ); + + if ( oldDoWrap != doWrap ) { + TQString pn( i18n( "Set 'wordWrap' of '%2'" ).arg( mlined->name() ) ); + SetPropertyCommand *propcmd; + if ( doWrap ) + propcmd = new SetPropertyCommand( pn, formwindow, + TQT_TQOBJECT(mlined), MainWindow::self->propertyeditor(), + "wordWrap", WidgetFactory::property( TQT_TQOBJECT(mlined), "wordWrap" ), + TQVariant( 1 ), "WidgetWidth", oldWrapString ); + else + propcmd = new SetPropertyCommand( pn, formwindow, + TQT_TQOBJECT(mlined), MainWindow::self->propertyeditor(), + "wordWrap", WidgetFactory::property( TQT_TQOBJECT(mlined), "wordWrap" ), + TQVariant( 0 ), "NoWrap", oldWrapString ); + + propcmd->execute(); + formwindow->commandHistory()->addCommand( propcmd, TRUE ); + } + textEdit->setFocus(); + } + else { + staticText = textEdit->text(); + } +} + +void MultiLineEditor::cancelClicked() +{ + res = 0; + close(); +} + +void MultiLineEditor::closeEvent( TQCloseEvent *e ) +{ + tqApp->exit_loop(); + MultiLineEditorBase::closeEvent( e ); +} + +void MultiLineEditor::insertTags( const TQString &tag ) +{ + int pfrom, pto, ifrom, ito; + TQString tagend( tag.simplifyWhiteSpace() ); + tagend.remove( tagend.find( ' ', 0 ), tagend.length() ); + if ( textEdit->hasSelectedText() ) { + textEdit->getSelection( &pfrom, &ifrom, &pto, &ito ); + TQString buf = textEdit->selectedText(); + buf = TQString( "<%1>%3</%2>" ).arg( tag ).arg( tagend ).arg( buf ); + textEdit->removeSelectedText(); + textEdit->insertAt( buf, pfrom, ifrom ); + textEdit->setCursorPosition( pto, ito + 2 + tag.length() ); + } + else { + int para, index; + textEdit->getCursorPosition( ¶, &index ); + textEdit->insert( TQString( "<%1></%2>" ).arg( tag ).arg( tagend ) ); + index += 2 + tag.length(); + textEdit->setCursorPosition( para, index ); + } +} + +void MultiLineEditor::insertBR() +{ + textEdit->insert( "<br>" ); +} + +void MultiLineEditor::showFontDialog() +{ + bool selText = FALSE; + int pfrom, pto, ifrom, ito; + if ( textEdit->hasSelectedText() ) { + textEdit->getSelection( &pfrom, &ifrom, &pto, &ito ); + selText = TRUE; + } + RichTextFontDialog *fd = new RichTextFontDialog( this ); + if ( fd->exec() == TQDialog::Accepted ) { + TQString size, font; + if ( fd->getSize() != "0" ) + size = "size=\"" + fd->getSize() + "\""; + TQString color; + if ( !fd->getColor().isEmpty() && fd->getColor() != "#000000" ) + color = "color=\"" + fd->getColor() + "\""; + if ( fd->getFont() != "default" ) + font = "face=\"" + fd->getFont() + "\""; + TQString tag( TQString( "font %1 %2 %3" ) + .arg( color ).arg( size ).arg( font ) ); + + if ( selText ) + textEdit->setSelection( pfrom, ifrom, pto, ito ); + insertTags( tag.simplifyWhiteSpace() ); + } + else if ( selText ) + textEdit->setSelection( pfrom, ifrom, pto, ito ); +} + +TQString MultiLineEditor::getStaticText() +{ + return staticText.stripWhiteSpace(); +} + +TQString MultiLineEditor::getText( TQWidget *parent, const TQString &text, bool richtextMode, bool *useWrap ) +{ + MultiLineEditor medit( TRUE, richtextMode, parent, 0, 0, text ); + if ( richtextMode ) + medit.setUseWrapping( *useWrap ); + if ( medit.exec() == TQDialog::Accepted ) { + *useWrap = medit.useWrapping(); + return medit.getStaticText(); + } + return TQString(); +} + +void MultiLineEditor::changeWrapMode( bool b ) +{ + doWrap = b; + if ( doWrap && !callStatic ) { + if ( oldDoWrap ) + textEdit->setProperty( "wordWrap", oldWrapMode ); + else + textEdit->setWordWrap( TQTextEdit::WidgetWidth ); + } else { + textEdit->setWordWrap( TQTextEdit::NoWrap ); + } +} + +bool MultiLineEditor::useWrapping() const +{ + return doWrap; +} + +void MultiLineEditor::setUseWrapping( bool b ) +{ + doWrap = b; + wrapAction->setOn( doWrap ); +} diff --git a/kdevdesigner/designer/multilineeditorimpl.h b/kdevdesigner/designer/multilineeditorimpl.h new file mode 100644 index 00000000..34d47b3e --- /dev/null +++ b/kdevdesigner/designer/multilineeditorimpl.h @@ -0,0 +1,112 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef MULTILINEEDITORIMPL_H +#define MULTILINEEDITORIMPL_H + +#include <tqaction.h> +#include <tqtextedit.h> +#include <tqrichtext_p.h> +#include "multilineeditor.h" + +class FormWindow; +class TQToolBar; +class TQTextDocument; + +class TextEdit : public TQTextEdit +{ + Q_OBJECT + + +public: + TextEdit( TQWidget *parent = 0, const char *name = 0 ); + TQTextDocument *document() const { return TQTextEdit::document(); } + TQTextParagraph *paragraph(); + +}; + +class ToolBarItem : public TQAction +{ + Q_OBJECT + + +public: + ToolBarItem( TQWidget *parent, TQWidget *toolBar, + const TQString &label, const TQString &tagstr, + const TQIconSet &icon, const TQKeySequence &key = 0 ); + ~ToolBarItem(); +signals: + void clicked( const TQString &t ); + +protected slots: + void wasActivated(); +private: + TQString tag; +}; + + +class MultiLineEditor : public MultiLineEditorBase +{ + Q_OBJECT + + +public: + MultiLineEditor( bool call_static, bool richtextMode, TQWidget *parent, TQWidget *editWidget, + FormWindow *fw, const TQString &text = TQString() ); + bool useWrapping() const; + void setUseWrapping( bool ); + static TQString getText( TQWidget *parent, const TQString &text, bool richtextMode, bool *useWrap ); + int exec(); + +protected slots: + void okClicked(); + void applyClicked(); + void cancelClicked(); + void insertTags( const TQString& ); + void insertBR(); + void showFontDialog(); + void changeWrapMode( bool ); + + void closeEvent( TQCloseEvent *e ); + +private: + TQString getStaticText(); + TextEdit *textEdit; + TQTextEdit *mlined; + FormWindow *formwindow; + TQToolBar *basicToolBar; + TQToolBar *fontToolBar; + TQToolBar *optionsToolBar; + TQAction *wrapAction; + int res; + TQString staticText; + bool callStatic; + bool oldDoWrap, doWrap; + TQVariant oldWrapMode; + TQString oldWrapString; +}; + +#endif diff --git a/kdevdesigner/designer/myiconloader.cpp b/kdevdesigner/designer/myiconloader.cpp new file mode 100644 index 00000000..80bbc5ba --- /dev/null +++ b/kdevdesigner/designer/myiconloader.cpp @@ -0,0 +1,32 @@ +/*************************************************************************** + * Copyright (C) 2004 by Alexander Dymo * + * cloudtemple@mksat.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "myiconloader.h" +#include "kdevdesigner_part.h" +#include <kiconloader.h> + +TQPixmap BarIcon2( const TQString & name ) +{ + return BarIcon(name, KDevDesignerPartFactory::instance()); +} + +TQPixmap SmallIcon2( const TQString & name) +{ + return SmallIcon(name, KDevDesignerPartFactory::instance()); +} diff --git a/kdevdesigner/designer/myiconloader.h b/kdevdesigner/designer/myiconloader.h new file mode 100644 index 00000000..63a47eee --- /dev/null +++ b/kdevdesigner/designer/myiconloader.h @@ -0,0 +1,32 @@ +/*************************************************************************** + * Copyright (C) 2004 by Alexander Dymo * + * cloudtemple@mksat.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef MY_ICON_LOADER +#define MY_ICON_LOADER + +#include <tqpixmap.h> +#include <tqstring.h> + +class TDEInstance; + +TQPixmap BarIcon2 (const TQString &name); +TQPixmap SmallIcon2 (const TQString &name); + + +#endif diff --git a/kdevdesigner/designer/newform.ui b/kdevdesigner/designer/newform.ui new file mode 100644 index 00000000..81cb4fa5 --- /dev/null +++ b/kdevdesigner/designer/newform.ui @@ -0,0 +1,238 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>NewFormBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>NewFormBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>557</width> + <height>436</height> + </rect> + </property> + <property name="caption"> + <string>New File</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>New Form</b><p>Select a template for the new form and click the <b>OK</b>-button to create it.</p></string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="2" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Create a new form using the selected template.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog without creating a new form.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQIconView" row="1" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>templateView</cstring> + </property> + <property name="gridX"> + <number>120</number> + </property> + <property name="resizeMode"> + <enum>Adjust</enum> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + <property name="wordWrapIconText"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Displays a list of the available templates.</string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>labelProject</cstring> + </property> + <property name="text"> + <string>&Insert into:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>projectCombo</cstring> + </property> + </widget> + <widget class="TQComboBox" row="0" column="1"> + <property name="name"> + <cstring>projectCombo</cstring> + </property> + </widget> + <spacer row="0" column="2"> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>NewFormBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>NewFormBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>projectCombo</sender> + <signal>activated(const TQString&)</signal> + <receiver>NewFormBase</receiver> + <slot>projectChanged(const TQString&)</slot> + </connection> + <connection> + <sender>templateView</sender> + <signal>currentChanged(TQIconViewItem*)</signal> + <receiver>NewFormBase</receiver> + <slot>itemChanged(TQIconViewItem*)</slot> + </connection> + <connection> + <sender>templateView</sender> + <signal>doubleClicked(TQIconViewItem*)</signal> + <receiver>NewFormBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>templateView</sender> + <signal>returnPressed(TQIconViewItem*)</signal> + <receiver>NewFormBase</receiver> + <slot>accept()</slot> + </connection> +</connections> +<tabstops> + <tabstop>templateView</tabstop> + <tabstop>helpButton</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">itemChanged( TQIconViewItem * )</slot> + <slot access="protected">projectChanged( const TQString & )</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/newformimpl.cpp b/kdevdesigner/designer/newformimpl.cpp new file mode 100644 index 00000000..0cdc738b --- /dev/null +++ b/kdevdesigner/designer/newformimpl.cpp @@ -0,0 +1,414 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "newformimpl.h" +#include "mainwindow.h" +#include "metadatabase.h" +#include "project.h" +#include "formwindow.h" +#include "widgetfactory.h" +#include "widgetdatabase.h" +#include "actioneditorimpl.h" +#include "hierarchyview.h" +#include "resource.h" +#include "projectsettingsimpl.h" +#include "sourcefile.h" + +#include <kiconloader.h> +#include "kdevdesigner_part.h" +#include <tdelocale.h> + +#include <tqiconview.h> +#include <tqlabel.h> +#include <tqfileinfo.h> +#include <tqdir.h> +#include <tqpushbutton.h> +#include <stdlib.h> +#include <tqcombobox.h> +#include <tqworkspace.h> +#include <tqmessagebox.h> + +static int forms = 0; + +ProjectItem::ProjectItem( TQIconView *view, const TQString &text ) + : NewItem( view, text ) +{ +} + +void ProjectItem::insert( Project * ) +{ + MainWindow::self->createNewProject( lang ); +} + + + +FormItem::FormItem( TQIconView *view, const TQString &text ) + : NewItem( view, text ) +{ +} + +void FormItem::insert( Project *pro ) +{ + TQString n = "Form" + TQString::number( ++forms ); + FormWindow *fw = 0; + FormFile *ff = new FormFile( FormFile::createUnnamedFileName(), TRUE, pro ); + fw = new FormWindow( ff, MainWindow::self, MainWindow::self->qWorkspace(), n ); + fw->setProject( pro ); + MetaDataBase::addEntry( TQT_TQOBJECT(fw) ); + if ( fType == Widget ) { + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQWIDGET_OBJECT_NAME_STRING ), + fw, n.latin1() ); + fw->setMainContainer( w ); + } else if ( fType == Dialog ) { + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQDIALOG_OBJECT_NAME_STRING ), fw, n.latin1() ); + fw->setMainContainer( w ); + } else if ( fType == Wizard ) { + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQWIZARD_OBJECT_NAME_STRING ), + fw, n.latin1() ); + fw->setMainContainer( w ); + } else if ( fType == MainWindow ) { + TQWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( TQMAINWINDOW_OBJECT_NAME_STRING ), + fw, n.latin1() ); + fw->setMainContainer( w ); + } + + fw->setCaption( n ); + fw->resize( 600, 480 ); + MainWindow::self->insertFormWindow( fw ); + + TemplateWizardInterface *iface = + MainWindow::self->templateWizardInterface( fw->mainContainer()->className() ); + if ( iface ) { + iface->setup( fw->mainContainer()->className(), fw->mainContainer(), + fw->iFace(), MainWindow::self->designerInterface() ); + iface->release(); + } + + // the wizard might have changed a lot, lets update everything + MainWindow::self->actioneditor()->setFormWindow( fw ); + MainWindow::self->objectHierarchy()->setFormWindow( fw, TQT_TQOBJECT(fw) ); + MainWindow::self->objectHierarchy()->formDefinitionView()->refresh(); + MainWindow::self->objectHierarchy()->rebuild(); + fw->killAccels( TQT_TQOBJECT(fw) ); + fw->project()->setModified( TRUE ); + fw->setFocus(); + if ( !pro->isDummy() ) { + fw->setSavePixmapInProject( TRUE ); + fw->setSavePixmapInline( FALSE ); + } +} + + + +CustomFormItem::CustomFormItem( TQIconView *view, const TQString &text ) + : NewItem( view, text ) +{ +} + +static void unifyFormName( FormWindow *fw, TQWorkspace *qworkspace ) +{ + TQStringList lst; + TQWidgetList windows = qworkspace->windowList(); + for ( TQWidget *w =windows.first(); w; w = windows.next() ) { + if ( w == fw ) + continue; + lst << w->name(); + } + + if ( lst.findIndex( fw->name() ) == -1 ) + return; + TQString origName = fw->name(); + TQString n = origName; + int i = 1; + while ( lst.findIndex( n ) != -1 ) { + n = origName + TQString::number( i++ ); + } + fw->setName( n ); + fw->setCaption( n ); +} + +void CustomFormItem::insert( Project *pro ) +{ + TQString filename = templateFileName(); + if ( !filename.isEmpty() && TQFile::exists( filename ) ) { + Resource resource( MainWindow::self ); + FormFile *ff = new FormFile( filename, TRUE, pro ); + if ( !resource.load( ff ) ) { + TQMessageBox::information( MainWindow::self, i18n("Load Template"), + i18n("Could not load form description from template '%1'" ).arg( filename ) ); + delete ff; + return; + } + ff->setFileName( TQString() ); + if ( MainWindow::self->formWindow() ) { + MainWindow::self->formWindow()->setFileName( TQString() ); + unifyFormName( MainWindow::self->formWindow(), MainWindow::self->qWorkspace() ); + if ( !pro->isDummy() ) { + MainWindow::self->formWindow()->setSavePixmapInProject( TRUE ); + MainWindow::self->formWindow()->setSavePixmapInline( FALSE ); + } + } + } +} + + + +SourceFileItem::SourceFileItem( TQIconView *view, const TQString &text ) + : NewItem( view, text ), visible( TRUE ) +{ +} + +void SourceFileItem::insert( Project *pro ) +{ + SourceFile *f = new SourceFile( SourceFile::createUnnamedFileName( ext ), TRUE, pro ); + MainWindow::self->editSource( f ); +} + +void SourceFileItem::setProject( Project *pro ) +{ + TQIconView *iv = iconView(); + bool v = lang == pro->language(); + if ( !iv || v == visible ) + return; + visible = v; + if ( !visible ) + iv->takeItem( this ); + else + iv->insertItem( this ); +} + + + +SourceTemplateItem::SourceTemplateItem( TQIconView *view, const TQString &text ) + : NewItem( view, text ), visible( TRUE ) +{ +} + +void SourceTemplateItem::insert( Project *pro ) +{ + SourceTemplateInterface *siface = MainWindow::self->sourceTemplateInterface( text() ); + if ( !siface ) + return; + SourceTemplateInterface::Source src = siface->create( text(), MainWindow::self->designerInterface() ); + SourceFile *f = 0; + if ( src.type == SourceTemplateInterface::Source::Invalid ) + return; + if ( src.type == SourceTemplateInterface::Source::FileName ) + f = new SourceFile( src.filename, FALSE, pro ); + else + f = new SourceFile( SourceFile::createUnnamedFileName( src.extension ), TRUE, pro ); + if ( f->isAccepted()) { + f->setText( src.code ); + MainWindow::self->editSource( f ); + f->setModified( TRUE ); + } else { + delete f; + } +} + +void SourceTemplateItem::setProject( Project *pro ) +{ + TQIconView *iv = iconView(); + bool v = !pro->isDummy() && lang == pro->language(); + if ( !iv || v == visible ) + return; + visible = v; + if ( !visible ) + iv->takeItem( this ); + else + iv->insertItem( this ); +} + +void NewForm::insertTemplates( TQIconView *tView, + const TQString &templatePath ) +{ + TQStringList::Iterator it; + TQStringList languages = MetaDataBase::languages(); + if ( !MainWindow::self->singleProjectMode() ) { + for ( it = languages.begin(); it != languages.end(); ++it ) { + ProjectItem *pi = new ProjectItem( tView, i18n("%1 Project" ).arg( *it ) ); + allItems.append( pi ); + pi->setLanguage( *it ); + pi->setPixmap( BarIcon( "designer_project.png" , KDevDesignerPartFactory::instance()) ); + pi->setDragEnabled( FALSE ); + } + } + TQIconViewItem *cur = 0; + FormItem *fi = new FormItem( tView,i18n( "Dialog" ) ); + allItems.append( fi ); + fi->setFormType( FormItem::Dialog ); + fi->setPixmap( BarIcon( "designer_newform.png" , KDevDesignerPartFactory::instance()) ); + fi->setDragEnabled( FALSE ); + cur = fi; + if ( !MainWindow::self->singleProjectMode() ) { + fi = new FormItem( tView,i18n( "Wizard" ) ); + allItems.append( fi ); + fi->setFormType( FormItem::Wizard ); + fi->setPixmap( BarIcon( "designer_newform.png" , KDevDesignerPartFactory::instance()) ); + fi->setDragEnabled( FALSE ); + fi = new FormItem( tView, i18n( "Widget" ) ); + allItems.append( fi ); + fi->setFormType( FormItem::Widget ); + fi->setPixmap( BarIcon( "designer_newform.png" , KDevDesignerPartFactory::instance()) ); + fi->setDragEnabled( FALSE ); + fi = new FormItem( tView, i18n( "Main Window" ) ); + allItems.append( fi ); + fi->setFormType( FormItem::MainWindow ); + fi->setPixmap( BarIcon( "designer_newform.png" , KDevDesignerPartFactory::instance()) ); + fi->setDragEnabled( FALSE ); + + TQString templPath = templatePath; + TQStringList templRoots; + const char *qtdir = getenv( "QTDIR" ); + if(qtdir) + templRoots << qtdir; + templRoots << tqInstallPathData(); + if(qtdir) //try the tools/designer directory last! + templRoots << (TQString(qtdir) + "/tools/designer"); + for ( TQStringList::Iterator it = templRoots.begin(); it != templRoots.end(); ++it ) { + TQString path = (*it) + "/templates"; + if ( TQFile::exists( path )) { + templPath = path; + break; + } + } + if ( !templPath.isEmpty() ) { + TQDir dir( templPath ); + const TQFileInfoList *filist = dir.entryInfoList( TQDir::DefaultFilter, TQDir::DirsFirst | TQDir::Name ); + if ( filist ) { + TQFileInfoListIterator it( *filist ); + TQFileInfo *fi; + while ( ( fi = it.current() ) != 0 ) { + ++it; + if ( !fi->isFile() || fi->extension() != "ui" ) + continue; + TQString name = fi->baseName(); + name = name.replace( '_', ' ' ); + CustomFormItem *ci = new CustomFormItem( tView, name ); + allItems.append( ci ); + ci->setDragEnabled( FALSE ); + ci->setPixmap( BarIcon( "designer_newform.png" , KDevDesignerPartFactory::instance()) ); + ci->setTemplateFile( fi->absFilePath() ); + } + } + } + } + + for ( it = languages.begin(); it != languages.end(); ++it ) { + LanguageInterface *iface = MetaDataBase::languageInterface( *it ); + if ( iface ) { + TQMap<TQString, TQString> extensionMap; + iface->preferedExtensions( extensionMap ); + for ( TQMap<TQString, TQString>::Iterator eit = extensionMap.begin(); + eit != extensionMap.end(); ++eit ) { + SourceFileItem * si = new SourceFileItem( tView, *eit ); + allItems.append( si ); + si->setExtension( eit.key() ); + si->setLanguage( *it ); + si->setPixmap( BarIcon( "designer_filenew.png", KDevDesignerPartFactory::instance() ) ); + si->setDragEnabled( FALSE ); + } + iface->release(); + } + } + + if ( !MainWindow::self->singleProjectMode() ) { + TQStringList sourceTemplates = MainWindow::self->sourceTemplates(); + for ( TQStringList::Iterator sit = sourceTemplates.begin(); sit != sourceTemplates.end(); ++sit ) { + SourceTemplateInterface *siface = MainWindow::self->sourceTemplateInterface( *sit ); + if ( !siface ) + continue; + SourceTemplateItem * si = new SourceTemplateItem( tView, *sit ); + allItems.append( si ); + si->setTemplate( *sit ); + si->setLanguage( siface->language( *sit ) ); + si->setPixmap( BarIcon( "designer_filenew.png", KDevDesignerPartFactory::instance() ) ); + si->setDragEnabled( FALSE ); + siface->release(); + } + } + + tView->viewport()->setFocus(); + tView->setCurrentItem( cur ); + + if ( MainWindow::self->singleProjectMode() ) + adjustSize(); +} + +NewForm::NewForm( TQIconView *templateView, const TQString &templatePath ) +{ + insertTemplates( templateView, templatePath ); + projectChanged( i18n( "<No Project>" ) ); +} + +NewForm::NewForm( TQWidget *parent, const TQStringList& projects, + const TQString& currentProject, const TQString &templatePath ) + : NewFormBase( parent, 0, TRUE ) +{ + connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + + projectCombo->insertStringList( projects ); + projectCombo->setCurrentText( currentProject ); + + insertTemplates( templateView, templatePath ); + + projectChanged( projectCombo->currentText() ); +} + +void NewForm::accept() +{ + if ( !templateView->currentItem() ) + return; + Project *pro = MainWindow::self->findProject( projectCombo->currentText() ); + if ( !pro ) + return; + MainWindow::self->setCurrentProject( pro ); + NewFormBase::accept(); + ( (NewItem*)templateView->currentItem() )->insert( pro ); +} + +void NewForm::projectChanged( const TQString &project ) +{ + Project *pro = MainWindow::self->findProject( project ); + if ( !pro ) + return; + TQIconViewItem *i; + for ( i = allItems.first(); i; i = allItems.next() ) + ( (NewItem*)i )->setProject( pro ); + templateView->setCurrentItem( templateView->firstItem() ); + templateView->arrangeItemsInGrid( TRUE ); +} + +void NewForm::itemChanged( TQIconViewItem *item ) +{ + labelProject->setEnabled( item->rtti() != NewItem::ProjectType ); + projectCombo->setEnabled( item->rtti() != NewItem::ProjectType ); +} + +TQPtrList<TQIconViewItem> NewForm::allViewItems() +{ + return allItems; +} diff --git a/kdevdesigner/designer/newformimpl.h b/kdevdesigner/designer/newformimpl.h new file mode 100644 index 00000000..863f5b9d --- /dev/null +++ b/kdevdesigner/designer/newformimpl.h @@ -0,0 +1,165 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef NEWFORMIMPL_H +#define NEWFORMIMPL_H + +#include "newform.h" +#include <tqiconview.h> + +class Project; + +class NewItem : public TQIconViewItem +{ +public: + enum Type { + ProjectType, + Form, + CustomForm, + SourceFileType, + SourceTemplateType + }; + + NewItem( TQIconView *view, const TQString &text ) + : TQIconViewItem( view, text ) {} + virtual void insert( Project *pro ) = 0; + virtual void setProject( Project * ) {} + +}; + +class ProjectItem : public NewItem +{ +public: + ProjectItem( TQIconView *view, const TQString &text ); + void insert( Project *pro ); + int rtti() const { return (int)ProjectType; } + + void setLanguage( const TQString &l ) { lang = l; } + TQString language() const { return lang; } + +private: + TQString lang; + +}; + +class FormItem : public NewItem +{ +public: + enum FormType { + Widget, + Dialog, + Wizard, + MainWindow + }; + + FormItem( TQIconView *view, const TQString &text ); + void insert( Project *pro ); + int rtti() const { return (int)Form; } + + void setFormType( FormType ft ) { fType = ft; } + FormType formType() const { return fType; } + +private: + FormType fType; + +}; + +class CustomFormItem : public NewItem +{ +public: + CustomFormItem( TQIconView *view, const TQString &text ); + void insert( Project *pro ); + int rtti() const { return (int)CustomForm; } + + void setTemplateFile( const TQString &tf ) { templFile = tf; } + TQString templateFileName() const { return templFile; } + +private: + TQString templFile; + +}; + +class SourceFileItem : public NewItem +{ +public: + SourceFileItem( TQIconView *view, const TQString &text ); + void insert( Project *pro ); + int rtti() const { return (int)SourceFileType; } + + void setExtension( const TQString &e ) { ext = e; } + TQString extension() const { return ext; } + void setLanguage( const TQString &l ) { lang = l; } + void setProject( Project *pro ); + +private: + TQString ext; + TQString lang; + bool visible; + +}; + +class SourceTemplateItem : public NewItem +{ +public: + SourceTemplateItem( TQIconView *view, const TQString &text ); + void insert( Project *pro ); + int rtti() const { return (int)SourceTemplateType; } + + void setTemplate( const TQString &t ) { templ = t; } + TQString tenplate() const { return templ; } + void setLanguage( const TQString &l ) { lang = l; } + void setProject( Project *pro ); + +private: + TQString templ; + TQString lang; + bool visible; + +}; + +class NewForm : public NewFormBase +{ + Q_OBJECT + + +public: + NewForm( TQIconView *templateView, const TQString &templatePath ); + NewForm( TQWidget *parent, const TQStringList& projects, + const TQString& currentProject, const TQString &templatePath ); + void insertTemplates( TQIconView*, const TQString& ); + void accept(); + TQPtrList<TQIconViewItem> allViewItems(); + +protected slots: + void projectChanged( const TQString &project ); + void itemChanged( TQIconViewItem *item ); + +private: + TQPtrList<TQIconViewItem> allItems; + +}; + +#endif diff --git a/kdevdesigner/designer/orderindicator.cpp b/kdevdesigner/designer/orderindicator.cpp new file mode 100644 index 00000000..2904cfbf --- /dev/null +++ b/kdevdesigner/designer/orderindicator.cpp @@ -0,0 +1,112 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler need this here + +#include "orderindicator.h" +#include "formwindow.h" + +#include <tqpainter.h> +#include <tqbitmap.h> +#include <tqapplication.h> + +OrderIndicator::OrderIndicator( int i, TQWidget* w, FormWindow *fw ) + : TQWidget( fw, "order_indicator", WMouseNoMask ), formWindow( fw ) +{ + order = -1; + widget = w; + setBackgroundMode( NoBackground ); + setAutoMask( TRUE ); + setOrder( i, w ); +} + + +OrderIndicator::~OrderIndicator() +{ +} + + +void OrderIndicator::setOrder( int i, TQWidget* wid ) +{ + if ( widget != wid ) + return; + if ( !wid->isVisibleTo( formWindow ) ) { + hide(); + return; + } + + if ( order == i ) { + show(); + raise(); + return; + } + order = i; + int w = fontMetrics().width( TQString::number( i ) ) + 10; + int h = fontMetrics().lineSpacing() * 3 / 2; + TQFont f( font() ); + f.setBold( TRUE ); + setFont( f ); + resize( TQMAX( w, h ), h ); + update(); // in case the size didn't change + reposition(); + show(); + raise(); +} + +void OrderIndicator::reposition() +{ + TQPoint p =parentWidget()->mapFromGlobal( widget->mapToGlobal( widget->rect().topLeft() ) ); + move( p - TQPoint( width()/3, height()/3 ) ); +} + + +void OrderIndicator::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + p.setPen( white ); + p.setBrush( blue ); + p.drawEllipse( rect() ); + p.drawText( rect(), AlignCenter, TQString::number( order ) ); +} + + +void OrderIndicator::updateMask() +{ + TQBitmap bm( size() ); + bm.fill( color0 ); + { + TQPainter p( &bm, this ); + p.setPen( color1 ); + p.setBrush( color1 ); + p.drawEllipse( rect() ); + } + setMask( bm ); +} + +void OrderIndicator::mousePressEvent( TQMouseEvent *e ) +{ + TQApplication::sendEvent( widget, e ); +} diff --git a/kdevdesigner/designer/orderindicator.h b/kdevdesigner/designer/orderindicator.h new file mode 100644 index 00000000..33e486d4 --- /dev/null +++ b/kdevdesigner/designer/orderindicator.h @@ -0,0 +1,58 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ORDERINDICATOR_H +#define ORDERINDICATOR_H + +#include <tqwidget.h> + +class FormWindow; + +class OrderIndicator : public TQWidget +{ + Q_OBJECT + + +public: + OrderIndicator( int i, TQWidget* w, FormWindow* fw ); + ~OrderIndicator(); + + void setOrder( int i, TQWidget* w ); + void reposition(); + +protected: + void paintEvent( TQPaintEvent * ); + void mousePressEvent( TQMouseEvent *e ); + void updateMask(); + +private: + int order; + TQWidget* widget; + FormWindow *formWindow; + +}; + +#endif diff --git a/kdevdesigner/designer/outputwindow.cpp b/kdevdesigner/designer/outputwindow.cpp new file mode 100644 index 00000000..a23c14a7 --- /dev/null +++ b/kdevdesigner/designer/outputwindow.cpp @@ -0,0 +1,209 @@ +/********************************************************************** +** Copyright (C) 2001-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "outputwindow.h" +#include "designerappiface.h" +#include "metadatabase.h" +#include "mainwindow.h" + +#include <tqlistview.h> +#include <tqtextedit.h> +#include <tqapplication.h> +#include <tqheader.h> +#include <stdlib.h> +#include <stdio.h> +#include <tqpainter.h> + +#include <tdelocale.h> + +static TQTextEdit *debugoutput = 0; +bool debugToStderr = FALSE; + +TQtMsgHandler OutputWindow::oldMsgHandler = 0; + +OutputWindow::OutputWindow( TQWidget *parent ) + : TQTabWidget( parent, "output_window" ), debugView( 0 ), errorView( 0 ) +{ + setupDebug(); + setupError(); + iface = new DesignerOutputDockImpl( this ); +} + +OutputWindow::~OutputWindow() +{ + debugoutput = debugView = 0; + errorView = 0; + if ( !debugToStderr ) + tqInstallMsgHandler( oldMsgHandler ); + delete iface; +} + +void OutputWindow::shuttingDown() +{ + if ( !debugToStderr ) + tqInstallMsgHandler( oldMsgHandler ); +} + +void OutputWindow::setupError() +{ + errorView = new TQListView( this, "OutputWindow::errorView" ); + errorView->setSorting( -1 ); + connect( errorView, TQT_SIGNAL( currentChanged( TQListViewItem* ) ), + this, TQT_SLOT( currentErrorChanged( TQListViewItem* ) ) ); + connect( errorView, TQT_SIGNAL( clicked( TQListViewItem* ) ), + this, TQT_SLOT( currentErrorChanged( TQListViewItem* ) ) ); + + if ( MetaDataBase::languages().count() > 1 ) + addTab( errorView, i18n( "Warnings/Errors" ) ); + else + errorView->hide(); + errorView->addColumn( i18n( "Type" ) ); + errorView->addColumn( i18n( "Message" ) ); + errorView->addColumn( i18n( "Line" ) ); + errorView->addColumn( i18n( "Location" ) ); + errorView->setResizeMode( TQListView::LastColumn ); + errorView->setColumnWidth( 0, errorView->fontMetrics().width( "WARNING1234" ) ); + errorView->setColumnWidth( 1, errorView->fontMetrics().width( "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP" ) ); + errorView->setColumnWidth( 2, errorView->fontMetrics().width( "9999999" ) ); + errorView->setColumnAlignment( 2, TQt::AlignRight ); + errorView->setAllColumnsShowFocus( TRUE ); +} + +static void debugMessageOutput( TQtMsgType type, const char *msg ) +{ + TQString s( msg ); + s += "\n"; + + if ( type != TQtFatalMsg ) { + if ( debugoutput && debugoutput->isVisible() ) + debugoutput->append( s ); + else if ( OutputWindow::oldMsgHandler && OutputWindow::oldMsgHandler != debugMessageOutput ) + (*OutputWindow::oldMsgHandler)( type, msg ); + else + fputs( s.latin1(), stderr ); + } else { + fputs( s.latin1(), stderr ); + abort(); + } + + tqApp->flush(); +} + +void OutputWindow::setupDebug() +{ + debugoutput = debugView = new TQTextEdit( this, "OutputWindow::debugView" ); + //debugView->setReadOnly( TRUE ); + addTab( debugView, "Debug Output" ); + + if ( !debugToStderr ) + oldMsgHandler = tqInstallMsgHandler( debugMessageOutput ); +} + +void OutputWindow::setErrorMessages( const TQStringList &errors, const TQValueList<uint> &lines, + bool clear, const TQStringList &locations, + const TQObjectList &locationObjects ) +{ + if ( clear ) + errorView->clear(); + TQStringList::ConstIterator mit = errors.begin(); + TQValueList<uint>::ConstIterator lit = lines.begin(); + TQStringList::ConstIterator it = locations.begin(); + TQObjectList objects = (TQObjectList)locationObjects; + TQObject *o = objects.first(); + TQListViewItem *after = 0; + for ( ; lit != lines.end() && mit != errors.end(); ++lit, ++mit, ++it, o = objects.next() ) + after = new ErrorItem( errorView, after, *mit, *lit, *it, o ); + setCurrentPage( 1 ); +} + +DesignerOutputDock *OutputWindow::iFace() +{ + return iface; +} + +void OutputWindow::appendDebug( const TQString &text ) +{ + debugView->append( text + "\n" ); +} + +void OutputWindow::clearErrorMessages() +{ + errorView->clear(); +} + +void OutputWindow::clearDebug() +{ + debugView->clear(); +} + +void OutputWindow::showDebugTab() +{ + showPage( debugView ); +} + +void OutputWindow::currentErrorChanged( TQListViewItem *i ) +{ + if ( !i ) + return; + ErrorItem *ei = (ErrorItem*)i; + ei->setRead( TRUE ); + MainWindow::self->showSourceLine( ei->location(), ei->line() - 1, MainWindow::Error ); +} + + + +ErrorItem::ErrorItem( TQListView *parent, TQListViewItem *after, const TQString &message, int line, + const TQString &locationString, TQObject *locationObject ) + : TQListViewItem( parent, after ) +{ + setMultiLinesEnabled( TRUE ); + TQString m( message ); + type = m.startsWith( "Warning: " ) ? Warning : Error; + m = m.mid( m.find( ':' ) + 1 ); + setText( 0, type == Error ? "Error" : "Warning" ); + setText( 1, m ); + setText( 2, TQString::number( line ) ); + setText( 3, locationString ); + object = locationObject; + read = !after; + if ( !after ) { + parent->setSelected( this, TRUE ); + parent->setCurrentItem( this ); + } +} + +void ErrorItem::paintCell( TQPainter *p, const TQColorGroup & cg, + int column, int width, int alignment ) +{ + TQColorGroup g( cg ); + g.setColor( TQColorGroup::Text, type == Error ? TQt::red : TQt::darkYellow ); + if ( !read ) { + TQFont f( p->font() ); + f.setBold( TRUE ); + p->setFont( f ); + } + TQListViewItem::paintCell( p, g, column, width, alignment ); +} diff --git a/kdevdesigner/designer/outputwindow.h b/kdevdesigner/designer/outputwindow.h new file mode 100644 index 00000000..79b3e79a --- /dev/null +++ b/kdevdesigner/designer/outputwindow.h @@ -0,0 +1,99 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef OUTPUTWINDOW_H +#define OUTPUTWINDOW_H + +#include <tqtabwidget.h> +#include <tqstringlist.h> +#include <tqvaluelist.h> +#include <tqlistview.h> + +struct DesignerOutputDock; +class TQTextEdit; +class TQListView; + +class ErrorItem : public TQListViewItem +{ +public: + enum Type { Error, Warning }; + + ErrorItem( TQListView *parent, TQListViewItem *after, const TQString &message, int line, + const TQString &locationString, TQObject *locationObject ); + + void paintCell( TQPainter *, const TQColorGroup & cg, + int column, int width, int alignment ); + + void setRead( bool b ) { read = b; repaint(); } + + TQObject *location() const { return object; } + int line() const { return text( 2 ).toInt(); } + +private: + TQObject *object; + Type type; + bool read; + +}; + +class OutputWindow : public TQTabWidget +{ + Q_OBJECT + + +public: + OutputWindow( TQWidget *parent ); + ~OutputWindow(); + + void setErrorMessages( const TQStringList &errors, const TQValueList<uint> &lines, + bool clear, const TQStringList &locations, + const TQObjectList &locationObjects ); + void appendDebug( const TQString& ); + void clearErrorMessages(); + void clearDebug(); + void showDebugTab(); + + DesignerOutputDock *iFace(); + + void shuttingDown(); + + static TQtMsgHandler oldMsgHandler; + +private slots: + void currentErrorChanged( TQListViewItem *i ); + +private: + void setupError(); + void setupDebug(); + + TQTextEdit *debugView; + TQListView *errorView; + + DesignerOutputDock *iface; + +}; + +#endif diff --git a/kdevdesigner/designer/paletteeditor.ui b/kdevdesigner/designer/paletteeditor.ui new file mode 100644 index 00000000..32b14b54 --- /dev/null +++ b/kdevdesigner/designer/paletteeditor.ui @@ -0,0 +1,496 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>PaletteEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>PaletteEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>449</width> + <height>443</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property name="caption"> + <string>Edit Palette</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>groupAutoPalette</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>4</vsizetype> + </sizepolicy> + </property> + <property name="title"> + <string>Build Palette</string> + </property> + <property name="alignment"> + <set>AlignAuto</set> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelMainColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>50</width> + <height>0</height> + </size> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="midLineWidth"> + <number>0</number> + </property> + <property name="text"> + <string>&3-D effects:</string> + </property> + <property name="alignment"> + <set>AlignAuto|AlignVCenter</set> + </property> + <property name="buddy" stdset="0"> + <cstring>buttonMainColor</cstring> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonMainColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>StrongFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Choose a color</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose the effect-color for the generated palette.</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelMainColor2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>50</width> + <height>0</height> + </size> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="midLineWidth"> + <number>0</number> + </property> + <property name="text"> + <string>Back&ground:</string> + </property> + <property name="alignment"> + <set>AlignAuto|AlignVCenter</set> + </property> + <property name="buddy" stdset="0"> + <cstring>buttonMainColor2</cstring> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonMainColor2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>StrongFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Choose a color</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose the background color for the generated palette.</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>btnAdvanced</cstring> + </property> + <property name="text"> + <string>&Tune Palette...</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>GroupBox126</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property name="title"> + <string>Preview</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>Select &palette:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>paletteCombo</cstring> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>Active Palette</string> + </property> + </item> + <item> + <property name="text"> + <string>Inactive Palette</string> + </property> + </item> + <item> + <property name="text"> + <string>Disabled Palette</string> + </property> + </item> + <property name="name"> + <cstring>paletteCombo</cstring> + </property> + </widget> + </hbox> + </widget> + <widget class="PreviewFrame"> + <property name="name"> + <cstring>previewFrame</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing11</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>StyledButton</class> + <header location="local">styledbutton.h</header> + <sizehint> + <width>40</width> + <height>25</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>"image0"</pixmap> + <signal>clicked()</signal> + <signal>changed()</signal> + <property type="Color">color</property> + <property type="Pixmap">pixmap</property> + <property type="Bool">scale</property> + </customwidget> + <customwidget> + <class>PreviewFrame</class> + <header location="local">previewframe.h</header> + <sizehint> + <width>200</width> + <height>200</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>"image1"</pixmap> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </image> +</images> +<connections> + <connection> + <sender>buttonMainColor2</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>onChoose2ndMainColor()</slot> + </connection> + <connection> + <sender>paletteCombo</sender> + <signal>activated(int)</signal> + <receiver>PaletteEditorBase</receiver> + <slot>paletteSelected(int)</slot> + </connection> + <connection> + <sender>btnAdvanced</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>onTune()</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>buttonMainColor</sender> + <signal>changed()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>onChooseMainColor()</slot> + </connection> + <connection> + <sender>buttonMainColor</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>onChooseMainColor()</slot> + </connection> + <connection> + <sender>buttonMainColor2</sender> + <signal>changed()</signal> + <receiver>PaletteEditorBase</receiver> + <slot>onChoose2ndMainColor()</slot> + </connection> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> + <slot access="protected" language="C++" returnType="void">onTune()</slot> + <slot access="protected" language="C++" returnType="void">onChoose2ndMainColor()</slot> + <slot access="protected" language="C++" returnType="void">onChooseMainColor()</slot> + <slot access="protected" language="C++" returnType="void">paletteSelected(int)</slot> +</connections> +<tabstops> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>buttonMainColor</tabstop> + <tabstop>buttonMainColor2</tabstop> + <tabstop>btnAdvanced</tabstop> + <tabstop>paletteCombo</tabstop> + <tabstop>buttonHelp</tabstop> +</tabstops> +</UI> diff --git a/kdevdesigner/designer/paletteeditoradvanced.ui b/kdevdesigner/designer/paletteeditoradvanced.ui new file mode 100644 index 00000000..579f0e68 --- /dev/null +++ b/kdevdesigner/designer/paletteeditoradvanced.ui @@ -0,0 +1,748 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>PaletteEditorAdvancedBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>PaletteEditorAdvancedBase</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>327</width> + <height>341</height> + </rect> + </property> + <property name="caption"> + <string>Tune Palette</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Edit Palette</b><p>Change the current widget or form's palette.</p><p>Use a generated palette or select colors for each color group and each color role.</p><p>The palette can be tested with different widget layouts in the preview section.</p></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout14</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="frameShape"> + <enum>MShape</enum> + </property> + <property name="frameShadow"> + <enum>MShadow</enum> + </property> + <property name="text"> + <string>Select &palette:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>paletteCombo</cstring> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>Active Palette</string> + </property> + </item> + <item> + <property name="text"> + <string>Inactive Palette</string> + </property> + </item> + <item> + <property name="text"> + <string>Disabled Palette</string> + </property> + </item> + <property name="name"> + <cstring>paletteCombo</cstring> + </property> + </widget> + </hbox> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>4</vsizetype> + </sizepolicy> + </property> + <property name="title"> + <string>Auto</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBuildInactive</cstring> + </property> + <property name="text"> + <string>Build the &inactive palette from the active palette</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBuildDisabled</cstring> + </property> + <property name="text"> + <string>Build the &disabled palette from the active palette</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </vbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>groupCentral</cstring> + </property> + <property name="title"> + <string>Central Color Roles</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>Background</string> + </property> + </item> + <item> + <property name="text"> + <string>Foreground</string> + </property> + </item> + <item> + <property name="text"> + <string>Button</string> + </property> + </item> + <item> + <property name="text"> + <string>Base</string> + </property> + </item> + <item> + <property name="text"> + <string>Text</string> + </property> + </item> + <item> + <property name="text"> + <string>BrightText</string> + </property> + </item> + <item> + <property name="text"> + <string>ButtonText</string> + </property> + </item> + <item> + <property name="text"> + <string>Highlight</string> + </property> + </item> + <item> + <property name="text"> + <string>HighlightText</string> + </property> + </item> + <item> + <property name="text"> + <string>Link</string> + </property> + </item> + <item> + <property name="text"> + <string>LinkVisited</string> + </property> + </item> + <property name="name"> + <cstring>comboCentral</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Choose the central color role</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a color role.</b><p>Available central color roles are: <ul> <li>Background - general background color.</li> <li>Foreground - general foreground color. </li> <li>Base - used as the background color for example, for text entry widgets; it is usually white or another light color. </li> <li>Text - the forground color used with Base. Usually this is the same as the Foreground, in which case it must provide good contrast both with the Background and with the Base. </li> <li>Button - general button background color; useful where buttons need a background different from Background, as in the Macintosh style. </li> <li>ButtonText - a foreground color used with the Button color. </li> <li>Highlight - a color used to indicate a selected or highlighted item. </li> <li>HighlightedText - a text color that contrasts to Highlight. </li> <li>BrightText - a text color that is very different from Foreground and contrasts well with, for example, black. </li> </ul> </p></string> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout32_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Horizontal_Spacing1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelPixmap</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property name="text"> + <string>Choose pi&xmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>buttonPixmap</cstring> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonPixmap</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Select a pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose a pixmap file for the selected central color role.</string> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelCentral</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>&Select color:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>buttonCentral</cstring> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonCentral</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Choose a color</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose a color for the selected central color role.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="TQGroupBox"> + <property name="name"> + <cstring>groupEffect</cstring> + </property> + <property name="title"> + <string>3-D Shadow Effects</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout32_3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBuildEffect</cstring> + </property> + <property name="text"> + <string>Build &from button color:</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Generate shadings</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Check to let 3D-effect colors be calculated from the button-color.</string> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>Light</string> + </property> + </item> + <item> + <property name="text"> + <string>Midlight</string> + </property> + </item> + <item> + <property name="text"> + <string>Mid</string> + </property> + </item> + <item> + <property name="text"> + <string>Dark</string> + </property> + </item> + <item> + <property name="text"> + <string>Shadow</string> + </property> + </item> + <property name="name"> + <cstring>comboEffect</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Choose 3D-effect color role</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a color effect role.</b><p>Available effect roles are: <ul> <li>Light - lighter than Button color. </li> <li>Midlight - between Button and Light. </li> <li>Mid - between Button and Dark. </li> <li>Dark - darker than Button. </li> <li>Shadow - a very dark color. </li> </ul></string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout31_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Horizontal_Spacing3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelEffect</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string>Select co&lor:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>buttonEffect</cstring> + </property> + </widget> + <widget class="StyledButton"> + <property name="name"> + <cstring>buttonEffect</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Choose a color</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose a color for the selected effect color role.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal_Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>StyledButton</class> + <header location="local">styledbutton.h</header> + <sizehint> + <width>40</width> + <height>25</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>"image0"</pixmap> + <signal>clicked()</signal> + <signal>changed()</signal> + <property type="Color">color</property> + <property type="Pixmap">pixmap</property> + <property type="Bool">scale</property> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data> + </image> +</images> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>paletteCombo</sender> + <signal>activated(int)</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>paletteSelected(int)</slot> + </connection> + <connection> + <sender>comboCentral</sender> + <signal>activated(int)</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onCentral(int)</slot> + </connection> + <connection> + <sender>buttonPixmap</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onChoosePixmap()</slot> + </connection> + <connection> + <sender>buttonCentral</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onChooseCentralColor()</slot> + </connection> + <connection> + <sender>buttonEffect</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onChooseEffectColor()</slot> + </connection> + <connection> + <sender>comboEffect</sender> + <signal>activated(int)</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onEffect(int)</slot> + </connection> + <connection> + <sender>checkBuildEffect</sender> + <signal>toggled(bool)</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onToggleBuildEffects(bool)</slot> + </connection> + <connection> + <sender>buttonHelp</sender> + <signal>clicked()</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>showHelp()</slot> + </connection> + <connection> + <sender>checkBuildEffect</sender> + <signal>toggled(bool)</signal> + <receiver>comboEffect</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>checkBuildEffect</sender> + <signal>toggled(bool)</signal> + <receiver>buttonEffect</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>checkBuildInactive</sender> + <signal>toggled(bool)</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onToggleBuildInactive(bool)</slot> + </connection> + <connection> + <sender>checkBuildDisabled</sender> + <signal>toggled(bool)</signal> + <receiver>PaletteEditorAdvancedBase</receiver> + <slot>onToggleBuildDisabled(bool)</slot> + </connection> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> + <slot access="protected" language="C++" returnType="void">onToggleBuildDisabled(bool)</slot> + <slot access="protected" language="C++" returnType="void">onCentral(int)</slot> + <slot access="protected" language="C++" returnType="void">onChooseCentralColor()</slot> + <slot access="protected" language="C++" returnType="void">onChooseEffectColor()</slot> + <slot access="protected" language="C++" returnType="void">onChoosePixmap()</slot> + <slot access="protected" language="C++" returnType="void">onEffect(int)</slot> + <slot access="protected" language="C++" returnType="void">onToggleBuildEffects(bool)</slot> + <slot access="protected" language="C++" returnType="void">onToggleBuildInactive(bool)</slot> + <slot access="protected" language="C++" returnType="void">paletteSelected(int)</slot> + <slot access="public" language="C++" returnType="void">showHelp()</slot> +</connections> +<tabstops> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>paletteCombo</tabstop> + <tabstop>checkBuildInactive</tabstop> + <tabstop>checkBuildDisabled</tabstop> + <tabstop>comboCentral</tabstop> + <tabstop>buttonPixmap</tabstop> + <tabstop>buttonCentral</tabstop> + <tabstop>checkBuildEffect</tabstop> + <tabstop>comboEffect</tabstop> + <tabstop>buttonEffect</tabstop> + <tabstop>buttonHelp</tabstop> +</tabstops> +</UI> diff --git a/kdevdesigner/designer/paletteeditoradvancedimpl.cpp b/kdevdesigner/designer/paletteeditoradvancedimpl.cpp new file mode 100644 index 00000000..903c1a4f --- /dev/null +++ b/kdevdesigner/designer/paletteeditoradvancedimpl.cpp @@ -0,0 +1,643 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "paletteeditoradvancedimpl.h" +#include "styledbutton.h" +#include "mainwindow.h" +#include "formwindow.h" + +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include <tqapplication.h> +#include <tqpushbutton.h> +#include <tqlistbox.h> +#include <tqpainter.h> +#include <tqgroupbox.h> + +/*! + Class used by PaletteEditor for bold combobox items +*/ + +class BoldListBoxText : public TQListBoxText +{ +public: + BoldListBoxText( TQString text, TQListBox* lb = 0 ); + +protected: + virtual void paint( TQPainter* ); +}; + +BoldListBoxText::BoldListBoxText( TQString text, TQListBox* lb ) + : TQListBoxText( lb ) +{ + setText( text ); +} + +void BoldListBoxText::paint( TQPainter* painter ) +{ + TQFont f = painter->font(); + f.setBold( TRUE ); + painter->setFont( f ); + + TQListBoxText::paint( painter ); +} + +PaletteEditorAdvanced::PaletteEditorAdvanced( FormWindow *fw, TQWidget * parent, + const char * name, bool modal, WFlags f ) + : PaletteEditorAdvancedBase( parent, name, modal, f ), formWindow( fw ), selectedPalette(0) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + + buttonPixmap->setEditor( StyledButton::PixmapEditor ); + + editPalette = TQApplication::palette(); + setPreviewPalette( editPalette ); + + buttonPixmap->setFormWindow( formWindow ); + + // force toggle event + checkBuildEffect->setChecked(FALSE); + checkBuildEffect->setChecked(TRUE); +} + +PaletteEditorAdvanced::~PaletteEditorAdvanced() +{ +} + +void PaletteEditorAdvanced::onToggleBuildInactive( bool v ) +{ + if (selectedPalette == 1) { + groupCentral->setDisabled(v); + groupEffect->setDisabled(v); + } + + if (v) { + buildInactive(); + updateStyledButtons(); + } +} + +void PaletteEditorAdvanced::onToggleBuildDisabled( bool v ) +{ + if (selectedPalette == 2) { + groupCentral->setDisabled(v); + groupEffect->setDisabled(v); + } + + if (v) { + buildDisabled(); + updateStyledButtons(); + } +} + +void PaletteEditorAdvanced::paletteSelected(int p) +{ + selectedPalette = p; + + if(p == 1) { // inactive + groupCentral->setDisabled(checkBuildInactive->isChecked()); + groupEffect->setDisabled(checkBuildInactive->isChecked()); + } + else if (p == 2) { // disabled + groupCentral->setDisabled(checkBuildDisabled->isChecked()); + groupEffect->setDisabled(checkBuildDisabled->isChecked()); + } + else { + groupCentral->setEnabled(TRUE); + groupEffect->setEnabled(TRUE); + } + updateStyledButtons(); +} + +void PaletteEditorAdvanced::onChooseCentralColor() +{ + switch(selectedPalette) { + case 0: + default: + mapToActiveCentralRole( buttonCentral->color() ); + break; + case 1: + mapToInactiveCentralRole( buttonCentral->color() ); + break; + case 2: + mapToDisabledCentralRole( buttonCentral->color() ); + break; + } + updateStyledButtons(); +} + +void PaletteEditorAdvanced::onChooseEffectColor() +{ + switch(selectedPalette) { + case 0: + default: + mapToActiveEffectRole( buttonEffect->color() ); + break; + case 1: + mapToInactiveEffectRole( buttonEffect->color() ); + break; + case 2: + mapToDisabledEffectRole( buttonEffect->color() ); + break; + } + updateStyledButtons(); +} + +void PaletteEditorAdvanced::onChoosePixmap() +{ + if (buttonPixmap->pixmap()) { + switch(selectedPalette) { + case 0: + default: + mapToActivePixmapRole( *buttonPixmap->pixmap() ); + break; + case 1: + mapToInactivePixmapRole( *buttonPixmap->pixmap() ); + break; + case 2: + mapToDisabledPixmapRole( *buttonPixmap->pixmap() ); + break; + } + } + updateStyledButtons(); +} + +void PaletteEditorAdvanced::onToggleBuildEffects( bool on ) +{ + if (!on) return; + buildActiveEffect(); + buildInactiveEffect(); + buildDisabledEffect(); +} + +TQColorGroup::ColorRole PaletteEditorAdvanced::centralFromItem( int item ) +{ + switch( item ) { + case 0: + return TQColorGroup::Background; + case 1: + return TQColorGroup::Foreground; + case 2: + return TQColorGroup::Button; + case 3: + return TQColorGroup::Base; + case 4: + return TQColorGroup::Text; + case 5: + return TQColorGroup::BrightText; + case 6: + return TQColorGroup::ButtonText; + case 7: + return TQColorGroup::Highlight; + case 8: + return TQColorGroup::HighlightedText; + case 9: + return TQColorGroup::Link; + case 10: + return TQColorGroup::LinkVisited; + default: + return TQColorGroup::NColorRoles; + } +} + +TQColorGroup::ColorRole PaletteEditorAdvanced::effectFromItem( int item ) +{ + switch( item ) { + case 0: + return TQColorGroup::Light; + case 1: + return TQColorGroup::Midlight; + case 2: + return TQColorGroup::Mid; + case 3: + return TQColorGroup::Dark; + case 4: + return TQColorGroup::Shadow; + default: + return TQColorGroup::NColorRoles; + } +} + +void PaletteEditorAdvanced::onCentral( int item ) +{ + TQPixmap* p = 0; + TQColor c; + + switch(selectedPalette) { + case 0: + default: + c = editPalette.active().color( centralFromItem(item) ); + p = editPalette.active().brush( centralFromItem(item) ).pixmap(); + break; + case 1: + c = editPalette.inactive().color( centralFromItem(item) ); + p = editPalette.inactive().brush( centralFromItem(item) ).pixmap(); + break; + case 2: + c = editPalette.disabled().color( centralFromItem(item) ); + p = editPalette.disabled().brush( centralFromItem(item) ).pixmap(); + break; + } + + buttonCentral->setColor(c); + + if (p) + buttonPixmap->setPixmap( *p ); + else + buttonPixmap->setPixmap( TQPixmap() ); +} + +void PaletteEditorAdvanced::onEffect( int item ) +{ + TQColor c; + switch(selectedPalette) { + case 0: + default: + c = editPalette.active().color( effectFromItem(item) ); + break; + case 1: + editPalette.inactive().color( effectFromItem(item) ); + break; + case 2: + editPalette.disabled().color( effectFromItem(item) ); + break; + } + buttonEffect->setColor(c); +} + +void PaletteEditorAdvanced::mapToActiveCentralRole( const TQColor& c ) +{ + TQColorGroup cg = editPalette.active(); + cg.setColor( centralFromItem(comboCentral->currentItem()), c ); + editPalette.setActive( cg ); + + buildActiveEffect(); + if(checkBuildInactive->isChecked()) + buildInactive(); + if(checkBuildDisabled->isChecked()) + buildDisabled(); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToActiveEffectRole( const TQColor& c ) +{ + TQColorGroup cg = editPalette.active(); + cg.setColor( effectFromItem(comboEffect->currentItem()), c ); + editPalette.setActive( cg ); + + if(checkBuildInactive->isChecked()) + buildInactive(); + if(checkBuildDisabled->isChecked()) + buildDisabled(); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToActivePixmapRole( const TQPixmap& pm ) +{ + TQColorGroup::ColorRole role = centralFromItem(comboCentral->currentItem()); + TQColorGroup cg = editPalette.active(); + if ( !pm.isNull() ) + cg.setBrush( role, TQBrush( cg.color( role ), pm ) ); + else + cg.setBrush( role, TQBrush( cg.color( role ) ) ); + editPalette.setActive( cg ); + + + buildActiveEffect(); + if(checkBuildInactive->isChecked()) + buildInactive(); + if(checkBuildDisabled->isChecked()) + buildDisabled(); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToInactiveCentralRole( const TQColor& c ) +{ + TQColorGroup cg = editPalette.inactive(); + cg.setColor( centralFromItem(comboCentral->currentItem()), c ); + editPalette.setInactive( cg ); + + buildInactiveEffect(); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToInactiveEffectRole( const TQColor& c ) +{ + TQColorGroup cg = editPalette.inactive(); + cg.setColor( effectFromItem(comboEffect->currentItem()), c ); + editPalette.setInactive( cg ); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToInactivePixmapRole( const TQPixmap& pm ) +{ + TQColorGroup::ColorRole role = centralFromItem(comboCentral->currentItem()); + TQColorGroup cg = editPalette.inactive(); + if ( !pm.isNull() ) + cg.setBrush( role, TQBrush( cg.color( role ), pm ) ); + else + cg.setBrush( role, TQBrush( cg.color( role ) ) ); + editPalette.setInactive( cg ); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToDisabledCentralRole( const TQColor& c ) +{ + TQColorGroup cg = editPalette.disabled(); + cg.setColor( centralFromItem(comboCentral->currentItem()), c ); + editPalette.setDisabled( cg ); + + buildDisabledEffect(); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToDisabledEffectRole( const TQColor& c ) +{ + TQColorGroup cg = editPalette.disabled(); + cg.setColor( effectFromItem(comboEffect->currentItem()), c ); + editPalette.setDisabled( cg ); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::mapToDisabledPixmapRole( const TQPixmap& pm ) +{ + TQColorGroup::ColorRole role = centralFromItem(comboCentral->currentItem()); + TQColorGroup cg = editPalette.disabled(); + if ( !pm.isNull() ) + cg.setBrush( role, TQBrush( cg.color( role ), pm ) ); + else + cg.setBrush( role, TQBrush( cg.color( role ) ) ); + + editPalette.setDisabled( cg ); + + setPreviewPalette( editPalette ); +} + +void PaletteEditorAdvanced::buildActiveEffect() +{ + TQColorGroup cg = editPalette.active(); + TQColor btn = cg.color( TQColorGroup::Button ); + + TQPalette temp( btn, btn ); + + for (int i = 0; i<5; i++) + cg.setColor( effectFromItem(i), temp.active().color( effectFromItem(i) ) ); + + editPalette.setActive( cg ); + setPreviewPalette( editPalette ); + + updateStyledButtons(); +} + +void PaletteEditorAdvanced::buildInactive() +{ + editPalette.setInactive( editPalette.active() ); + buildInactiveEffect(); +} + +void PaletteEditorAdvanced::buildInactiveEffect() +{ + TQColorGroup cg = editPalette.inactive(); + + TQColor light, midlight, mid, dark, shadow; + TQColor btn = cg.color( TQColorGroup::Button ); + + light = btn.light(150); + midlight = btn.light(115); + mid = btn.dark(150); + dark = btn.dark(); + shadow = black; + + cg.setColor( TQColorGroup::Light, light ); + cg.setColor( TQColorGroup::Midlight, midlight ); + cg.setColor( TQColorGroup::Mid, mid ); + cg.setColor( TQColorGroup::Dark, dark ); + cg.setColor( TQColorGroup::Shadow, shadow ); + + editPalette.setInactive( cg ); + setPreviewPalette( editPalette ); + updateStyledButtons(); +} + +void PaletteEditorAdvanced::buildDisabled() +{ + TQColorGroup cg = editPalette.active(); + cg.setColor( TQColorGroup::ButtonText, darkGray ); + cg.setColor( TQColorGroup::Foreground, darkGray ); + editPalette.setDisabled( cg ); + + buildDisabledEffect(); +} + +void PaletteEditorAdvanced::buildDisabledEffect() +{ + TQColorGroup cg = editPalette.disabled(); + + TQColor light, midlight, mid, dark, shadow; + TQColor btn = cg.color( TQColorGroup::Button ); + + light = btn.light(150); + midlight = btn.light(115); + mid = btn.dark(150); + dark = btn.dark(); + shadow = black; + + cg.setColor( TQColorGroup::Light, light ); + cg.setColor( TQColorGroup::Midlight, midlight ); + cg.setColor( TQColorGroup::Mid, mid ); + cg.setColor( TQColorGroup::Dark, dark ); + cg.setColor( TQColorGroup::Shadow, shadow ); + + editPalette.setDisabled( cg ); + setPreviewPalette( editPalette ); + updateStyledButtons(); +} + +void PaletteEditorAdvanced::setPreviewPalette( const TQPalette& pal ) +{ + TQColorGroup cg; + + switch (selectedPalette) { + case 0: + default: + cg = pal.active(); + break; + case 1: + cg = pal.inactive(); + break; + case 2: + cg = pal.disabled(); + break; + } + previewPalette.setActive( cg ); + previewPalette.setInactive( cg ); + previewPalette.setDisabled( cg ); +} + +void PaletteEditorAdvanced::updateStyledButtons() +{ + TQColor central, effect; + TQPixmap *pm = 0; + switch (selectedPalette) { + case 0: + default: + central = editPalette.active().color( centralFromItem( comboCentral->currentItem() ) ); + effect = editPalette.active().color( effectFromItem( comboEffect->currentItem() ) ); + pm = editPalette.active().brush( centralFromItem( comboCentral->currentItem() ) ).pixmap(); + break; + case 1: + central = editPalette.inactive().color( centralFromItem( comboCentral->currentItem() ) ); + effect = editPalette.inactive().color( effectFromItem( comboEffect->currentItem() ) ); + pm = editPalette.inactive().brush( centralFromItem( comboCentral->currentItem() ) ).pixmap(); + break; + case 2: + central = editPalette.disabled().color( centralFromItem( comboCentral->currentItem() ) ); + effect = editPalette.disabled().color( effectFromItem( comboEffect->currentItem() ) ); + pm = editPalette.disabled().brush( centralFromItem( comboCentral->currentItem() ) ).pixmap(); + break; + } + + buttonCentral->setColor(central); + buttonEffect->setColor(effect); + if ( pm && !pm->isNull() ) + buttonPixmap->setPixmap( *pm ); + else + buttonPixmap->setPixmap(TQPixmap()); +} + +void PaletteEditorAdvanced::setPal( const TQPalette& pal ) +{ + editPalette = pal; + setPreviewPalette( pal ); + updateStyledButtons(); +} + +TQPalette PaletteEditorAdvanced::pal() const +{ + return editPalette; +} + +void PaletteEditorAdvanced::setupBackgroundMode( BackgroundMode mode ) +{ + int initRole = 0; + + switch( mode ) { + case PaletteBackground: + initRole = 0; + break; + case PaletteForeground: + initRole = 1; + break; + case PaletteButton: + initRole = 2; + break; + case PaletteBase: + initRole = 3; + break; + case PaletteText: + initRole = 4; + break; + case PaletteBrightText: + initRole = 5; + break; + case PaletteButtonText: + initRole = 6; + break; + case PaletteHighlight: + initRole = 7; + break; + case PaletteHighlightedText: + initRole = 8; + break; + case PaletteLight: + initRole = 9; + break; + case PaletteMidlight: + initRole = 10; + break; + case PaletteDark: + initRole = 11; + break; + case PaletteMid: + initRole = 12; + break; + case PaletteShadow: + initRole = 13; + break; + default: + initRole = -1; + break; + } + + if ( initRole <= -1 ) return; + + if (initRole > 8 ) { + comboEffect->setCurrentItem( initRole - 9 ); + if ( comboEffect->listBox() ) { + TQString text = comboEffect->currentText(); + comboEffect->listBox()->changeItem( new BoldListBoxText( text ), initRole - 9 ); + } + } + else { + comboCentral->setCurrentItem( initRole ); + if ( comboCentral->listBox() ) { + TQString text = comboCentral->currentText(); + comboCentral->listBox()->changeItem( new BoldListBoxText( text ), initRole ); + } + } +} + +TQPalette PaletteEditorAdvanced::getPalette( bool *ok, const TQPalette &init, + BackgroundMode mode, TQWidget* parent, + const char* name, FormWindow *fw ) +{ + PaletteEditorAdvanced* dlg = new PaletteEditorAdvanced( fw, parent, name, TRUE ); + dlg->setupBackgroundMode( mode ); + + if ( init != TQPalette() ) + dlg->setPal( init ); + int resultCode = dlg->exec(); + + TQPalette result = init; + if ( resultCode == TQDialog::Accepted ) { + if ( ok ) + *ok = TRUE; + result = dlg->pal(); + } else { + if ( ok ) + *ok = FALSE; + } + delete dlg; + return result; +} diff --git a/kdevdesigner/designer/paletteeditoradvancedimpl.h b/kdevdesigner/designer/paletteeditoradvancedimpl.h new file mode 100644 index 00000000..1fb59912 --- /dev/null +++ b/kdevdesigner/designer/paletteeditoradvancedimpl.h @@ -0,0 +1,97 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PALETTEEDITORADVANCEDIMPL_H +#define PALETTEEDITORADVANCEDIMPL_H + +#include "paletteeditoradvanced.h" + +class FormWindow; + +class PaletteEditorAdvanced : public PaletteEditorAdvancedBase +{ + Q_OBJECT + +public: + PaletteEditorAdvanced( FormWindow *fw, TQWidget * parent=0, const char * name=0, + bool modal=FALSE, WFlags f=0 ); + ~PaletteEditorAdvanced(); + + static TQPalette getPalette( bool *ok, const TQPalette &pal, BackgroundMode mode = PaletteBackground, + TQWidget* parent = 0, const char* name = 0, FormWindow *fw = 0 ); + +protected slots: + void paletteSelected(int); + + void onCentral( int ); + void onEffect( int ); + + void onChooseCentralColor(); + void onChooseEffectColor(); + void onChoosePixmap(); + + void onToggleBuildEffects( bool ); + void onToggleBuildInactive( bool ); + void onToggleBuildDisabled( bool ); + +protected: + void mapToActiveCentralRole( const TQColor& ); + void mapToActiveEffectRole( const TQColor& ); + void mapToActivePixmapRole( const TQPixmap& ); + void mapToInactiveCentralRole( const TQColor& ); + void mapToInactiveEffectRole( const TQColor& ); + void mapToInactivePixmapRole( const TQPixmap& ); + void mapToDisabledCentralRole( const TQColor& ); + void mapToDisabledEffectRole( const TQColor& ); + void mapToDisabledPixmapRole( const TQPixmap& ); + + + void buildPalette(); + void buildActiveEffect(); + void buildInactive(); + void buildInactiveEffect(); + void buildDisabled(); + void buildDisabledEffect(); + +private: + void setPreviewPalette( const TQPalette& ); + void updateStyledButtons(); + void setupBackgroundMode( BackgroundMode ); + + TQPalette pal() const; + void setPal( const TQPalette& ); + + TQColorGroup::ColorRole centralFromItem( int ); + TQColorGroup::ColorRole effectFromItem( int ); + TQPalette editPalette; + TQPalette previewPalette; + + FormWindow *formWindow; + + int selectedPalette; +}; + +#endif diff --git a/kdevdesigner/designer/paletteeditorimpl.cpp b/kdevdesigner/designer/paletteeditorimpl.cpp new file mode 100644 index 00000000..ae0cf7fd --- /dev/null +++ b/kdevdesigner/designer/paletteeditorimpl.cpp @@ -0,0 +1,304 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "paletteeditorimpl.h" +#include "paletteeditoradvancedimpl.h" +#include "previewframe.h" +#include "styledbutton.h" +#include "mainwindow.h" +#include "formwindow.h" + +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include <tqapplication.h> +#include <tqpushbutton.h> + +PaletteEditor::PaletteEditor( FormWindow *fw, TQWidget * parent, const char * name, bool modal, WFlags f ) + : PaletteEditorBase( parent, name, modal, f ), formWindow( fw ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + + editPalette = TQApplication::palette(); + setPreviewPalette( editPalette ); + + buttonMainColor->setColor( editPalette.active().color( TQColorGroup::Button ) ); + buttonMainColor2->setColor( editPalette.active().color( TQColorGroup::Background ) ); +} + +PaletteEditor::~PaletteEditor() +{ +} + +void PaletteEditor::onTune() +{ + bool ok; + TQPalette pal = PaletteEditorAdvanced::getPalette( &ok, editPalette, backgroundMode, this, "tune_palette", formWindow); + if (!ok) return; + + editPalette = pal; + setPreviewPalette( editPalette ); +} + +void PaletteEditor::onChooseMainColor() +{ + buildPalette(); +} + +void PaletteEditor::onChoose2ndMainColor() +{ + buildPalette(); +} + +void PaletteEditor::paletteSelected(int) +{ + setPreviewPalette(editPalette); +} + +TQColorGroup::ColorRole PaletteEditor::centralFromItem( int item ) +{ + switch( item ) + { + case 0: + return TQColorGroup::Background; + case 1: + return TQColorGroup::Foreground; + case 2: + return TQColorGroup::Button; + case 3: + return TQColorGroup::Base; + case 4: + return TQColorGroup::Text; + case 5: + return TQColorGroup::BrightText; + case 6: + return TQColorGroup::ButtonText; + case 7: + return TQColorGroup::Highlight; + case 8: + return TQColorGroup::HighlightedText; + default: + return TQColorGroup::NColorRoles; + } +} + +TQColorGroup::ColorRole PaletteEditor::effectFromItem( int item ) +{ + switch( item ) + { + case 0: + return TQColorGroup::Light; + case 1: + return TQColorGroup::Midlight; + case 2: + return TQColorGroup::Mid; + case 3: + return TQColorGroup::Dark; + case 4: + return TQColorGroup::Shadow; + default: + return TQColorGroup::NColorRoles; + } +} + +void PaletteEditor::buildPalette() +{ + int i; + TQColorGroup cg; + TQColor btn = buttonMainColor->color(); + TQColor back = buttonMainColor2->color(); + TQPalette automake( btn, back ); + + for (i = 0; i<9; i++) + cg.setColor( centralFromItem(i), automake.active().color( centralFromItem(i) ) ); + + editPalette.setActive( cg ); + buildActiveEffect(); + + cg = editPalette.inactive(); + + TQPalette temp( editPalette.active().color( TQColorGroup::Button ), + editPalette.active().color( TQColorGroup::Background ) ); + + for (i = 0; i<9; i++) + cg.setColor( centralFromItem(i), temp.inactive().color( centralFromItem(i) ) ); + + editPalette.setInactive( cg ); + buildInactiveEffect(); + + cg = editPalette.disabled(); + + for (i = 0; i<9; i++) + cg.setColor( centralFromItem(i), temp.disabled().color( centralFromItem(i) ) ); + + editPalette.setDisabled( cg ); + buildDisabledEffect(); + + updateStyledButtons(); +} + +void PaletteEditor::buildActiveEffect() +{ + TQColorGroup cg = editPalette.active(); + TQColor btn = cg.color( TQColorGroup::Button ); + + TQPalette temp( btn, btn ); + + for (int i = 0; i<5; i++) + cg.setColor( effectFromItem(i), temp.active().color( effectFromItem(i) ) ); + + editPalette.setActive( cg ); + setPreviewPalette( editPalette ); + + updateStyledButtons(); +} + +void PaletteEditor::buildInactive() +{ + editPalette.setInactive( editPalette.active() ); + buildInactiveEffect(); +} + +void PaletteEditor::buildInactiveEffect() +{ + TQColorGroup cg = editPalette.inactive(); + + TQColor light, midlight, mid, dark, shadow; + TQColor btn = cg.color( TQColorGroup::Button ); + + light = btn.light(150); + midlight = btn.light(115); + mid = btn.dark(150); + dark = btn.dark(); + shadow = black; + + cg.setColor( TQColorGroup::Light, light ); + cg.setColor( TQColorGroup::Midlight, midlight ); + cg.setColor( TQColorGroup::Mid, mid ); + cg.setColor( TQColorGroup::Dark, dark ); + cg.setColor( TQColorGroup::Shadow, shadow ); + + editPalette.setInactive( cg ); + setPreviewPalette( editPalette ); + updateStyledButtons(); +} + +void PaletteEditor::buildDisabled() +{ + TQColorGroup cg = editPalette.active(); + cg.setColor( TQColorGroup::ButtonText, darkGray ); + cg.setColor( TQColorGroup::Foreground, darkGray ); + editPalette.setDisabled( cg ); + + buildDisabledEffect(); +} + +void PaletteEditor::buildDisabledEffect() +{ + TQColorGroup cg = editPalette.disabled(); + + TQColor light, midlight, mid, dark, shadow; + TQColor btn = cg.color( TQColorGroup::Button ); + + light = btn.light(150); + midlight = btn.light(115); + mid = btn.dark(150); + dark = btn.dark(); + shadow = black; + + cg.setColor( TQColorGroup::Light, light ); + cg.setColor( TQColorGroup::Midlight, midlight ); + cg.setColor( TQColorGroup::Mid, mid ); + cg.setColor( TQColorGroup::Dark, dark ); + cg.setColor( TQColorGroup::Shadow, shadow ); + + editPalette.setDisabled( cg ); + setPreviewPalette( editPalette ); + updateStyledButtons(); +} + +void PaletteEditor::setPreviewPalette( const TQPalette& pal ) +{ + TQColorGroup cg; + + switch (paletteCombo->currentItem()) { + case 0: + default: + cg = pal.active(); + break; + case 1: + cg = pal.inactive(); + break; + case 2: + cg = pal.disabled(); + break; + } + previewPalette.setActive( cg ); + previewPalette.setInactive( cg ); + previewPalette.setDisabled( cg ); + + previewFrame->setPreviewPalette(previewPalette); +} + +void PaletteEditor::updateStyledButtons() +{ + buttonMainColor->setColor( editPalette.active().color( TQColorGroup::Button )); + buttonMainColor2->setColor( editPalette.active().color( TQColorGroup::Background )); +} + +void PaletteEditor::setPal( const TQPalette& pal ) +{ + editPalette = pal; + setPreviewPalette( pal ); + updateStyledButtons(); +} + +TQPalette PaletteEditor::pal() const +{ + return editPalette; +} + +TQPalette PaletteEditor::getPalette( bool *ok, const TQPalette &init, BackgroundMode mode, + TQWidget* parent, const char* name, FormWindow *fw ) +{ + PaletteEditor* dlg = new PaletteEditor( fw, parent, name, TRUE ); + dlg->setupBackgroundMode( mode ); + + if ( init != TQPalette() ) + dlg->setPal( init ); + int resultCode = dlg->exec(); + + TQPalette result = init; + if ( resultCode == TQDialog::Accepted ) { + if ( ok ) + *ok = TRUE; + result = dlg->pal(); + } else { + if ( ok ) + *ok = FALSE; + } + delete dlg; + return result; +} diff --git a/kdevdesigner/designer/paletteeditorimpl.h b/kdevdesigner/designer/paletteeditorimpl.h new file mode 100644 index 00000000..c1943a61 --- /dev/null +++ b/kdevdesigner/designer/paletteeditorimpl.h @@ -0,0 +1,77 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PALETTEEDITORIMPL_H +#define PALETTEEDITORIMPL_H + +#include "paletteeditor.h" + +class FormWindow; + +class PaletteEditor : public PaletteEditorBase +{ + Q_OBJECT + + +public: + PaletteEditor( FormWindow *fw, TQWidget * parent=0, const char * name=0, bool modal=FALSE, WFlags f=0 ); + ~PaletteEditor(); + + static TQPalette getPalette( bool *ok, const TQPalette &pal, BackgroundMode mode = PaletteBackground, + TQWidget* parent = 0, const char* name = 0, FormWindow *fw = 0 ); + +protected slots: + void onChooseMainColor(); + void onChoose2ndMainColor(); + void onTune(); + void paletteSelected(int); + +protected: + void buildPalette(); + void buildActiveEffect(); + void buildInactive(); + void buildInactiveEffect(); + void buildDisabled(); + void buildDisabledEffect(); + +private: + void setPreviewPalette( const TQPalette& ); + void updateStyledButtons(); + void setupBackgroundMode( BackgroundMode mode ) { backgroundMode = mode; } + + TQPalette pal() const; + void setPal( const TQPalette& ); + + TQColorGroup::ColorRole centralFromItem( int ); + TQColorGroup::ColorRole effectFromItem( int ); + TQPalette editPalette; + TQPalette previewPalette; + + FormWindow *formWindow; + BackgroundMode backgroundMode; +}; + +#endif diff --git a/kdevdesigner/designer/pics/CMakeLists.txt b/kdevdesigner/designer/pics/CMakeLists.txt new file mode 100644 index 00000000..3b6367c0 --- /dev/null +++ b/kdevdesigner/designer/pics/CMakeLists.txt @@ -0,0 +1,85 @@ +################################################# +# +# (C) 2012 Slavek Banko +# slavek (DOT) banko (AT) axis.cz +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +install( + FILES + designer_adjustsize.png designer_appicon.png designer_arrow.png + designer_background.png designer_book.png designer_buttongroup.png + designer_checkbox.png designer_combobox.png designer_connecttool.png + designer_cross.png designer_customwidget.png designer_d_adjustsize.png + designer_d_book.png designer_d_buttongroup.png designer_d_checkbox.png + designer_d_combobox.png designer_d_connecttool.png designer_d_customwidget.png + designer_d_databrowser.png designer_d_datatable.png designer_d_dataview.png + designer_d_dateedit.png designer_d_datetimeedit.png designer_d_dial.png + designer_d_down.png designer_d_editbreaklayout.png designer_d_editcopy.png + designer_d_editcut.png designer_d_editdelete.png designer_d_editgrid.png + designer_d_edithlayout.png designer_d_edithlayoutsplit.png + designer_d_editlower.png designer_d_editpaste.png designer_d_editraise.png + designer_d_editslots.png designer_d_editvlayout.png + designer_d_editvlayoutsplit.png designer_d_filenew.png designer_d_fileopen.png + designer_d_filesave.png designer_d_folder.png designer_d_form.png + designer_d_frame.png designer_d_groupbox.png designer_d_help.png + designer_d_home.png designer_d_iconview.png designer_d_image.png + designer_d_label.png designer_d_layout.png designer_d_lcdnumber.png + designer_d_left.png designer_d_line.png designer_d_lineedit.png + designer_d_listbox.png designer_d_listview.png designer_d_multilineedit.png + designer_d_newform.png designer_d_ordertool.png designer_d_pixlabel.png + designer_d_pointer.png designer_d_print.png designer_d_progress.png + designer_d_project.png designer_d_pushbutton.png designer_d_radiobutton.png + designer_d_redo.png designer_d_richtextedit.png designer_d_right.png + designer_d_scrollbar.png designer_d_searchfind.png designer_d_setbuddy.png + designer_d_slider.png designer_d_spacer.png designer_d_spinbox.png + designer_d_table.png designer_d_tabwidget.png designer_d_textbold.png + designer_d_textbrowser.png designer_d_textcenter.png designer_d_textedit.png + designer_d_textfont.png designer_d_texth1.png designer_d_texth2.png + designer_d_texth3.png designer_d_textitalic.png designer_d_textjustify.png + designer_d_textlarger.png designer_d_textleft.png designer_d_textlinebreak.png + designer_d_textparagraph.png designer_d_textright.png designer_d_textsmaller.png + designer_d_textteletext.png designer_d_textunderline.png designer_d_textview.png + designer_d_timeedit.png designer_d_toolbox.png designer_d_toolbutton.png + designer_d_undo.png designer_d_up.png designer_d_widgetstack.png + designer_d_wizarddata.png designer_d_wizarddialog.png designer_d_wordwrap.png + designer_databrowser.png designer_datatable.png designer_dataview.png + designer_dateedit.png designer_datetimeedit.png designer_dial.png + designer_down.png designer_editbreaklayout.png designer_editcopy.png + designer_editcut.png designer_editdelete.png designer_editgrid.png + designer_edithlayout.png designer_edithlayoutsplit.png designer_editlower.png + designer_editpaste.png designer_editraise.png designer_editslots.png + designer_editvlayout.png designer_editvlayoutsplit.png designer_filenew.png + designer_fileopen.png designer_filesave.png designer_folder.png + designer_form.png designer_frame.png designer_groupbox.png designer_hand.png + designer_help.png designer_home.png designer_hsplit.png designer_ibeam.png + designer_iconview.png designer_image.png designer_label.png designer_layout.png + designer_lcdnumber.png designer_left.png designer_line.png designer_lineedit.png + designer_listbox.png designer_listview.png designer_multilineedit.png + designer_newform.png designer_no.png designer_object.png designer_ordertool.png + designer_pixlabel.png designer_pointer.png designer_print.png + designer_progress.png designer_project.png designer_pushbutton.png + designer_qtlogo.png designer_radiobutton.png designer_redo.png + designer_resetproperty.png designer_richtextedit.png designer_right.png + designer_s_down.png designer_s_editcut.png designer_s_left.png + designer_s_right.png designer_s_up.png designer_scrollbar.png + designer_searchfind.png designer_setbuddy.png designer_sizeall.png + designer_sizeb.png designer_sizef.png designer_sizeh.png designer_sizev.png + designer_slider.png designer_spacer.png designer_spinbox.png designer_splash.png + designer_table.png designer_tabwidget.png designer_textbold.png + designer_textbrowser.png designer_textcenter.png designer_textedit.png + designer_textfont.png designer_texth1.png designer_texth2.png + designer_texth3.png designer_textitalic.png designer_textjustify.png + designer_textlarger.png designer_textleft.png designer_textlinebreak.png + designer_textparagraph.png designer_textright.png designer_textsmaller.png + designer_textteletext.png designer_textunderline.png designer_textview.png + designer_timeedit.png designer_toolbox.png designer_toolbutton.png + designer_undo.png designer_up.png designer_uparrow.png designer_vsplit.png + designer_wait.png designer_widgetstack.png designer_wizarddata.png + designer_wizarddialog.png designer_wordwrap.png + DESTINATION ${DATA_INSTALL_DIR}/kdevdesignerpart/pics +) diff --git a/kdevdesigner/designer/pics/Makefile.am b/kdevdesigner/designer/pics/Makefile.am new file mode 100644 index 00000000..8749186b --- /dev/null +++ b/kdevdesigner/designer/pics/Makefile.am @@ -0,0 +1,2 @@ +picsdirdir = $(kde_datadir)/kdevdesignerpart/pics +picsdir_DATA = designer_adjustsize.png designer_appicon.png designer_arrow.png designer_background.png designer_book.png designer_buttongroup.png designer_checkbox.png designer_combobox.png designer_connecttool.png designer_cross.png designer_customwidget.png designer_d_adjustsize.png designer_d_book.png designer_d_buttongroup.png designer_d_checkbox.png designer_d_combobox.png designer_d_connecttool.png designer_d_customwidget.png designer_d_databrowser.png designer_d_datatable.png designer_d_dataview.png designer_d_dateedit.png designer_d_datetimeedit.png designer_d_dial.png designer_d_down.png designer_d_editbreaklayout.png designer_d_editcopy.png designer_d_editcut.png designer_d_editdelete.png designer_d_editgrid.png designer_d_edithlayout.png designer_d_edithlayoutsplit.png designer_d_editlower.png designer_d_editpaste.png designer_d_editraise.png designer_d_editslots.png designer_d_editvlayout.png designer_d_editvlayoutsplit.png designer_d_filenew.png designer_d_fileopen.png designer_d_filesave.png designer_d_folder.png designer_d_form.png designer_d_frame.png designer_d_groupbox.png designer_d_help.png designer_d_home.png designer_d_iconview.png designer_d_image.png designer_d_label.png designer_d_layout.png designer_d_lcdnumber.png designer_d_left.png designer_d_line.png designer_d_lineedit.png designer_d_listbox.png designer_d_listview.png designer_d_multilineedit.png designer_d_newform.png designer_d_ordertool.png designer_d_pixlabel.png designer_d_pointer.png designer_d_print.png designer_d_progress.png designer_d_project.png designer_d_pushbutton.png designer_d_radiobutton.png designer_d_redo.png designer_d_richtextedit.png designer_d_right.png designer_d_scrollbar.png designer_d_searchfind.png designer_d_setbuddy.png designer_d_slider.png designer_d_spacer.png designer_d_spinbox.png designer_d_table.png designer_d_tabwidget.png designer_d_textbold.png designer_d_textbrowser.png designer_d_textcenter.png designer_d_textedit.png designer_d_textfont.png designer_d_texth1.png designer_d_texth2.png designer_d_texth3.png designer_d_textitalic.png designer_d_textjustify.png designer_d_textlarger.png designer_d_textleft.png designer_d_textlinebreak.png designer_d_textparagraph.png designer_d_textright.png designer_d_textsmaller.png designer_d_textteletext.png designer_d_textunderline.png designer_d_textview.png designer_d_timeedit.png designer_d_toolbox.png designer_d_toolbutton.png designer_d_undo.png designer_d_up.png designer_d_widgetstack.png designer_d_wizarddata.png designer_d_wizarddialog.png designer_d_wordwrap.png designer_databrowser.png designer_datatable.png designer_dataview.png designer_dateedit.png designer_datetimeedit.png designer_dial.png designer_down.png designer_editbreaklayout.png designer_editcopy.png designer_editcut.png designer_editdelete.png designer_editgrid.png designer_edithlayout.png designer_edithlayoutsplit.png designer_editlower.png designer_editpaste.png designer_editraise.png designer_editslots.png designer_editvlayout.png designer_editvlayoutsplit.png designer_filenew.png designer_fileopen.png designer_filesave.png designer_folder.png designer_form.png designer_frame.png designer_groupbox.png designer_hand.png designer_help.png designer_home.png designer_hsplit.png designer_ibeam.png designer_iconview.png designer_image.png designer_label.png designer_layout.png designer_lcdnumber.png designer_left.png designer_line.png designer_lineedit.png designer_listbox.png designer_listview.png designer_multilineedit.png designer_newform.png designer_no.png designer_object.png designer_ordertool.png designer_pixlabel.png designer_pointer.png designer_print.png designer_progress.png designer_project.png designer_pushbutton.png designer_qtlogo.png designer_radiobutton.png designer_redo.png designer_resetproperty.png designer_richtextedit.png designer_right.png designer_s_down.png designer_s_editcut.png designer_s_left.png designer_s_right.png designer_s_up.png designer_scrollbar.png designer_searchfind.png designer_setbuddy.png designer_sizeall.png designer_sizeb.png designer_sizef.png designer_sizeh.png designer_sizev.png designer_slider.png designer_spacer.png designer_spinbox.png designer_splash.png designer_table.png designer_tabwidget.png designer_textbold.png designer_textbrowser.png designer_textcenter.png designer_textedit.png designer_textfont.png designer_texth1.png designer_texth2.png designer_texth3.png designer_textitalic.png designer_textjustify.png designer_textlarger.png designer_textleft.png designer_textlinebreak.png designer_textparagraph.png designer_textright.png designer_textsmaller.png designer_textteletext.png designer_textunderline.png designer_textview.png designer_timeedit.png designer_toolbox.png designer_toolbutton.png designer_undo.png designer_up.png designer_uparrow.png designer_vsplit.png designer_wait.png designer_widgetstack.png designer_wizarddata.png designer_wizarddialog.png designer_wordwrap.png diff --git a/kdevdesigner/designer/pics/designer_adjustsize.png b/kdevdesigner/designer/pics/designer_adjustsize.png Binary files differnew file mode 100644 index 00000000..6ade1e22 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_adjustsize.png diff --git a/kdevdesigner/designer/pics/designer_appicon.png b/kdevdesigner/designer/pics/designer_appicon.png Binary files differnew file mode 100644 index 00000000..7aadcbad --- /dev/null +++ b/kdevdesigner/designer/pics/designer_appicon.png diff --git a/kdevdesigner/designer/pics/designer_arrow.png b/kdevdesigner/designer/pics/designer_arrow.png Binary files differnew file mode 100644 index 00000000..53921d83 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_arrow.png diff --git a/kdevdesigner/designer/pics/designer_background.png b/kdevdesigner/designer/pics/designer_background.png Binary files differnew file mode 100644 index 00000000..27d2e997 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_background.png diff --git a/kdevdesigner/designer/pics/designer_book.png b/kdevdesigner/designer/pics/designer_book.png Binary files differnew file mode 100644 index 00000000..dd850abb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_book.png diff --git a/kdevdesigner/designer/pics/designer_buttongroup.png b/kdevdesigner/designer/pics/designer_buttongroup.png Binary files differnew file mode 100644 index 00000000..d89e28fd --- /dev/null +++ b/kdevdesigner/designer/pics/designer_buttongroup.png diff --git a/kdevdesigner/designer/pics/designer_checkbox.png b/kdevdesigner/designer/pics/designer_checkbox.png Binary files differnew file mode 100644 index 00000000..ab6f53e0 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_checkbox.png diff --git a/kdevdesigner/designer/pics/designer_combobox.png b/kdevdesigner/designer/pics/designer_combobox.png Binary files differnew file mode 100644 index 00000000..7d4890a7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_combobox.png diff --git a/kdevdesigner/designer/pics/designer_connecttool.png b/kdevdesigner/designer/pics/designer_connecttool.png Binary files differnew file mode 100644 index 00000000..fca6748f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_connecttool.png diff --git a/kdevdesigner/designer/pics/designer_cross.png b/kdevdesigner/designer/pics/designer_cross.png Binary files differnew file mode 100644 index 00000000..d5e9f0c7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_cross.png diff --git a/kdevdesigner/designer/pics/designer_customwidget.png b/kdevdesigner/designer/pics/designer_customwidget.png Binary files differnew file mode 100644 index 00000000..ab790e1f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_customwidget.png diff --git a/kdevdesigner/designer/pics/designer_d_adjustsize.png b/kdevdesigner/designer/pics/designer_d_adjustsize.png Binary files differnew file mode 100644 index 00000000..d61ca7af --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_adjustsize.png diff --git a/kdevdesigner/designer/pics/designer_d_book.png b/kdevdesigner/designer/pics/designer_d_book.png Binary files differnew file mode 100644 index 00000000..5517f0c4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_book.png diff --git a/kdevdesigner/designer/pics/designer_d_buttongroup.png b/kdevdesigner/designer/pics/designer_d_buttongroup.png Binary files differnew file mode 100644 index 00000000..1e451a88 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_buttongroup.png diff --git a/kdevdesigner/designer/pics/designer_d_checkbox.png b/kdevdesigner/designer/pics/designer_d_checkbox.png Binary files differnew file mode 100644 index 00000000..1415eabb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_checkbox.png diff --git a/kdevdesigner/designer/pics/designer_d_combobox.png b/kdevdesigner/designer/pics/designer_d_combobox.png Binary files differnew file mode 100644 index 00000000..5fb44eff --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_combobox.png diff --git a/kdevdesigner/designer/pics/designer_d_connecttool.png b/kdevdesigner/designer/pics/designer_d_connecttool.png Binary files differnew file mode 100644 index 00000000..76a3b5f5 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_connecttool.png diff --git a/kdevdesigner/designer/pics/designer_d_customwidget.png b/kdevdesigner/designer/pics/designer_d_customwidget.png Binary files differnew file mode 100644 index 00000000..5ea648fb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_customwidget.png diff --git a/kdevdesigner/designer/pics/designer_d_databrowser.png b/kdevdesigner/designer/pics/designer_d_databrowser.png Binary files differnew file mode 100644 index 00000000..c1155c8c --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_databrowser.png diff --git a/kdevdesigner/designer/pics/designer_d_datatable.png b/kdevdesigner/designer/pics/designer_d_datatable.png Binary files differnew file mode 100644 index 00000000..7060dc3a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_datatable.png diff --git a/kdevdesigner/designer/pics/designer_d_dataview.png b/kdevdesigner/designer/pics/designer_d_dataview.png Binary files differnew file mode 100644 index 00000000..c507d416 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_dataview.png diff --git a/kdevdesigner/designer/pics/designer_d_dateedit.png b/kdevdesigner/designer/pics/designer_d_dateedit.png Binary files differnew file mode 100644 index 00000000..162e63a8 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_dateedit.png diff --git a/kdevdesigner/designer/pics/designer_d_datetimeedit.png b/kdevdesigner/designer/pics/designer_d_datetimeedit.png Binary files differnew file mode 100644 index 00000000..83dc2fc3 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_datetimeedit.png diff --git a/kdevdesigner/designer/pics/designer_d_dial.png b/kdevdesigner/designer/pics/designer_d_dial.png Binary files differnew file mode 100644 index 00000000..a84869e4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_dial.png diff --git a/kdevdesigner/designer/pics/designer_d_down.png b/kdevdesigner/designer/pics/designer_d_down.png Binary files differnew file mode 100644 index 00000000..57b407e4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_down.png diff --git a/kdevdesigner/designer/pics/designer_d_editbreaklayout.png b/kdevdesigner/designer/pics/designer_d_editbreaklayout.png Binary files differnew file mode 100644 index 00000000..2a36d67d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editbreaklayout.png diff --git a/kdevdesigner/designer/pics/designer_d_editcopy.png b/kdevdesigner/designer/pics/designer_d_editcopy.png Binary files differnew file mode 100644 index 00000000..500758d4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editcopy.png diff --git a/kdevdesigner/designer/pics/designer_d_editcut.png b/kdevdesigner/designer/pics/designer_d_editcut.png Binary files differnew file mode 100644 index 00000000..8d50ae0a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editcut.png diff --git a/kdevdesigner/designer/pics/designer_d_editdelete.png b/kdevdesigner/designer/pics/designer_d_editdelete.png Binary files differnew file mode 100644 index 00000000..f4d0f7a1 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editdelete.png diff --git a/kdevdesigner/designer/pics/designer_d_editgrid.png b/kdevdesigner/designer/pics/designer_d_editgrid.png Binary files differnew file mode 100644 index 00000000..ad2b87b9 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editgrid.png diff --git a/kdevdesigner/designer/pics/designer_d_edithlayout.png b/kdevdesigner/designer/pics/designer_d_edithlayout.png Binary files differnew file mode 100644 index 00000000..dacaf82e --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_edithlayout.png diff --git a/kdevdesigner/designer/pics/designer_d_edithlayoutsplit.png b/kdevdesigner/designer/pics/designer_d_edithlayoutsplit.png Binary files differnew file mode 100644 index 00000000..00a96055 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_edithlayoutsplit.png diff --git a/kdevdesigner/designer/pics/designer_d_editlower.png b/kdevdesigner/designer/pics/designer_d_editlower.png Binary files differnew file mode 100644 index 00000000..a0a16b40 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editlower.png diff --git a/kdevdesigner/designer/pics/designer_d_editpaste.png b/kdevdesigner/designer/pics/designer_d_editpaste.png Binary files differnew file mode 100644 index 00000000..d31071e9 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editpaste.png diff --git a/kdevdesigner/designer/pics/designer_d_editraise.png b/kdevdesigner/designer/pics/designer_d_editraise.png Binary files differnew file mode 100644 index 00000000..5f7f04b9 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editraise.png diff --git a/kdevdesigner/designer/pics/designer_d_editslots.png b/kdevdesigner/designer/pics/designer_d_editslots.png Binary files differnew file mode 100644 index 00000000..cd791b43 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editslots.png diff --git a/kdevdesigner/designer/pics/designer_d_editvlayout.png b/kdevdesigner/designer/pics/designer_d_editvlayout.png Binary files differnew file mode 100644 index 00000000..ed202af7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editvlayout.png diff --git a/kdevdesigner/designer/pics/designer_d_editvlayoutsplit.png b/kdevdesigner/designer/pics/designer_d_editvlayoutsplit.png Binary files differnew file mode 100644 index 00000000..54ee44c0 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_editvlayoutsplit.png diff --git a/kdevdesigner/designer/pics/designer_d_filenew.png b/kdevdesigner/designer/pics/designer_d_filenew.png Binary files differnew file mode 100644 index 00000000..d5e7061b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_filenew.png diff --git a/kdevdesigner/designer/pics/designer_d_fileopen.png b/kdevdesigner/designer/pics/designer_d_fileopen.png Binary files differnew file mode 100644 index 00000000..343f0039 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_fileopen.png diff --git a/kdevdesigner/designer/pics/designer_d_filesave.png b/kdevdesigner/designer/pics/designer_d_filesave.png Binary files differnew file mode 100644 index 00000000..5d1476d2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_filesave.png diff --git a/kdevdesigner/designer/pics/designer_d_folder.png b/kdevdesigner/designer/pics/designer_d_folder.png Binary files differnew file mode 100644 index 00000000..4bed3caf --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_folder.png diff --git a/kdevdesigner/designer/pics/designer_d_form.png b/kdevdesigner/designer/pics/designer_d_form.png Binary files differnew file mode 100644 index 00000000..9f89d654 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_form.png diff --git a/kdevdesigner/designer/pics/designer_d_frame.png b/kdevdesigner/designer/pics/designer_d_frame.png Binary files differnew file mode 100644 index 00000000..09b21b21 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_frame.png diff --git a/kdevdesigner/designer/pics/designer_d_groupbox.png b/kdevdesigner/designer/pics/designer_d_groupbox.png Binary files differnew file mode 100644 index 00000000..e7e01083 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_groupbox.png diff --git a/kdevdesigner/designer/pics/designer_d_help.png b/kdevdesigner/designer/pics/designer_d_help.png Binary files differnew file mode 100644 index 00000000..8f9d1826 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_help.png diff --git a/kdevdesigner/designer/pics/designer_d_home.png b/kdevdesigner/designer/pics/designer_d_home.png Binary files differnew file mode 100644 index 00000000..b3906a4f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_home.png diff --git a/kdevdesigner/designer/pics/designer_d_iconview.png b/kdevdesigner/designer/pics/designer_d_iconview.png Binary files differnew file mode 100644 index 00000000..a07b2b75 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_iconview.png diff --git a/kdevdesigner/designer/pics/designer_d_image.png b/kdevdesigner/designer/pics/designer_d_image.png Binary files differnew file mode 100644 index 00000000..f7cb29c3 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_image.png diff --git a/kdevdesigner/designer/pics/designer_d_label.png b/kdevdesigner/designer/pics/designer_d_label.png Binary files differnew file mode 100644 index 00000000..bfbd5b88 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_label.png diff --git a/kdevdesigner/designer/pics/designer_d_layout.png b/kdevdesigner/designer/pics/designer_d_layout.png Binary files differnew file mode 100644 index 00000000..090b4bb2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_layout.png diff --git a/kdevdesigner/designer/pics/designer_d_lcdnumber.png b/kdevdesigner/designer/pics/designer_d_lcdnumber.png Binary files differnew file mode 100644 index 00000000..786747e6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_lcdnumber.png diff --git a/kdevdesigner/designer/pics/designer_d_left.png b/kdevdesigner/designer/pics/designer_d_left.png Binary files differnew file mode 100644 index 00000000..50d03bbe --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_left.png diff --git a/kdevdesigner/designer/pics/designer_d_line.png b/kdevdesigner/designer/pics/designer_d_line.png Binary files differnew file mode 100644 index 00000000..25b0daeb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_line.png diff --git a/kdevdesigner/designer/pics/designer_d_lineedit.png b/kdevdesigner/designer/pics/designer_d_lineedit.png Binary files differnew file mode 100644 index 00000000..9d34ce97 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_lineedit.png diff --git a/kdevdesigner/designer/pics/designer_d_listbox.png b/kdevdesigner/designer/pics/designer_d_listbox.png Binary files differnew file mode 100644 index 00000000..d80c7900 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_listbox.png diff --git a/kdevdesigner/designer/pics/designer_d_listview.png b/kdevdesigner/designer/pics/designer_d_listview.png Binary files differnew file mode 100644 index 00000000..c5d9be3e --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_listview.png diff --git a/kdevdesigner/designer/pics/designer_d_multilineedit.png b/kdevdesigner/designer/pics/designer_d_multilineedit.png Binary files differnew file mode 100644 index 00000000..a62e6622 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_multilineedit.png diff --git a/kdevdesigner/designer/pics/designer_d_newform.png b/kdevdesigner/designer/pics/designer_d_newform.png Binary files differnew file mode 100644 index 00000000..ace61302 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_newform.png diff --git a/kdevdesigner/designer/pics/designer_d_ordertool.png b/kdevdesigner/designer/pics/designer_d_ordertool.png Binary files differnew file mode 100644 index 00000000..61bdc7ef --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_ordertool.png diff --git a/kdevdesigner/designer/pics/designer_d_pixlabel.png b/kdevdesigner/designer/pics/designer_d_pixlabel.png Binary files differnew file mode 100644 index 00000000..21e1f492 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_pixlabel.png diff --git a/kdevdesigner/designer/pics/designer_d_pointer.png b/kdevdesigner/designer/pics/designer_d_pointer.png Binary files differnew file mode 100644 index 00000000..e6903eb6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_pointer.png diff --git a/kdevdesigner/designer/pics/designer_d_print.png b/kdevdesigner/designer/pics/designer_d_print.png Binary files differnew file mode 100644 index 00000000..6a72a764 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_print.png diff --git a/kdevdesigner/designer/pics/designer_d_progress.png b/kdevdesigner/designer/pics/designer_d_progress.png Binary files differnew file mode 100644 index 00000000..25d857a6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_progress.png diff --git a/kdevdesigner/designer/pics/designer_d_project.png b/kdevdesigner/designer/pics/designer_d_project.png Binary files differnew file mode 100644 index 00000000..b265eae0 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_project.png diff --git a/kdevdesigner/designer/pics/designer_d_pushbutton.png b/kdevdesigner/designer/pics/designer_d_pushbutton.png Binary files differnew file mode 100644 index 00000000..635f35cb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_pushbutton.png diff --git a/kdevdesigner/designer/pics/designer_d_radiobutton.png b/kdevdesigner/designer/pics/designer_d_radiobutton.png Binary files differnew file mode 100644 index 00000000..e86eb8c1 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_radiobutton.png diff --git a/kdevdesigner/designer/pics/designer_d_redo.png b/kdevdesigner/designer/pics/designer_d_redo.png Binary files differnew file mode 100644 index 00000000..6e993cc6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_redo.png diff --git a/kdevdesigner/designer/pics/designer_d_richtextedit.png b/kdevdesigner/designer/pics/designer_d_richtextedit.png Binary files differnew file mode 100644 index 00000000..ba7ada19 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_richtextedit.png diff --git a/kdevdesigner/designer/pics/designer_d_right.png b/kdevdesigner/designer/pics/designer_d_right.png Binary files differnew file mode 100644 index 00000000..9dbf2dd6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_right.png diff --git a/kdevdesigner/designer/pics/designer_d_scrollbar.png b/kdevdesigner/designer/pics/designer_d_scrollbar.png Binary files differnew file mode 100644 index 00000000..9a818970 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_scrollbar.png diff --git a/kdevdesigner/designer/pics/designer_d_searchfind.png b/kdevdesigner/designer/pics/designer_d_searchfind.png Binary files differnew file mode 100644 index 00000000..e85e33fe --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_searchfind.png diff --git a/kdevdesigner/designer/pics/designer_d_setbuddy.png b/kdevdesigner/designer/pics/designer_d_setbuddy.png Binary files differnew file mode 100644 index 00000000..fe816aa2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_setbuddy.png diff --git a/kdevdesigner/designer/pics/designer_d_slider.png b/kdevdesigner/designer/pics/designer_d_slider.png Binary files differnew file mode 100644 index 00000000..a1ad5d5b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_slider.png diff --git a/kdevdesigner/designer/pics/designer_d_spacer.png b/kdevdesigner/designer/pics/designer_d_spacer.png Binary files differnew file mode 100644 index 00000000..15319d99 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_spacer.png diff --git a/kdevdesigner/designer/pics/designer_d_spinbox.png b/kdevdesigner/designer/pics/designer_d_spinbox.png Binary files differnew file mode 100644 index 00000000..cafbe012 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_spinbox.png diff --git a/kdevdesigner/designer/pics/designer_d_table.png b/kdevdesigner/designer/pics/designer_d_table.png Binary files differnew file mode 100644 index 00000000..a95bde12 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_table.png diff --git a/kdevdesigner/designer/pics/designer_d_tabwidget.png b/kdevdesigner/designer/pics/designer_d_tabwidget.png Binary files differnew file mode 100644 index 00000000..0f0bad0d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_tabwidget.png diff --git a/kdevdesigner/designer/pics/designer_d_textbold.png b/kdevdesigner/designer/pics/designer_d_textbold.png Binary files differnew file mode 100644 index 00000000..6e8a5cf5 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textbold.png diff --git a/kdevdesigner/designer/pics/designer_d_textbrowser.png b/kdevdesigner/designer/pics/designer_d_textbrowser.png Binary files differnew file mode 100644 index 00000000..b4315f90 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textbrowser.png diff --git a/kdevdesigner/designer/pics/designer_d_textcenter.png b/kdevdesigner/designer/pics/designer_d_textcenter.png Binary files differnew file mode 100644 index 00000000..7a66036d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textcenter.png diff --git a/kdevdesigner/designer/pics/designer_d_textedit.png b/kdevdesigner/designer/pics/designer_d_textedit.png Binary files differnew file mode 100644 index 00000000..69314141 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textedit.png diff --git a/kdevdesigner/designer/pics/designer_d_textfont.png b/kdevdesigner/designer/pics/designer_d_textfont.png Binary files differnew file mode 100644 index 00000000..beb2112b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textfont.png diff --git a/kdevdesigner/designer/pics/designer_d_texth1.png b/kdevdesigner/designer/pics/designer_d_texth1.png Binary files differnew file mode 100644 index 00000000..87d7e157 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_texth1.png diff --git a/kdevdesigner/designer/pics/designer_d_texth2.png b/kdevdesigner/designer/pics/designer_d_texth2.png Binary files differnew file mode 100644 index 00000000..e90437b2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_texth2.png diff --git a/kdevdesigner/designer/pics/designer_d_texth3.png b/kdevdesigner/designer/pics/designer_d_texth3.png Binary files differnew file mode 100644 index 00000000..1c7eefe5 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_texth3.png diff --git a/kdevdesigner/designer/pics/designer_d_textitalic.png b/kdevdesigner/designer/pics/designer_d_textitalic.png Binary files differnew file mode 100644 index 00000000..d2c07fad --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textitalic.png diff --git a/kdevdesigner/designer/pics/designer_d_textjustify.png b/kdevdesigner/designer/pics/designer_d_textjustify.png Binary files differnew file mode 100644 index 00000000..3fb3cc34 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textjustify.png diff --git a/kdevdesigner/designer/pics/designer_d_textlarger.png b/kdevdesigner/designer/pics/designer_d_textlarger.png Binary files differnew file mode 100644 index 00000000..ecc35f54 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textlarger.png diff --git a/kdevdesigner/designer/pics/designer_d_textleft.png b/kdevdesigner/designer/pics/designer_d_textleft.png Binary files differnew file mode 100644 index 00000000..90dc0248 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textleft.png diff --git a/kdevdesigner/designer/pics/designer_d_textlinebreak.png b/kdevdesigner/designer/pics/designer_d_textlinebreak.png Binary files differnew file mode 100644 index 00000000..4566f59e --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textlinebreak.png diff --git a/kdevdesigner/designer/pics/designer_d_textparagraph.png b/kdevdesigner/designer/pics/designer_d_textparagraph.png Binary files differnew file mode 100644 index 00000000..a7ef75c7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textparagraph.png diff --git a/kdevdesigner/designer/pics/designer_d_textright.png b/kdevdesigner/designer/pics/designer_d_textright.png Binary files differnew file mode 100644 index 00000000..ee89b93b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textright.png diff --git a/kdevdesigner/designer/pics/designer_d_textsmaller.png b/kdevdesigner/designer/pics/designer_d_textsmaller.png Binary files differnew file mode 100644 index 00000000..d4251de0 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textsmaller.png diff --git a/kdevdesigner/designer/pics/designer_d_textteletext.png b/kdevdesigner/designer/pics/designer_d_textteletext.png Binary files differnew file mode 100644 index 00000000..d80af143 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textteletext.png diff --git a/kdevdesigner/designer/pics/designer_d_textunderline.png b/kdevdesigner/designer/pics/designer_d_textunderline.png Binary files differnew file mode 100644 index 00000000..cab0b788 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textunderline.png diff --git a/kdevdesigner/designer/pics/designer_d_textview.png b/kdevdesigner/designer/pics/designer_d_textview.png Binary files differnew file mode 100644 index 00000000..05ce9c69 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_textview.png diff --git a/kdevdesigner/designer/pics/designer_d_timeedit.png b/kdevdesigner/designer/pics/designer_d_timeedit.png Binary files differnew file mode 100644 index 00000000..955144ec --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_timeedit.png diff --git a/kdevdesigner/designer/pics/designer_d_toolbox.png b/kdevdesigner/designer/pics/designer_d_toolbox.png Binary files differnew file mode 100644 index 00000000..e1f84471 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_toolbox.png diff --git a/kdevdesigner/designer/pics/designer_d_toolbutton.png b/kdevdesigner/designer/pics/designer_d_toolbutton.png Binary files differnew file mode 100644 index 00000000..08e309a7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_toolbutton.png diff --git a/kdevdesigner/designer/pics/designer_d_undo.png b/kdevdesigner/designer/pics/designer_d_undo.png Binary files differnew file mode 100644 index 00000000..22ac97f2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_undo.png diff --git a/kdevdesigner/designer/pics/designer_d_up.png b/kdevdesigner/designer/pics/designer_d_up.png Binary files differnew file mode 100644 index 00000000..4c3ab7c9 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_up.png diff --git a/kdevdesigner/designer/pics/designer_d_widgetstack.png b/kdevdesigner/designer/pics/designer_d_widgetstack.png Binary files differnew file mode 100644 index 00000000..c62f8e15 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_widgetstack.png diff --git a/kdevdesigner/designer/pics/designer_d_wizarddata.png b/kdevdesigner/designer/pics/designer_d_wizarddata.png Binary files differnew file mode 100644 index 00000000..fb540b87 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_wizarddata.png diff --git a/kdevdesigner/designer/pics/designer_d_wizarddialog.png b/kdevdesigner/designer/pics/designer_d_wizarddialog.png Binary files differnew file mode 100644 index 00000000..b83ca7e6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_wizarddialog.png diff --git a/kdevdesigner/designer/pics/designer_d_wordwrap.png b/kdevdesigner/designer/pics/designer_d_wordwrap.png Binary files differnew file mode 100644 index 00000000..8a299033 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_d_wordwrap.png diff --git a/kdevdesigner/designer/pics/designer_databrowser.png b/kdevdesigner/designer/pics/designer_databrowser.png Binary files differnew file mode 100644 index 00000000..1dd95782 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_databrowser.png diff --git a/kdevdesigner/designer/pics/designer_datatable.png b/kdevdesigner/designer/pics/designer_datatable.png Binary files differnew file mode 100644 index 00000000..5b3bfc76 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_datatable.png diff --git a/kdevdesigner/designer/pics/designer_dataview.png b/kdevdesigner/designer/pics/designer_dataview.png Binary files differnew file mode 100644 index 00000000..5f6aad33 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_dataview.png diff --git a/kdevdesigner/designer/pics/designer_dateedit.png b/kdevdesigner/designer/pics/designer_dateedit.png Binary files differnew file mode 100644 index 00000000..48286bec --- /dev/null +++ b/kdevdesigner/designer/pics/designer_dateedit.png diff --git a/kdevdesigner/designer/pics/designer_datetimeedit.png b/kdevdesigner/designer/pics/designer_datetimeedit.png Binary files differnew file mode 100644 index 00000000..68a56737 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_datetimeedit.png diff --git a/kdevdesigner/designer/pics/designer_dial.png b/kdevdesigner/designer/pics/designer_dial.png Binary files differnew file mode 100644 index 00000000..260033c2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_dial.png diff --git a/kdevdesigner/designer/pics/designer_down.png b/kdevdesigner/designer/pics/designer_down.png Binary files differnew file mode 100644 index 00000000..3269deca --- /dev/null +++ b/kdevdesigner/designer/pics/designer_down.png diff --git a/kdevdesigner/designer/pics/designer_editbreaklayout.png b/kdevdesigner/designer/pics/designer_editbreaklayout.png Binary files differnew file mode 100644 index 00000000..badbb8e7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editbreaklayout.png diff --git a/kdevdesigner/designer/pics/designer_editcopy.png b/kdevdesigner/designer/pics/designer_editcopy.png Binary files differnew file mode 100644 index 00000000..2f931cb2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editcopy.png diff --git a/kdevdesigner/designer/pics/designer_editcut.png b/kdevdesigner/designer/pics/designer_editcut.png Binary files differnew file mode 100644 index 00000000..a911482d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editcut.png diff --git a/kdevdesigner/designer/pics/designer_editdelete.png b/kdevdesigner/designer/pics/designer_editdelete.png Binary files differnew file mode 100644 index 00000000..9f0491dd --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editdelete.png diff --git a/kdevdesigner/designer/pics/designer_editgrid.png b/kdevdesigner/designer/pics/designer_editgrid.png Binary files differnew file mode 100644 index 00000000..f2b18e8a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editgrid.png diff --git a/kdevdesigner/designer/pics/designer_edithlayout.png b/kdevdesigner/designer/pics/designer_edithlayout.png Binary files differnew file mode 100644 index 00000000..1a2b1504 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_edithlayout.png diff --git a/kdevdesigner/designer/pics/designer_edithlayoutsplit.png b/kdevdesigner/designer/pics/designer_edithlayoutsplit.png Binary files differnew file mode 100644 index 00000000..cba102bc --- /dev/null +++ b/kdevdesigner/designer/pics/designer_edithlayoutsplit.png diff --git a/kdevdesigner/designer/pics/designer_editlower.png b/kdevdesigner/designer/pics/designer_editlower.png Binary files differnew file mode 100644 index 00000000..50605f27 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editlower.png diff --git a/kdevdesigner/designer/pics/designer_editpaste.png b/kdevdesigner/designer/pics/designer_editpaste.png Binary files differnew file mode 100644 index 00000000..b1b7f853 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editpaste.png diff --git a/kdevdesigner/designer/pics/designer_editraise.png b/kdevdesigner/designer/pics/designer_editraise.png Binary files differnew file mode 100644 index 00000000..f1572517 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editraise.png diff --git a/kdevdesigner/designer/pics/designer_editslots.png b/kdevdesigner/designer/pics/designer_editslots.png Binary files differnew file mode 100644 index 00000000..b86bddb6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editslots.png diff --git a/kdevdesigner/designer/pics/designer_editvlayout.png b/kdevdesigner/designer/pics/designer_editvlayout.png Binary files differnew file mode 100644 index 00000000..f4cd3f9c --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editvlayout.png diff --git a/kdevdesigner/designer/pics/designer_editvlayoutsplit.png b/kdevdesigner/designer/pics/designer_editvlayoutsplit.png Binary files differnew file mode 100644 index 00000000..0180cf5a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_editvlayoutsplit.png diff --git a/kdevdesigner/designer/pics/designer_filenew.png b/kdevdesigner/designer/pics/designer_filenew.png Binary files differnew file mode 100644 index 00000000..9520080e --- /dev/null +++ b/kdevdesigner/designer/pics/designer_filenew.png diff --git a/kdevdesigner/designer/pics/designer_fileopen.png b/kdevdesigner/designer/pics/designer_fileopen.png Binary files differnew file mode 100644 index 00000000..30052901 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_fileopen.png diff --git a/kdevdesigner/designer/pics/designer_filesave.png b/kdevdesigner/designer/pics/designer_filesave.png Binary files differnew file mode 100644 index 00000000..c137165b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_filesave.png diff --git a/kdevdesigner/designer/pics/designer_folder.png b/kdevdesigner/designer/pics/designer_folder.png Binary files differnew file mode 100644 index 00000000..bab6df0f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_folder.png diff --git a/kdevdesigner/designer/pics/designer_form.png b/kdevdesigner/designer/pics/designer_form.png Binary files differnew file mode 100644 index 00000000..08268bf7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_form.png diff --git a/kdevdesigner/designer/pics/designer_frame.png b/kdevdesigner/designer/pics/designer_frame.png Binary files differnew file mode 100644 index 00000000..c070b9c4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_frame.png diff --git a/kdevdesigner/designer/pics/designer_groupbox.png b/kdevdesigner/designer/pics/designer_groupbox.png Binary files differnew file mode 100644 index 00000000..4025b4dc --- /dev/null +++ b/kdevdesigner/designer/pics/designer_groupbox.png diff --git a/kdevdesigner/designer/pics/designer_hand.png b/kdevdesigner/designer/pics/designer_hand.png Binary files differnew file mode 100644 index 00000000..ac01ee60 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_hand.png diff --git a/kdevdesigner/designer/pics/designer_help.png b/kdevdesigner/designer/pics/designer_help.png Binary files differnew file mode 100644 index 00000000..2ab2c25d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_help.png diff --git a/kdevdesigner/designer/pics/designer_home.png b/kdevdesigner/designer/pics/designer_home.png Binary files differnew file mode 100644 index 00000000..806d11d2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_home.png diff --git a/kdevdesigner/designer/pics/designer_hsplit.png b/kdevdesigner/designer/pics/designer_hsplit.png Binary files differnew file mode 100644 index 00000000..232faf14 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_hsplit.png diff --git a/kdevdesigner/designer/pics/designer_ibeam.png b/kdevdesigner/designer/pics/designer_ibeam.png Binary files differnew file mode 100644 index 00000000..6074c89f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_ibeam.png diff --git a/kdevdesigner/designer/pics/designer_iconview.png b/kdevdesigner/designer/pics/designer_iconview.png Binary files differnew file mode 100644 index 00000000..13b8f153 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_iconview.png diff --git a/kdevdesigner/designer/pics/designer_image.png b/kdevdesigner/designer/pics/designer_image.png Binary files differnew file mode 100644 index 00000000..29854df6 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_image.png diff --git a/kdevdesigner/designer/pics/designer_label.png b/kdevdesigner/designer/pics/designer_label.png Binary files differnew file mode 100644 index 00000000..5d7d7b4c --- /dev/null +++ b/kdevdesigner/designer/pics/designer_label.png diff --git a/kdevdesigner/designer/pics/designer_layout.png b/kdevdesigner/designer/pics/designer_layout.png Binary files differnew file mode 100644 index 00000000..168eb1f8 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_layout.png diff --git a/kdevdesigner/designer/pics/designer_lcdnumber.png b/kdevdesigner/designer/pics/designer_lcdnumber.png Binary files differnew file mode 100644 index 00000000..64eda5e4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_lcdnumber.png diff --git a/kdevdesigner/designer/pics/designer_left.png b/kdevdesigner/designer/pics/designer_left.png Binary files differnew file mode 100644 index 00000000..e58177f4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_left.png diff --git a/kdevdesigner/designer/pics/designer_line.png b/kdevdesigner/designer/pics/designer_line.png Binary files differnew file mode 100644 index 00000000..5c64dfb5 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_line.png diff --git a/kdevdesigner/designer/pics/designer_lineedit.png b/kdevdesigner/designer/pics/designer_lineedit.png Binary files differnew file mode 100644 index 00000000..75fc890f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_lineedit.png diff --git a/kdevdesigner/designer/pics/designer_listbox.png b/kdevdesigner/designer/pics/designer_listbox.png Binary files differnew file mode 100644 index 00000000..d467fc9f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_listbox.png diff --git a/kdevdesigner/designer/pics/designer_listview.png b/kdevdesigner/designer/pics/designer_listview.png Binary files differnew file mode 100644 index 00000000..d71cc1c9 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_listview.png diff --git a/kdevdesigner/designer/pics/designer_multilineedit.png b/kdevdesigner/designer/pics/designer_multilineedit.png Binary files differnew file mode 100644 index 00000000..e2f08995 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_multilineedit.png diff --git a/kdevdesigner/designer/pics/designer_newform.png b/kdevdesigner/designer/pics/designer_newform.png Binary files differnew file mode 100644 index 00000000..37779c13 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_newform.png diff --git a/kdevdesigner/designer/pics/designer_no.png b/kdevdesigner/designer/pics/designer_no.png Binary files differnew file mode 100644 index 00000000..8bacc044 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_no.png diff --git a/kdevdesigner/designer/pics/designer_object.png b/kdevdesigner/designer/pics/designer_object.png Binary files differnew file mode 100644 index 00000000..cc4192ed --- /dev/null +++ b/kdevdesigner/designer/pics/designer_object.png diff --git a/kdevdesigner/designer/pics/designer_ordertool.png b/kdevdesigner/designer/pics/designer_ordertool.png Binary files differnew file mode 100644 index 00000000..ad122839 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_ordertool.png diff --git a/kdevdesigner/designer/pics/designer_pixlabel.png b/kdevdesigner/designer/pics/designer_pixlabel.png Binary files differnew file mode 100644 index 00000000..32b90d82 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_pixlabel.png diff --git a/kdevdesigner/designer/pics/designer_pointer.png b/kdevdesigner/designer/pics/designer_pointer.png Binary files differnew file mode 100644 index 00000000..67e38a36 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_pointer.png diff --git a/kdevdesigner/designer/pics/designer_print.png b/kdevdesigner/designer/pics/designer_print.png Binary files differnew file mode 100644 index 00000000..57e3e532 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_print.png diff --git a/kdevdesigner/designer/pics/designer_progress.png b/kdevdesigner/designer/pics/designer_progress.png Binary files differnew file mode 100644 index 00000000..44ae094e --- /dev/null +++ b/kdevdesigner/designer/pics/designer_progress.png diff --git a/kdevdesigner/designer/pics/designer_project.png b/kdevdesigner/designer/pics/designer_project.png Binary files differnew file mode 100644 index 00000000..6a0fb96f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_project.png diff --git a/kdevdesigner/designer/pics/designer_pushbutton.png b/kdevdesigner/designer/pics/designer_pushbutton.png Binary files differnew file mode 100644 index 00000000..61f779ce --- /dev/null +++ b/kdevdesigner/designer/pics/designer_pushbutton.png diff --git a/kdevdesigner/designer/pics/designer_qtlogo.png b/kdevdesigner/designer/pics/designer_qtlogo.png Binary files differnew file mode 100644 index 00000000..4e1a1472 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_qtlogo.png diff --git a/kdevdesigner/designer/pics/designer_radiobutton.png b/kdevdesigner/designer/pics/designer_radiobutton.png Binary files differnew file mode 100644 index 00000000..10c1d8c3 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_radiobutton.png diff --git a/kdevdesigner/designer/pics/designer_redo.png b/kdevdesigner/designer/pics/designer_redo.png Binary files differnew file mode 100644 index 00000000..abdad26c --- /dev/null +++ b/kdevdesigner/designer/pics/designer_redo.png diff --git a/kdevdesigner/designer/pics/designer_resetproperty.png b/kdevdesigner/designer/pics/designer_resetproperty.png Binary files differnew file mode 100644 index 00000000..cc0d6a26 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_resetproperty.png diff --git a/kdevdesigner/designer/pics/designer_richtextedit.png b/kdevdesigner/designer/pics/designer_richtextedit.png Binary files differnew file mode 100644 index 00000000..73573a8a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_richtextedit.png diff --git a/kdevdesigner/designer/pics/designer_right.png b/kdevdesigner/designer/pics/designer_right.png Binary files differnew file mode 100644 index 00000000..5f2f7036 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_right.png diff --git a/kdevdesigner/designer/pics/designer_s_down.png b/kdevdesigner/designer/pics/designer_s_down.png Binary files differnew file mode 100644 index 00000000..908e55e1 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_s_down.png diff --git a/kdevdesigner/designer/pics/designer_s_editcut.png b/kdevdesigner/designer/pics/designer_s_editcut.png Binary files differnew file mode 100644 index 00000000..7cf5a9eb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_s_editcut.png diff --git a/kdevdesigner/designer/pics/designer_s_left.png b/kdevdesigner/designer/pics/designer_s_left.png Binary files differnew file mode 100644 index 00000000..e6e19f8f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_s_left.png diff --git a/kdevdesigner/designer/pics/designer_s_right.png b/kdevdesigner/designer/pics/designer_s_right.png Binary files differnew file mode 100644 index 00000000..bfccda6b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_s_right.png diff --git a/kdevdesigner/designer/pics/designer_s_up.png b/kdevdesigner/designer/pics/designer_s_up.png Binary files differnew file mode 100644 index 00000000..97705d47 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_s_up.png diff --git a/kdevdesigner/designer/pics/designer_scrollbar.png b/kdevdesigner/designer/pics/designer_scrollbar.png Binary files differnew file mode 100644 index 00000000..466c58de --- /dev/null +++ b/kdevdesigner/designer/pics/designer_scrollbar.png diff --git a/kdevdesigner/designer/pics/designer_searchfind.png b/kdevdesigner/designer/pics/designer_searchfind.png Binary files differnew file mode 100644 index 00000000..3f369fdb --- /dev/null +++ b/kdevdesigner/designer/pics/designer_searchfind.png diff --git a/kdevdesigner/designer/pics/designer_setbuddy.png b/kdevdesigner/designer/pics/designer_setbuddy.png Binary files differnew file mode 100644 index 00000000..c1edb89b --- /dev/null +++ b/kdevdesigner/designer/pics/designer_setbuddy.png diff --git a/kdevdesigner/designer/pics/designer_sizeall.png b/kdevdesigner/designer/pics/designer_sizeall.png Binary files differnew file mode 100644 index 00000000..fa2a266a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_sizeall.png diff --git a/kdevdesigner/designer/pics/designer_sizeb.png b/kdevdesigner/designer/pics/designer_sizeb.png Binary files differnew file mode 100644 index 00000000..ac5235b0 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_sizeb.png diff --git a/kdevdesigner/designer/pics/designer_sizef.png b/kdevdesigner/designer/pics/designer_sizef.png Binary files differnew file mode 100644 index 00000000..28a30c29 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_sizef.png diff --git a/kdevdesigner/designer/pics/designer_sizeh.png b/kdevdesigner/designer/pics/designer_sizeh.png Binary files differnew file mode 100644 index 00000000..7b8abd3a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_sizeh.png diff --git a/kdevdesigner/designer/pics/designer_sizev.png b/kdevdesigner/designer/pics/designer_sizev.png Binary files differnew file mode 100644 index 00000000..80b3d8b2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_sizev.png diff --git a/kdevdesigner/designer/pics/designer_slider.png b/kdevdesigner/designer/pics/designer_slider.png Binary files differnew file mode 100644 index 00000000..525bd1ca --- /dev/null +++ b/kdevdesigner/designer/pics/designer_slider.png diff --git a/kdevdesigner/designer/pics/designer_spacer.png b/kdevdesigner/designer/pics/designer_spacer.png Binary files differnew file mode 100644 index 00000000..926e8afc --- /dev/null +++ b/kdevdesigner/designer/pics/designer_spacer.png diff --git a/kdevdesigner/designer/pics/designer_spinbox.png b/kdevdesigner/designer/pics/designer_spinbox.png Binary files differnew file mode 100644 index 00000000..7ae20630 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_spinbox.png diff --git a/kdevdesigner/designer/pics/designer_splash.png b/kdevdesigner/designer/pics/designer_splash.png Binary files differnew file mode 100644 index 00000000..d3b62a17 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_splash.png diff --git a/kdevdesigner/designer/pics/designer_table.png b/kdevdesigner/designer/pics/designer_table.png Binary files differnew file mode 100644 index 00000000..4bbd9c2d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_table.png diff --git a/kdevdesigner/designer/pics/designer_tabwidget.png b/kdevdesigner/designer/pics/designer_tabwidget.png Binary files differnew file mode 100644 index 00000000..1254bb63 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_tabwidget.png diff --git a/kdevdesigner/designer/pics/designer_textbold.png b/kdevdesigner/designer/pics/designer_textbold.png Binary files differnew file mode 100644 index 00000000..7f4f7344 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textbold.png diff --git a/kdevdesigner/designer/pics/designer_textbrowser.png b/kdevdesigner/designer/pics/designer_textbrowser.png Binary files differnew file mode 100644 index 00000000..090e2f84 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textbrowser.png diff --git a/kdevdesigner/designer/pics/designer_textcenter.png b/kdevdesigner/designer/pics/designer_textcenter.png Binary files differnew file mode 100644 index 00000000..5c68b09c --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textcenter.png diff --git a/kdevdesigner/designer/pics/designer_textedit.png b/kdevdesigner/designer/pics/designer_textedit.png Binary files differnew file mode 100644 index 00000000..823d0818 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textedit.png diff --git a/kdevdesigner/designer/pics/designer_textfont.png b/kdevdesigner/designer/pics/designer_textfont.png Binary files differnew file mode 100644 index 00000000..a4de87a4 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textfont.png diff --git a/kdevdesigner/designer/pics/designer_texth1.png b/kdevdesigner/designer/pics/designer_texth1.png Binary files differnew file mode 100644 index 00000000..1c3aa2fd --- /dev/null +++ b/kdevdesigner/designer/pics/designer_texth1.png diff --git a/kdevdesigner/designer/pics/designer_texth2.png b/kdevdesigner/designer/pics/designer_texth2.png Binary files differnew file mode 100644 index 00000000..ba73121d --- /dev/null +++ b/kdevdesigner/designer/pics/designer_texth2.png diff --git a/kdevdesigner/designer/pics/designer_texth3.png b/kdevdesigner/designer/pics/designer_texth3.png Binary files differnew file mode 100644 index 00000000..1d9f8732 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_texth3.png diff --git a/kdevdesigner/designer/pics/designer_textitalic.png b/kdevdesigner/designer/pics/designer_textitalic.png Binary files differnew file mode 100644 index 00000000..68e2b44c --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textitalic.png diff --git a/kdevdesigner/designer/pics/designer_textjustify.png b/kdevdesigner/designer/pics/designer_textjustify.png Binary files differnew file mode 100644 index 00000000..6e746c80 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textjustify.png diff --git a/kdevdesigner/designer/pics/designer_textlarger.png b/kdevdesigner/designer/pics/designer_textlarger.png Binary files differnew file mode 100644 index 00000000..89960939 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textlarger.png diff --git a/kdevdesigner/designer/pics/designer_textleft.png b/kdevdesigner/designer/pics/designer_textleft.png Binary files differnew file mode 100644 index 00000000..72b27652 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textleft.png diff --git a/kdevdesigner/designer/pics/designer_textlinebreak.png b/kdevdesigner/designer/pics/designer_textlinebreak.png Binary files differnew file mode 100644 index 00000000..081a49e0 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textlinebreak.png diff --git a/kdevdesigner/designer/pics/designer_textparagraph.png b/kdevdesigner/designer/pics/designer_textparagraph.png Binary files differnew file mode 100644 index 00000000..dcd0b3ea --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textparagraph.png diff --git a/kdevdesigner/designer/pics/designer_textright.png b/kdevdesigner/designer/pics/designer_textright.png Binary files differnew file mode 100644 index 00000000..d7186722 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textright.png diff --git a/kdevdesigner/designer/pics/designer_textsmaller.png b/kdevdesigner/designer/pics/designer_textsmaller.png Binary files differnew file mode 100644 index 00000000..10953d9a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textsmaller.png diff --git a/kdevdesigner/designer/pics/designer_textteletext.png b/kdevdesigner/designer/pics/designer_textteletext.png Binary files differnew file mode 100644 index 00000000..c0204636 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textteletext.png diff --git a/kdevdesigner/designer/pics/designer_textunderline.png b/kdevdesigner/designer/pics/designer_textunderline.png Binary files differnew file mode 100644 index 00000000..3477ccb3 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textunderline.png diff --git a/kdevdesigner/designer/pics/designer_textview.png b/kdevdesigner/designer/pics/designer_textview.png Binary files differnew file mode 100644 index 00000000..ec2270c3 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_textview.png diff --git a/kdevdesigner/designer/pics/designer_timeedit.png b/kdevdesigner/designer/pics/designer_timeedit.png Binary files differnew file mode 100644 index 00000000..01b37888 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_timeedit.png diff --git a/kdevdesigner/designer/pics/designer_toolbox.png b/kdevdesigner/designer/pics/designer_toolbox.png Binary files differnew file mode 100644 index 00000000..2ab71dc7 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_toolbox.png diff --git a/kdevdesigner/designer/pics/designer_toolbutton.png b/kdevdesigner/designer/pics/designer_toolbutton.png Binary files differnew file mode 100644 index 00000000..25d240a1 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_toolbutton.png diff --git a/kdevdesigner/designer/pics/designer_undo.png b/kdevdesigner/designer/pics/designer_undo.png Binary files differnew file mode 100644 index 00000000..839a823f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_undo.png diff --git a/kdevdesigner/designer/pics/designer_up.png b/kdevdesigner/designer/pics/designer_up.png Binary files differnew file mode 100644 index 00000000..e4373122 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_up.png diff --git a/kdevdesigner/designer/pics/designer_uparrow.png b/kdevdesigner/designer/pics/designer_uparrow.png Binary files differnew file mode 100644 index 00000000..eefe4a00 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_uparrow.png diff --git a/kdevdesigner/designer/pics/designer_vsplit.png b/kdevdesigner/designer/pics/designer_vsplit.png Binary files differnew file mode 100644 index 00000000..b820c19f --- /dev/null +++ b/kdevdesigner/designer/pics/designer_vsplit.png diff --git a/kdevdesigner/designer/pics/designer_wait.png b/kdevdesigner/designer/pics/designer_wait.png Binary files differnew file mode 100644 index 00000000..5d8cfed2 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_wait.png diff --git a/kdevdesigner/designer/pics/designer_widgetstack.png b/kdevdesigner/designer/pics/designer_widgetstack.png Binary files differnew file mode 100644 index 00000000..c326de81 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_widgetstack.png diff --git a/kdevdesigner/designer/pics/designer_wizarddata.png b/kdevdesigner/designer/pics/designer_wizarddata.png Binary files differnew file mode 100644 index 00000000..9493e3b1 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_wizarddata.png diff --git a/kdevdesigner/designer/pics/designer_wizarddialog.png b/kdevdesigner/designer/pics/designer_wizarddialog.png Binary files differnew file mode 100644 index 00000000..a22dc88a --- /dev/null +++ b/kdevdesigner/designer/pics/designer_wizarddialog.png diff --git a/kdevdesigner/designer/pics/designer_wordwrap.png b/kdevdesigner/designer/pics/designer_wordwrap.png Binary files differnew file mode 100644 index 00000000..29513c32 --- /dev/null +++ b/kdevdesigner/designer/pics/designer_wordwrap.png diff --git a/kdevdesigner/designer/pixmapchooser.cpp b/kdevdesigner/designer/pixmapchooser.cpp new file mode 100644 index 00000000..92d68ac1 --- /dev/null +++ b/kdevdesigner/designer/pixmapchooser.cpp @@ -0,0 +1,231 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler needs this here + +#include <kiconloader.h> +#include <kimageio.h> +#include <tdefiledialog.h> +#include <kimagefilepreview.h> +#include <klineedit.h> + +#include "kdevdesigner_part.h" + +#include "pixmapchooser.h" +#include "formwindow.h" +#if defined(DESIGNER) && !defined(RESOURCE) +#include "pixmapfunction.h" +#endif +#include "metadatabase.h" +#include "mainwindow.h" +#include "pixmapcollectioneditor.h" +#include "pixmapcollection.h" +#include "project.h" + +#include <tqapplication.h> +#include <tqimage.h> +#include <tqpainter.h> +#include <tqlabel.h> +#include <tqpushbutton.h> +#include <tqiconview.h> + +#if defined(DESIGNER) +static ImageIconProvider *imageIconProvider = 0; +#endif + +PixmapView::PixmapView( TQWidget *parent ) + : TQScrollView( parent ) +{ + viewport()->setBackgroundMode( PaletteBase ); +} + +void PixmapView::setPixmap( const TQPixmap &pix ) +{ + pixmap = pix; + resizeContents( pixmap.size().width(), pixmap.size().height() ); + viewport()->repaint( FALSE ); +} + +void PixmapView::drawContents( TQPainter *p, int cx, int cy, int cw, int ch ) +{ + p->fillRect( cx, cy, cw, ch, colorGroup().brush( TQColorGroup::Base ) ); + p->drawPixmap( 0, 0, pixmap ); +} + +void PixmapView::previewUrl( const TQUrl &u ) +{ + if ( u.isLocalFile() ) { + TQString path = u.path(); + TQPixmap pix( path ); + if ( !pix.isNull() ) + setPixmap( pix ); + } else { + tqWarning( "Previewing remote files not supported." ); + } +} + +static void buildImageFormatList( TQString &filter, TQString &all ) +{ + all = tqApp->translate( "qChoosePixmap", "All Pixmaps (" ); + for ( uint i = 0; i < TQImageIO::outputFormats().count(); i++ ) { + TQString outputFormat = TQImageIO::outputFormats().at( i ); + TQString outputExtension; + if ( outputFormat != "JPEG" ) + outputExtension = outputFormat.lower(); + else + outputExtension = "jpg;*.jpeg"; + filter += TQString(tqApp->translate( "qChoosePixmap", "%1-Pixmaps (%2)\n" )). + arg( outputFormat ).arg( "*." + outputExtension); + all += "*." + outputExtension + ";"; + } + filter.prepend( all + tqApp->translate( "qChoosePixmap", ")\n" ) ); + filter += tqApp->translate( "qChoosePixmap", "All Files (*)" ); + +} +TQStringList qChoosePixmaps( TQWidget *parent ) +{ +/* if ( !imageIconProvider && !TQFileDialog::iconProvider() ) + TQFileDialog::setIconProvider( ( imageIconProvider = new ImageIconProvider ) ); + + TQString filter; + TQString all; + buildImageFormatList( filter, all ); + + TQFileDialog fd( TQString(), filter, parent, 0, TRUE ); + fd.setMode( TQFileDialog::ExistingFiles ); + fd.setContentsPreviewEnabled( TRUE ); + PixmapView *pw = new PixmapView( &fd ); + fd.setContentsPreview( pw, pw ); + fd.setViewMode( TQFileDialog::List ); + fd.setPreviewMode( TQFileDialog::Contents ); + fd.setCaption( tqApp->translate( "qChoosePixmap", "Choose Images..." ) ); + if ( fd.exec() == TQDialog::Accepted ) + return fd.selectedFiles(); + return TQStringList();*/ + TQStringList mimetypes = KImageIO::mimeTypes( KImageIO::Reading ); + KFileDialog dlg(TQString(), mimetypes.join(" "), parent, "filedialog", true); + dlg.setOperationMode( KFileDialog::Opening ); + dlg.setCaption( tqApp->translate( "qChoosePixmap", "Choose Images..." ) ); + dlg.setMode( KFile::Files ); + KImageFilePreview *ip = new KImageFilePreview( &dlg ); + dlg.setPreviewWidget( ip ); + if (dlg.exec()) + return dlg.selectedFiles(); + return TQStringList(); +} + +TQPixmap qChoosePixmap( TQWidget *parent, FormWindow *fw, const TQPixmap &old, TQString *fn ) +{ +#if defined(DESIGNER) + if ( !fw || fw->savePixmapInline() ) { +/* if ( !imageIconProvider && !TQFileDialog::iconProvider() ) + TQFileDialog::setIconProvider( ( imageIconProvider = new ImageIconProvider ) ); + + TQString filter; + TQString all; + buildImageFormatList( filter, all ); + + TQFileDialog fd( TQString(), filter, parent, 0, TRUE ); + fd.setContentsPreviewEnabled( TRUE ); + PixmapView *pw = new PixmapView( &fd ); + fd.setContentsPreview( pw, pw ); + fd.setViewMode( TQFileDialog::List ); + fd.setPreviewMode( TQFileDialog::Contents ); + fd.setCaption( tqApp->translate( "qChoosePixmap", "Choose Pixmap" ) ); + if ( fd.exec() == TQDialog::Accepted ) { + TQPixmap pix( fd.selectedFile() ); + if ( fn ) + *fn = fd.selectedFile(); + MetaDataBase::setPixmapArgument( fw, pix.serialNumber(), fd.selectedFile() ); + return pix; + }*/ + TQStringList mimetypes = KImageIO::mimeTypes( KImageIO::Reading ); + KFileDialog dlg(TQString(), mimetypes.join(" "), parent, "filedialog", true); + dlg.setOperationMode( KFileDialog::Opening ); + dlg.setCaption( tqApp->translate( "qChoosePixmap", "Choose Pixmap" ) ); + dlg.setMode( KFile::File ); + KImageFilePreview *ip = new KImageFilePreview( &dlg ); + dlg.setPreviewWidget( ip ); + if (dlg.exec()) + { + TQPixmap pix( dlg.selectedURL().path() ); + if ( fn ) + *fn = dlg.selectedURL().path(); + MetaDataBase::setPixmapArgument( TQT_TQOBJECT(fw), pix.serialNumber(), dlg.selectedURL().path() ); + return pix; + } + } else if ( fw && fw->savePixmapInProject() ) { + PixmapCollectionEditor dia( parent, 0, TRUE ); + dia.setProject( fw->project() ); + dia.setChooserMode( TRUE ); + dia.setCurrentItem( MetaDataBase::pixmapKey( TQT_TQOBJECT(fw), old.serialNumber() ) ); + if ( dia.exec() == TQDialog::Accepted ) { + TQPixmap pix( fw->project()->pixmapCollection()->pixmap( dia.viewPixmaps->currentItem()->text() ) ); + MetaDataBase::setPixmapKey( TQT_TQOBJECT(fw), pix.serialNumber(), dia.viewPixmaps->currentItem()->text() ); + return pix; + } + } else { + PixmapFunction dia( parent, 0, TRUE ); + TQObject::connect( dia.helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + dia.labelFunction->setText( fw->pixmapLoaderFunction() + "(" ); + dia.editArguments->setText( MetaDataBase::pixmapArgument( TQT_TQOBJECT(fw), old.serialNumber() ) ); + dia.editArguments->setFocus(); + if ( dia.exec() == TQDialog::Accepted ) { + TQPixmap pix; + // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that + pix.convertFromImage( BarIcon( "designer_image.png", KDevDesignerPartFactory::instance() ).convertToImage() ); + + MetaDataBase::setPixmapArgument( TQT_TQOBJECT(fw), pix.serialNumber(), dia.editArguments->text() ); + return pix; + } + } +#else + Q_UNUSED( parent ); + Q_UNUSED( fw ); + Q_UNUSED( old ); +#endif + return TQPixmap(); +} + +ImageIconProvider::ImageIconProvider( TQWidget *parent, const char *name ) + : TQFileIconProvider( TQT_TQOBJECT(parent), name ), imagepm( BarIcon( "designer_image.png", KDevDesignerPartFactory::instance() ) ) +{ + fmts = TQImage::inputFormats(); +} + +ImageIconProvider::~ImageIconProvider() +{ +} + +const TQPixmap * ImageIconProvider::pixmap( const TQFileInfo &fi ) +{ + TQString ext = fi.extension().upper(); + if ( fmts.contains( ext ) ) { + return &imagepm; + } else { + return TQFileIconProvider::pixmap( fi ); + } +} diff --git a/kdevdesigner/designer/pixmapchooser.h b/kdevdesigner/designer/pixmapchooser.h new file mode 100644 index 00000000..c6523488 --- /dev/null +++ b/kdevdesigner/designer/pixmapchooser.h @@ -0,0 +1,74 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PIXMAPCHOOSER_H +#define PIXMAPCHOOSER_H + +#include <tqfiledialog.h> +#include <tqscrollview.h> +#include <tqpixmap.h> +#include <tqurl.h> + +class FormWindow; + +class PixmapView : public TQScrollView, + public TQFilePreview +{ + Q_OBJECT + + +public: + PixmapView( TQWidget *parent ); + void setPixmap( const TQPixmap &pix ); + void drawContents( TQPainter *p, int, int, int, int ); + void previewUrl( const TQUrl &u ); + +private: + TQPixmap pixmap; + +}; + +class ImageIconProvider : public TQFileIconProvider +{ + Q_OBJECT + + +public: + ImageIconProvider( TQWidget *parent = 0, const char *name = 0 ); + ~ImageIconProvider(); + + const TQPixmap *pixmap( const TQFileInfo &fi ); + +private: + TQStrList fmts; + TQPixmap imagepm; + +}; + +TQPixmap qChoosePixmap( TQWidget *parent, FormWindow *fw = 0, const TQPixmap &old = TQPixmap(), TQString *fn = 0 ); +TQStringList qChoosePixmaps( TQWidget *parent ); + +#endif diff --git a/kdevdesigner/designer/pixmapcollection.cpp b/kdevdesigner/designer/pixmapcollection.cpp new file mode 100644 index 00000000..880423a3 --- /dev/null +++ b/kdevdesigner/designer/pixmapcollection.cpp @@ -0,0 +1,180 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "pixmapcollection.h" +#include "project.h" +#include "mainwindow.h" +#include <tqmime.h> +#include <tqdir.h> +#include <tqfileinfo.h> +#include <tqtextstream.h> +#include <tqimage.h> + +PixmapCollection::PixmapCollection( Project *pro ) + : project( pro ) +{ + iface = new DesignerPixmapCollectionImpl( this ); + mimeSourceFactory = new TQMimeSourceFactory(); +} + +PixmapCollection::~PixmapCollection() +{ + delete mimeSourceFactory; + delete iface; +} + +bool PixmapCollection::addPixmap( const Pixmap &pix, bool force ) +{ + Pixmap pixmap = pix; + savePixmap( pixmap ); + + if ( !force ) { + for ( TQValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) { + if ( (*it).name == pixmap.name ) + return FALSE; + } + } + + pixList.append( pixmap ); + mimeSourceFactory->setPixmap( pixmap.name, pixmap.pix ); + project->setModified( TRUE ); + return TRUE; +} + +void PixmapCollection::removePixmap( const TQString &name ) +{ + for ( TQValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) { + if ( (*it).name == name ) { + pixList.remove( it ); + break; + } + } + project->setModified( TRUE ); +} + +TQValueList<PixmapCollection::Pixmap> PixmapCollection::pixmaps() const +{ + return pixList; +} + +TQString PixmapCollection::unifyName( const TQString &n ) +{ + TQString name = n; + bool restart = FALSE; + int added = 1; + + for ( TQValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) { + if ( restart ) + it = pixList.begin(); + restart = FALSE; + if ( name == (*it).name ) { + name = n; + name += "_" + TQString::number( added ); + ++added; + restart = TRUE; + } + } + + return name; +} + +void PixmapCollection::setActive( bool b ) +{ + if ( b ) + TQMimeSourceFactory::defaultFactory()->addFactory( mimeSourceFactory ); + else + TQMimeSourceFactory::defaultFactory()->removeFactory( mimeSourceFactory ); +} + +TQPixmap PixmapCollection::pixmap( const TQString &name ) +{ + for ( TQValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) { + if ( (*it).name == name ) + return (*it).pix; + } + return TQPixmap(); +} + +void PixmapCollection::savePixmap( Pixmap &pix ) +{ + if ( pix.absname == imageDir() + "/" + pix.name ) + return; // no need to save, it is already there + TQString rel = project->makeRelative( pix.absname ); + if ( rel[0] == '/' || ( rel[1] == ':' && rel[2] == '/' ) ) { // only save if file is outside the project + mkdir(); + pix.name = unifyName( TQFileInfo( pix.absname ).baseName() ) + ".png"; + pix.absname = imageDir() + "/" + pix.name; + pix.pix.save( pix.absname, "PNG" ); + } else if ( rel.isEmpty() ) { + mkdir(); + pix.name = unifyName( pix.name ); + pix.absname = imageDir() + "/" + pix.name; + pix.pix.save( pix.absname, "PNG" ); + } +} + +TQString PixmapCollection::imageDir() const +{ + return TQFileInfo( project->fileName() ).dirPath( TRUE ) + "/images"; +} + +void PixmapCollection::mkdir() +{ + TQString f = project->fileName(); + TQDir d( TQFileInfo( f ).dirPath( TRUE ) ); + d.mkdir( "images" ); +} + +void PixmapCollection::load( const TQString& filename ) +{ + if ( filename.isEmpty() ) + return; + TQString absfile; + if ( filename[0] == '/' ) + absfile = filename; + else + absfile = TQFileInfo( project->fileName() ).dirPath( TRUE ) + "/" + filename; + + TQPixmap pm( absfile ); + if ( pm.isNull() ) + return; + + Pixmap pix; + pix.name = TQFileInfo( absfile ).fileName(); + pix.absname = absfile; + pix.pix = pm; + addPixmap( pix, TRUE ); +} + +DesignerPixmapCollection *PixmapCollection::iFace() +{ + return iface; +} + +bool PixmapCollection::isEmpty() const +{ + return pixList.isEmpty(); +} diff --git a/kdevdesigner/designer/pixmapcollection.h b/kdevdesigner/designer/pixmapcollection.h new file mode 100644 index 00000000..10d630fc --- /dev/null +++ b/kdevdesigner/designer/pixmapcollection.h @@ -0,0 +1,80 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PIXMAPCOLLECTION_H +#define PIXMAPCOLLECTION_H + +#include <tqstring.h> +#include <tqpixmap.h> +#include <tqvaluelist.h> +#include "designerappiface.h" + +class TQMimeSourceFactory; +class Project; + +class PixmapCollection +{ +public: + struct Pixmap + { + TQPixmap pix; + TQString name; + TQString absname; + TQ_DUMMY_COMPARISON_OPERATOR( Pixmap ) + }; + + PixmapCollection( Project *pro ); + ~PixmapCollection(); + + bool addPixmap( const Pixmap &pix, bool force = TRUE ); + void removePixmap( const TQString &name ); + TQPixmap pixmap( const TQString &name ); + + TQValueList<Pixmap> pixmaps() const; + bool isEmpty() const; + + void setActive( bool b ); + + void load( const TQString& filename ); + + DesignerPixmapCollection *iFace(); + +private: + TQString unifyName( const TQString &n ); + void savePixmap( Pixmap &pix ); + + TQString imageDir() const; + void mkdir(); + +private: + TQValueList<Pixmap> pixList; + TQMimeSourceFactory *mimeSourceFactory; + Project *project; + DesignerPixmapCollectionImpl *iface; + +}; + +#endif diff --git a/kdevdesigner/designer/pixmapcollectioneditor.ui b/kdevdesigner/designer/pixmapcollectioneditor.ui new file mode 100644 index 00000000..30f74183 --- /dev/null +++ b/kdevdesigner/designer/pixmapcollectioneditor.ui @@ -0,0 +1,218 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>PixmapCollectionEditor</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>PixmapCollectionEditor</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>455</width> + <height>260</height> + </rect> + </property> + <property name="caption"> + <string>Manage Image Collection</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQIconView"> + <property name="name"> + <cstring>viewPixmaps</cstring> + </property> + <property name="resizeMode"> + <enum>Adjust</enum> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Add...</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>&Delete</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonClose</cstring> + </property> + <property name="text"> + <string>C&lose</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>PixmapCollectionEditor</receiver> + <slot>addPixmap()</slot> + </connection> + <connection> + <sender>PushButton3</sender> + <signal>clicked()</signal> + <receiver>PixmapCollectionEditor</receiver> + <slot>removePixmap()</slot> + </connection> + <connection> + <sender>viewPixmaps</sender> + <signal>currentChanged(TQIconViewItem*)</signal> + <receiver>PixmapCollectionEditor</receiver> + <slot>currentChanged(TQIconViewItem*)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>PixmapCollectionEditor</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>PixmapCollectionEditor</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>buttonClose</sender> + <signal>clicked()</signal> + <receiver>PixmapCollectionEditor</receiver> + <slot>accept()</slot> + </connection> +</connections> +<tabstops> + <tabstop>PushButton2</tabstop> + <tabstop>PushButton3</tabstop> + <tabstop>viewPixmaps</tabstop> + <tabstop>buttonClose</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">pixmapcollection.h</include> + <include location="local" impldecl="in implementation">pixmapchooser.h</include> + <include location="local" impldecl="in implementation">project.h</include> + <include location="global" impldecl="in implementation">tqfileinfo.h</include> + <include location="global" impldecl="in implementation">tqimage.h</include> + <include location="global" impldecl="in declaration">tqpixmap.h</include> + <include location="local" impldecl="in implementation">pixmapcollectioneditor.ui.h</include> +</includes> +<forwards> + <forward>class Project;</forward> +</forwards> +<variables> + <variable>Project *project;</variable> + <variable>bool chooser;</variable> +</variables> +<Q_SLOTS> + <slot>init()</slot> + <slot>destroy()</slot> + <slot>addPixmap()</slot> + <slot>removePixmap()</slot> + <slot>updateView()</slot> + <slot>currentChanged(TQIconViewItem * i)</slot> + <slot>setChooserMode(bool c)</slot> + <slot>setCurrentItem(const TQString & name)</slot> + <slot>setProject(Project * pro)</slot> + <slot returnType="TQPixmap">scaledPixmap(const TQPixmap & p)</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/pixmapcollectioneditor.ui.h b/kdevdesigner/designer/pixmapcollectioneditor.ui.h new file mode 100644 index 00000000..82bd7929 --- /dev/null +++ b/kdevdesigner/designer/pixmapcollectioneditor.ui.h @@ -0,0 +1,150 @@ +#include <tdelocale.h> +/********************************************************************** +** Copyright (C) 2001-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +void PixmapCollectionEditor::init() +{ + project = 0; + setChooserMode( FALSE ); +} + +void PixmapCollectionEditor::destroy() +{ +} + +void PixmapCollectionEditor::addPixmap() +{ + if ( !project ) + return; + + TQString f; + TQStringList pixmaps = qChoosePixmaps( this ); + if ( pixmaps.isEmpty() ) + return; + + TQString lastName; + for ( TQStringList::ConstIterator it = pixmaps.begin(); it != pixmaps.end(); ++it ) { + TQPixmap pm( *it ); + if ( pm.isNull() ) + continue; + PixmapCollection::Pixmap pixmap; + pixmap.pix = pm; + TQFileInfo fi ( *it ); + pixmap.name = fi.fileName(); + pixmap.absname = fi.filePath(); + if ( !project->pixmapCollection()->addPixmap( pixmap, FALSE ) ) + continue; + lastName = pixmap.name; + } + + updateView(); + TQIconViewItem *item = viewPixmaps->findItem( lastName ); + if ( item ) { + viewPixmaps->setCurrentItem( item ); + viewPixmaps->ensureItemVisible( item ); + } + +} + +void PixmapCollectionEditor::removePixmap() +{ + if ( !project || !viewPixmaps->currentItem() ) + return; + project->pixmapCollection()->removePixmap( viewPixmaps->currentItem()->text() ); + updateView(); +} + +void PixmapCollectionEditor::updateView() +{ + if ( !project ) + return; + + viewPixmaps->clear(); + + TQValueList<PixmapCollection::Pixmap> pixmaps = project->pixmapCollection()->pixmaps(); + for ( TQValueList<PixmapCollection::Pixmap>::Iterator it = pixmaps.begin(); it != pixmaps.end(); ++it ) { + // #### might need to scale down the pixmap + TQIconViewItem *item = new TQIconViewItem( viewPixmaps, (*it).name, scaledPixmap( (*it).pix ) ); + //item->setRenameEnabled( TRUE ); // this will be a bit harder to implement + item->setDragEnabled( FALSE ); + item->setDropEnabled( FALSE ); + } + viewPixmaps->setCurrentItem( viewPixmaps->firstItem() ); + currentChanged( viewPixmaps->firstItem() ); +} + +void PixmapCollectionEditor::currentChanged( TQIconViewItem * i ) +{ + buttonOk->setEnabled( !!i ); +} + +void PixmapCollectionEditor::setChooserMode( bool c ) +{ + chooser = c; + if ( chooser ) { + buttonClose->hide(); + buttonOk->show(); + buttonCancel->show(); + buttonOk->setEnabled( FALSE ); + buttonOk->setDefault( TRUE ); + connect( viewPixmaps, TQT_SIGNAL( doubleClicked( TQIconViewItem * ) ), buttonOk, TQT_SIGNAL( clicked() ) ); + connect( viewPixmaps, TQT_SIGNAL( returnPressed( TQIconViewItem * ) ), buttonOk, TQT_SIGNAL( clicked() ) ); + setCaption( i18n( "Choose Image" ) ); + } else { + buttonClose->show(); + buttonOk->hide(); + buttonCancel->hide(); + buttonClose->setDefault( TRUE ); + } + updateView(); +} + +void PixmapCollectionEditor::setCurrentItem( const TQString & name ) +{ + TQIconViewItem *i = viewPixmaps->findItem( name ); + if ( i ) { + viewPixmaps->setCurrentItem( i ); + currentChanged( i ); + } +} + +void PixmapCollectionEditor::setProject( Project * pro ) +{ + project = pro; + updateView(); +} + +TQPixmap PixmapCollectionEditor::scaledPixmap( const TQPixmap & p ) +{ + TQPixmap pix( p ); + if ( pix.width() < 50 && pix.height() < 50 ) + return pix; + TQImage img; + img = pix; + img = img.smoothScale( 50, 50 ); + pix.convertFromImage( img ); + return pix; +} diff --git a/kdevdesigner/designer/pixmapfunction.ui b/kdevdesigner/designer/pixmapfunction.ui new file mode 100644 index 00000000..760abe56 --- /dev/null +++ b/kdevdesigner/designer/pixmapfunction.ui @@ -0,0 +1,976 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>PixmapFunction</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>PixmapFunction</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>305</width> + <height>120</height> + </rect> + </property> + <property name="caption"> + <string>Choose Pixmap</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel3</cstring> + </property> + <property name="text"> + <string>&Enter arguments for loading the pixmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editArguments</cstring> + </property> + </widget> + <widget class="TQFrame"> + <property name="name"> + <cstring>Frame9</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="lineWidth"> + <number>2</number> + </property> + <property name="layoutMargin" stdset="0"> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelFunction</cstring> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>233</red> + <green>233</green> + <blue>233</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="text"> + <string>QPixmap(</string> + </property> + </widget> + <widget class="KLineEdit"> + <property name="name"> + <cstring>editArguments</cstring> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>233</red> + <green>233</green> + <blue>233</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>170</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>170</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>170</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="frame"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLabel"> + <property name="name"> + <cstring>TextLabel5</cstring> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>233</red> + <green>233</green> + <blue>233</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>211</red> + <green>211</green> + <blue>211</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>105</red> + <green>105</green> + <blue>105</blue> + </color> + <color> + <red>140</red> + <green>140</green> + <blue>140</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="text"> + <string>)</string> + </property> + </widget> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>PixmapFunction</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>PixmapFunction</receiver> + <slot>reject()</slot> + </connection> +</connections> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>klineedit.h</includehint> +</includehints> +</UI> diff --git a/kdevdesigner/designer/popupmenueditor.cpp b/kdevdesigner/designer/popupmenueditor.cpp new file mode 100644 index 00000000..da6289dd --- /dev/null +++ b/kdevdesigner/designer/popupmenueditor.cpp @@ -0,0 +1,1469 @@ +/********************************************************************** +** Copyright (C) 2003 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqapplication.h> +#include <tqcstring.h> +#include <tqdatastream.h> +#include <tqdragobject.h> +#include <tqlineedit.h> +#include <tqobjectlist.h> +#include <tqpainter.h> +#include <tqpopupmenu.h> +#include <tqrect.h> +#include <tqsize.h> +#include <tqstyle.h> +#include <tqtimer.h> +#include "actiondnd.h" +#include "actioneditorimpl.h" +#include "command.h" +#include "formfile.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "metadatabase.h" +#include "pixmapchooser.h" +#include "popupmenueditor.h" +#include "menubareditor.h" + +#include <tdelocale.h> + +// Drag Object Declaration ------------------------------------------- + +class PopupMenuEditorItemPtrDrag : public TQStoredDrag +{ +public: + PopupMenuEditorItemPtrDrag( PopupMenuEditorItem * item, TQWidget * parent = 0, + const char * name = 0 ); + ~PopupMenuEditorItemPtrDrag() {}; + static bool canDecode( TQDragMoveEvent * e ); + static bool decode( TQDropEvent * e, PopupMenuEditorItem ** i ); +}; + +// Drag Object Implementation --------------------------------------- + +PopupMenuEditorItemPtrDrag::PopupMenuEditorItemPtrDrag( PopupMenuEditorItem * item, + TQWidget * parent, const char * name ) + : TQStoredDrag( "qt/popupmenueditoritemptr", parent, name ) +{ + TQByteArray data( sizeof( TQ_LONG ) ); + TQDataStream stream( data, IO_WriteOnly ); + stream << ( TQ_LONG ) item; + setEncodedData( data ); +} + +bool PopupMenuEditorItemPtrDrag::canDecode( TQDragMoveEvent * e ) +{ + return e->provides( "qt/popupmenueditoritemptr" ); +} + +bool PopupMenuEditorItemPtrDrag::decode( TQDropEvent * e, PopupMenuEditorItem ** i ) +{ + TQByteArray data = e->encodedData( "qt/popupmenueditoritemptr" ); + TQDataStream stream( data, IO_ReadOnly ); + + if ( !data.size() ) + return FALSE; + + TQ_LONG p = 0; + stream >> p; + *i = ( PopupMenuEditorItem *) p; + + return TRUE; +} + +// PopupMenuEditorItem Implementation ----------------------------------- + +PopupMenuEditorItem::PopupMenuEditorItem( PopupMenuEditor * menu, TQObject * parent, const char * name ) + : TQObject( parent, name ), + a( 0 ), + s( 0 ), + m( menu ), + separator( FALSE ), + removable( FALSE ) +{ + init(); + a = new TQAction( this ); + TQObject::connect( a, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( selfDestruct() ) ); +} + + +PopupMenuEditorItem::PopupMenuEditorItem( TQAction * action, PopupMenuEditor * menu, + TQObject * parent, const char * name ) + : TQObject( parent, name ), + a( action ), + s( 0 ), + m( menu ), + separator( FALSE ), + removable( TRUE ) +{ + init(); + if ( /*a->name() == "qt_separator_action" ||*/ ::tqqt_cast<QSeparatorAction*>(a) ) + separator = TRUE; + if ( a && !a->childrenListObject().isEmpty() ) + a->installEventFilter( this ); +} + +PopupMenuEditorItem::PopupMenuEditorItem( PopupMenuEditorItem * item, PopupMenuEditor * menu, + TQObject * parent, const char * name ) + : TQObject( parent, name ), + a( item->a ), + s( 0 ), + m( menu ), + separator( item->separator ), + removable( item->removable ) +{ + init(); + if ( ::tqqt_cast<TQActionGroup*>(a) ) + a->installEventFilter( this ); +} + +PopupMenuEditorItem::~PopupMenuEditorItem() +{ + +} + +void PopupMenuEditorItem::init() +{ + if ( a ) { + TQObject::connect( a, TQT_SIGNAL( destroyed() ), this, TQT_SLOT( selfDestruct() ) ); + if ( m && !isSeparator() ) { + s = new PopupMenuEditor( m->formWindow(), m ); + TQString n = "PopupMenuEditor"; + m->formWindow()->unify( TQT_TQOBJECT(s), n, TRUE ); + s->setName( n ); + MetaDataBase::addEntry( TQT_TQOBJECT(s) ); + } + } +} + +PopupMenuEditorItem::ItemType PopupMenuEditorItem::type() const +{ + if ( separator ) + return Separator; + else if ( a ) + return Action; + return Unknown; +} + +void PopupMenuEditorItem::setVisible( bool enable ) +{ + if ( a ) + a->setVisible( enable ); +} + +bool PopupMenuEditorItem::isVisible() const +{ + TQActionGroup *g = ::tqqt_cast<TQActionGroup*>(a); + if ( g ) + return ( g->isVisible() && g->usesDropDown() ); + else if ( a ) + return a->isVisible(); + return FALSE; +} + +void PopupMenuEditorItem::showMenu( int x, int y ) +{ + if ( ( !separator ) && s ) { + s->move( x, y ); + s->show(); + s->raise(); + } +} + +void PopupMenuEditorItem::hideMenu() +{ + if ( s ) { + s->hideSubMenu(); + s->hide(); + } +} + +void PopupMenuEditorItem::focusOnMenu() +{ + if ( s ) { + s->showSubMenu(); + s->setFocus(); + } +} + +int PopupMenuEditorItem::count() const +{ + if ( s ) { + return s->count(); + } else if ( ::tqqt_cast<TQActionGroup*>(a) ) { + const TQObjectList l = a->childrenListObject(); + if ( !l.isEmpty() ) + return l.count(); + } + return 0; +} + +bool PopupMenuEditorItem::eventFilter( TQObject * o, TQEvent * event ) +{ + if ( ! ::tqqt_cast<TQActionGroup*>( o ) ) + return FALSE; + if ( event->type() == TQEvent::ChildInserted ) { + TQChildEvent * ce = ( TQChildEvent * ) event; + TQObject * c = TQT_TQOBJECT(ce->child()); + TQAction * action = ::tqqt_cast<TQAction*>( c ); + if ( s->find( action ) != -1 ) // avoid duplicates + return FALSE; + TQActionGroup * actionGroup = ::tqqt_cast<TQActionGroup*>( c ); + if ( actionGroup ) + s->insert( actionGroup ); + else if ( action ) + s->insert( action ); + } + return FALSE; +} + +void PopupMenuEditorItem::selfDestruct() +{ + hideMenu(); + int i = m->find( s ); + if ( i != -1 && i < m->count() ) + m->remove( i ); // remove this item + a = 0; // the selfDestruct call was caused by the deletion of the action + delete this; +} + +// PopupMenuEditor Implementation ----------------------------------- + +PopupMenuEditorItem * PopupMenuEditor::draggedItem = 0; +int PopupMenuEditor::clipboardOperation = 0; +PopupMenuEditorItem * PopupMenuEditor::clipboardItem = 0; + +PopupMenuEditor::PopupMenuEditor( FormWindow * fw, TQWidget * parent, const char * name ) + : TQWidget( 0, name, WStyle_Customize | WStyle_NoBorder | WRepaintNoErase | WResizeNoErase ), + formWnd( fw ), + parentMenu( parent ), + iconWidth( 0 ), + textWidth( 0 ), + accelWidth( 0 ), + arrowWidth( 30 ), + borderSize( 2 ), + currentField( 1 ), + currentIndex( 0 ) +{ + init(); +} + +PopupMenuEditor::PopupMenuEditor( FormWindow * fw, PopupMenuEditor * menu, + TQWidget * parent, const char * name ) + : TQWidget( 0, name, WStyle_Customize | WStyle_NoBorder | WRepaintNoErase ), + formWnd( fw ), + parentMenu( parent ), + iconWidth( menu->iconWidth ), + textWidth( menu->textWidth ), + accelWidth( menu->accelWidth ), + arrowWidth( menu->arrowWidth ), + borderSize( menu->borderSize ), + currentField( menu->currentField ), + currentIndex( menu->currentIndex ) +{ + init(); + PopupMenuEditorItem * i; + for ( i = menu->itemList.first(); i; i = menu->itemList.next() ) { + PopupMenuEditorItem * n = new PopupMenuEditorItem( i, this ); + itemList.append( n ); + } +} + +PopupMenuEditor::~PopupMenuEditor() +{ + itemList.setAutoDelete( TRUE ); +} + +void PopupMenuEditor::init() +{ + reparent( ( TQMainWindow * ) formWnd->mainContainer(), pos() ); + + addItem.action()->setMenuText( i18n("new item") ); + addSeparator.action()->setMenuText( i18n("new separator") ); + + setAcceptDrops( TRUE ); + setFocusPolicy( TQ_StrongFocus ); + + lineEdit = new TQLineEdit( this ); + lineEdit->hide(); + lineEdit->setFrameStyle(TQFrame::Plain | TQFrame::NoFrame); + lineEdit->polish(); + lineEdit->setBackgroundOrigin(ParentOrigin); + lineEdit->setBackgroundMode(PaletteButton); + lineEdit->installEventFilter( this ); + + dropLine = new TQWidget( this, 0, TQt::WStyle_NoBorder | WStyle_StaysOnTop ); + dropLine->setBackgroundColor( TQt::red ); + dropLine->hide(); + + hide(); +} + +void PopupMenuEditor::insert( PopupMenuEditorItem * item, int index ) +{ + if ( !item ) + return; + if ( index == -1 ) { + itemList.append( item ); + if ( isVisible() ) + currentIndex = itemList.count() - 1; + } else { + itemList.insert( index, item ); + if ( isVisible() ) + currentIndex = index; + } + item->m = this; + item->s->parentMenu = this; + resizeToContents(); + if ( isVisible() && parentMenu ) + parentMenu->update(); // draw arrow in parent menu + emit inserted( item->action() ); +} + +void PopupMenuEditor::insert( TQAction * action, int index ) +{ + if ( !action ) + return; + insert( new PopupMenuEditorItem( action, this, 0, action->name() ), index ); +} + +void PopupMenuEditor::insert( TQActionGroup * actionGroup, int index ) +{ + if ( !actionGroup ) + return; + bool dropdown = actionGroup->usesDropDown(); + PopupMenuEditorItem *i = new PopupMenuEditorItem( (TQAction *)actionGroup, this, 0, + TQString( actionGroup->name() ) + "Menu" ); + TQActionGroup *g = 0; + TQObjectList *l = actionGroup->queryList( TQACTION_OBJECT_NAME_STRING, 0, FALSE, FALSE ); + TQObjectListIterator it( *l ); + insert( i, index ); + for ( ; it.current(); ++it ) { + g = ::tqqt_cast<TQActionGroup*>(it.current()); + if ( g ) { + if ( dropdown ) + i->s->insert( g ); + else + insert( g ); + } else { + i->s->insert( (TQAction*)it.current() ); + } + } + delete l; +} + +int PopupMenuEditor::find( const TQAction * action ) +{ + PopupMenuEditorItem * i = itemList.first(); + while ( i ) { + if ( i->action() == action ) + return itemList.at(); + i = itemList.next(); + } + return -1; +} + +int PopupMenuEditor::find( PopupMenuEditor * menu ) +{ + PopupMenuEditorItem * i = itemList.first(); + while ( i ) { + if ( i->subMenu() == menu ) + return itemList.at(); + i = itemList.next(); + } + return -1; +} + +int PopupMenuEditor::count() +{ + return itemList.count(); +} + +PopupMenuEditorItem * PopupMenuEditor::at( int index ) +{ + return itemList.at( index ); +} + +void PopupMenuEditor::exchange( int a, int b ) +{ + PopupMenuEditorItem * ia = itemList.at( a ); + PopupMenuEditorItem * ib = itemList.at( b ); + if ( !ia || !ib || + ia == &addItem || ia == &addSeparator || + ib == &addItem || ib == &addSeparator ) + return; // do nothing + itemList.replace( b, ia ); + itemList.replace( a, ib ); +} + +void PopupMenuEditor::cut( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + + if ( clipboardItem && clipboardOperation == Cut ) + delete clipboardItem; + + clipboardOperation = Cut; + clipboardItem = itemList.at( idx ); + + if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) { + clipboardOperation = None; + clipboardItem = 0; + return; // do nothing + } + + RemoveActionFromPopupCommand * cmd = + new RemoveActionFromPopupCommand( i18n( "Cut Item" ), formWnd, this, idx ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); +} + +void PopupMenuEditor::copy( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + + if ( clipboardItem && clipboardOperation == Cut ) + delete clipboardItem; + + clipboardOperation = Copy; + clipboardItem = itemList.at( idx ); + + if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) { + clipboardOperation = None; + clipboardItem = 0; + } +} + +void PopupMenuEditor::paste( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + + if ( clipboardItem && clipboardOperation ) { + PopupMenuEditorItem * n = new PopupMenuEditorItem( clipboardItem, this ); + AddActionToPopupCommand * cmd = + new AddActionToPopupCommand( i18n( "Paste Item" ), formWnd, this, n, idx ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } +} + +void PopupMenuEditor::insertedActions( TQPtrList<TQAction> & list ) +{ + TQAction * a = 0; + PopupMenuEditorItem * i = itemList.first(); + + while ( i ) { + a = i->action(); + if ( a ) + list.append( a ); + i = itemList.next(); + } +} + +void PopupMenuEditor::show() +{ + resizeToContents(); + TQWidget::show(); +} + +void PopupMenuEditor::choosePixmap( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + + PopupMenuEditorItem * i = 0; + TQAction * a = 0; + + if ( idx < (int)itemList.count() ) { + i = itemList.at( idx ); + a = i->action(); + } else { + createItem(); + } + + hide(); // qChoosePixmap hides the menu + TQIconSet icons( qChoosePixmap( 0, formWnd, 0, 0 ) ); + SetActionIconsCommand * cmd = + new SetActionIconsCommand( i18n( "Set Icon" ), formWnd, a, this, icons ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + show(); + setFocus(); +} + +void PopupMenuEditor::showLineEdit( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + + PopupMenuEditorItem * i = 0; + + if ( idx >= (int)itemList.count() ) + i = &addItem; + else + i = itemList.at( idx ); + + // open edit currentField for item name + lineEdit->setText( i->action()->menuText() ); + lineEdit->selectAll(); + lineEdit->setGeometry( borderSize + iconWidth, borderSize + itemPos( i ), + textWidth, itemHeight( i ) ); + lineEdit->show(); + lineEdit->setFocus(); +} + +void PopupMenuEditor::setAccelerator( int key, TQt::ButtonState state, int index ) +{ + // FIXME: make this a command + + int idx = ( index == -1 ? currentIndex : index ); + + if ( key == TQt::Key_Shift || + key == TQt::Key_Control || + key == TQt::Key_Alt || + key == TQt::Key_Meta || + key == TQt::Key_unknown ) + return; // ignore these keys when they are pressed + + PopupMenuEditorItem * i = 0; + + if ( idx >= (int)itemList.count() ) + i = createItem(); + else + i = itemList.at( idx ); + + int shift = ( state & TQt::ShiftButton ? TQt::SHIFT : 0 ); + int ctrl = ( state & TQt::ControlButton ? TQt::CTRL : 0 ); + int alt = ( state & TQt::AltButton ? TQt::ALT : 0 ); + int meta = ( state & TQt::MetaButton ? TQt::META : 0 ); + + TQAction * a = i->action(); + TQKeySequence ks = a->accel(); + int keys[4] = { ks[0], ks[1], ks[2], ks[3] }; + int n = 0; + while ( n < 4 && ks[n++] ); + n--; + if ( n < 4 ) + keys[n] = key | shift | ctrl | alt | meta; + a->setAccel( TQKeySequence( keys[0], keys[1], keys[2], keys[3] ) ); + MetaDataBase::setPropertyChanged( a, "accel", TRUE ); + resizeToContents(); +} + +void PopupMenuEditor::resizeToContents() +{ + TQSize s = contentsSize(); + dropLine->resize( s.width(), 2 ); + s.rwidth() += borderSize * 2; + s.rheight() += borderSize * 2; + resize( s ); +} + +void PopupMenuEditor::showSubMenu() +{ + if ( currentIndex < (int)itemList.count() ) { + itemList.at( currentIndex )->showMenu( pos().x() + width() - borderSize * 3, + pos().y() + itemPos( at( currentIndex ) ) + + borderSize * 2 ); + setFocus(); // Keep focus in this widget + } +} + +void PopupMenuEditor::hideSubMenu() +{ + if ( currentIndex < (int)itemList.count() ) + itemList.at( currentIndex )->hideMenu(); +} + +void PopupMenuEditor::focusOnSubMenu() +{ + if ( currentIndex < (int)itemList.count() ) + itemList.at( currentIndex )->focusOnMenu(); +} + +// This function has no undo. It is only here to remove an item when its action was +// removed from the action editor. +// Use removeItem to put the command on the command stack. +void PopupMenuEditor::remove( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + PopupMenuEditorItem * i = itemList.at( idx ); + if ( i && i->isRemovable() ) { + itemList.remove( idx ); + int n = itemList.count() + 1; + if ( currentIndex >= n ) + currentIndex = itemList.count() + 1; + emit removed( i->action() ); + resizeToContents(); + } +} + +PopupMenuEditorItem * PopupMenuEditor::createItem( TQAction * a ) +{ + ActionEditor * ae = (ActionEditor *) formWindow()->mainWindow()->child( 0, "ActionEditor" ); + if ( !a ) + a = ae->newActionEx(); + PopupMenuEditorItem * i = new PopupMenuEditorItem( a, this ); + TQString n = TQString( a->name() ) + "Item"; + formWindow()->unify( i, n, FALSE ); + i->setName( n ); + AddActionToPopupCommand * cmd = + new AddActionToPopupCommand( i18n( "Add Item" ), formWnd, this, i ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + return i; +} + +void PopupMenuEditor::removeItem( int index ) +{ + int idx = ( index == -1 ? currentIndex : index ); + if ( idx < (int)itemList.count() ) { + RemoveActionFromPopupCommand * cmd = new RemoveActionFromPopupCommand( i18n( "Remove Item" ), + formWnd, + this, + idx ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + if ( itemList.count() == 0 && parentMenu ) + parentMenu->update(); + resizeToContents(); + } +} + +PopupMenuEditorItem * PopupMenuEditor::currentItem() +{ + int count = itemList.count(); + if ( currentIndex < count ) + return itemList.at( currentIndex ); + else if ( currentIndex == count ) + return &addItem; + return &addSeparator; +} + +PopupMenuEditorItem * PopupMenuEditor::itemAt( int y ) +{ + PopupMenuEditorItem * i = itemList.first(); + int iy = 0; + + while ( i ) { + iy += itemHeight( i ); + if ( iy > y ) + return i; + i = itemList.next(); + } + iy += itemHeight( &addItem ); + if ( iy > y ) + return &addItem; + return &addSeparator; +} + +void PopupMenuEditor::setFocusAt( const TQPoint & pos ) +{ + hideSubMenu(); + lineEdit->hide(); + + currentIndex = 0; + int iy = 0; + PopupMenuEditorItem * i = itemList.first(); + + while ( i ) { + iy += itemHeight( i ); + if ( iy > pos.y() ) + break; + i = itemList.next(); + currentIndex++; + } + + iy += itemHeight( &addItem ); + if ( iy <= pos.y() ) + currentIndex++; + + if ( currentIndex < (int)itemList.count() ) { + if ( pos.x() < iconWidth ) + currentField = 0; + else if ( pos.x() < iconWidth + textWidth ) + currentField = 1; + else + currentField = 2; + } else { + currentField = 1; + } + + showSubMenu(); +} + +bool PopupMenuEditor::eventFilter( TQObject * o, TQEvent * e ) +{ + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(lineEdit) && e->type() == TQEvent::FocusOut ) { + leaveEditMode( 0 ); + update(); + } + return TQWidget::eventFilter( o, e ); +} + +void PopupMenuEditor::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + p.save(); + TQRegion reg( rect() ); + TQRegion mid( borderSize, borderSize, + rect().width() - borderSize * 2, rect().height() - borderSize * 2 ); + reg -= mid; + p.setClipRegion( reg ); + style().tqdrawPrimitive( TQStyle::PE_PanelPopup, &p, rect(), colorGroup() ); + p.restore(); + drawItems( &p ); +} + +void PopupMenuEditor::mousePressEvent( TQMouseEvent * e ) +{ + mousePressPos = e->pos(); + setFocusAt( mousePressPos ); + e->accept(); + update(); +} + +void PopupMenuEditor::mouseDoubleClickEvent( TQMouseEvent * ) +{ + setFocusAt( mousePressPos ); + if ( currentItem() == &addSeparator ) { + PopupMenuEditorItem * i = createItem( new QSeparatorAction( 0 ) ); + i->setSeparator( TRUE ); + return; + } + if ( currentField == 0 ) { + choosePixmap(); + resizeToContents(); + } else if ( currentField == 1 ) { + showLineEdit(); + } +} + +void PopupMenuEditor::mouseMoveEvent( TQMouseEvent * e ) +{ + if ( e->state() & Qt::LeftButton ) { + if ( ( e->pos() - mousePressPos ).manhattanLength() > 3 ) { + draggedItem = itemAt( mousePressPos.y() ); + if ( draggedItem == &addItem ) { + draggedItem = createItem(); + RenameActionCommand cmd( i18n( "Rename Item" ), formWnd, draggedItem->action(), + this, "Unnamed" ); + cmd.execute(); + // FIXME: start rename after drop + } else if ( draggedItem == &addSeparator ) { + draggedItem = createItem( new QSeparatorAction( 0 ) ); + draggedItem->setSeparator( TRUE ); + } + + PopupMenuEditorItemPtrDrag * d = + new PopupMenuEditorItemPtrDrag( draggedItem, this ); + + hideSubMenu(); + + draggedItem->setVisible( FALSE ); + resizeToContents(); + + // If the item is dropped in the same list, + // we will have two instances of the same pointer + // in the list. We use node instead. + int idx = itemList.find( draggedItem ); + TQLNode * node = itemList.currentNode(); + + d->dragCopy(); // dragevents and stuff happens + + if ( draggedItem ) { // item was not dropped + draggedItem->setVisible( TRUE ); + draggedItem = 0; + if ( hasFocus() ) { + hideSubMenu(); + resizeToContents(); + showSubMenu(); + } + } else { // item was dropped + itemList.takeNode( node )->setVisible( TRUE ); + if ( currentIndex > 0 && currentIndex > idx ) + --currentIndex; + // the drop might happen in another menu, so we'll resize + // and show the submenu there + } + } + } +} + +void PopupMenuEditor::dragEnterEvent( TQDragEnterEvent * e ) +{ + if ( e->provides( "qt/popupmenueditoritemptr" ) || + e->provides( "application/x-designer-actions" ) || + e->provides( "application/x-designer-actiongroup" ) ) { + e->accept(); + dropLine->show(); + } +} + +void PopupMenuEditor::dragLeaveEvent( TQDragLeaveEvent * ) +{ + dropLine->hide(); +} + +void PopupMenuEditor::dragMoveEvent( TQDragMoveEvent * e ) +{ + TQPoint pos = e->pos(); + dropLine->move( borderSize, snapToItem( pos.y() ) ); + + if ( currentItem() != itemAt( pos.y() ) ) { + hideSubMenu(); + setFocusAt( pos ); + showSubMenu(); + } +} + +void PopupMenuEditor::dropEvent( TQDropEvent * e ) +{ + if ( !( e->provides( "qt/popupmenueditoritemptr" ) || + e->provides( "application/x-designer-actions" ) || + e->provides( "application/x-designer-actiongroup" ) ) ) + return; + + // Hide the sub menu of the current item, but do it later + if ( currentIndex < (int)itemList.count() ) { + PopupMenuEditor *s = itemList.at( currentIndex )->s; + TQTimer::singleShot( 0, s, TQT_SLOT( hide() ) ); + } + + draggedItem = 0; + PopupMenuEditorItem * i = 0; + + if ( e->provides( "qt/popupmenueditoritemptr" ) ) { + PopupMenuEditorItemPtrDrag::decode( e, &i ); + } else { + if ( e->provides( "application/x-designer-actiongroup" ) ) { + TQActionGroup * g = ::tqqt_cast<QDesignerActionGroup*>(ActionDrag::action()); + if ( g->usesDropDown() ) { + i = new PopupMenuEditorItem( g, this ); + TQString n = TQString( g->name() ) + "Item"; + formWindow()->unify( i, n, FALSE ); + i->setName( n ); + TQObjectList *l = g->queryList( TQACTION_OBJECT_NAME_STRING, 0, FALSE, FALSE ); + TQObjectListIterator it( *l ); + for ( ; it.current(); ++it ) { + g = ::tqqt_cast<TQActionGroup*>(it.current()); + if ( g ) + i->s->insert( g ); + else + i->s->insert( (TQAction*)it.current() ); + } + delete l; + } else { + dropInPlace( g, e->pos().y() ); + } + } else if ( e->provides( "application/x-designer-actions" ) ) { + TQAction *a = ::tqqt_cast<QDesignerAction*>(ActionDrag::action()); + i = new PopupMenuEditorItem( a, this ); + } + } + + if ( i ) { + dropInPlace( i, e->pos().y() ); + TQTimer::singleShot( 0, this, TQT_SLOT( resizeToContents() ) ); + } + + TQTimer::singleShot( 0, this, TQT_SLOT( showSubMenu() ) ); + TQTimer::singleShot( 0, this, TQT_SLOT( setFocus() ) ); + dropLine->hide(); + e->accept(); +} + +void PopupMenuEditor::keyPressEvent( TQKeyEvent * e ) +{ + if ( lineEdit->isHidden() ) { // In navigation mode + + switch ( e->key() ) { + + case TQt::Key_Delete: + hideSubMenu(); + removeItem(); + showSubMenu(); + break; + + case TQt::Key_Backspace: + clearCurrentField(); + break; + + case TQt::Key_Up: + navigateUp( e->state() & TQt::ControlButton ); + break; + + case TQt::Key_Down: + navigateDown( e->state() & TQt::ControlButton ); + break; + + case TQt::Key_Left: + navigateLeft(); + break; + + case TQt::Key_Right: + navigateRight(); + break; + + case TQt::Key_PageUp: + currentIndex = 0; + break; + + case TQt::Key_PageDown: + currentIndex = itemList.count(); + break; + + case TQt::Key_Enter: + case TQt::Key_Return: + case TQt::Key_F2: + enterEditMode( e ); + // move on + case TQt::Key_Alt: + case TQt::Key_Shift: + case TQt::Key_Control: + // do nothing + return; + + case TQt::Key_Escape: + currentField = 0; + navigateLeft(); + break; + + case TQt::Key_C: + if ( e->state() & TQt::ControlButton && + currentIndex < (int)itemList.count() ) { + copy( currentIndex ); + break; + } + + case TQt::Key_X: + if ( e->state() & TQt::ControlButton && + currentIndex < (int)itemList.count() ) { + hideSubMenu(); + cut( currentIndex ); + showSubMenu(); + break; + } + + case TQt::Key_V: + if ( e->state() & TQt::ControlButton ) { + hideSubMenu(); + paste( currentIndex < (int)itemList.count() ? currentIndex + 1: itemList.count() ); + showSubMenu(); + break; + } + + default: + if ( currentItem()->isSeparator() ) + return; + if ( currentField == 1 ) { + showLineEdit(); + TQApplication::sendEvent( lineEdit, e ); + e->accept(); + return; + } else if ( currentField == 2 ) { + setAccelerator( e->key(), e->state() ); + showSubMenu(); + } + break; + + } + + } else { // In edit mode + switch ( e->key() ) { + case TQt::Key_Enter: + case TQt::Key_Return: + case TQt::Key_Escape: + leaveEditMode( e ); + e->accept(); + return; + } + } + update(); +} + +void PopupMenuEditor::focusInEvent( TQFocusEvent * ) +{ + showSubMenu(); + update(); + parentMenu->update(); +} + +void PopupMenuEditor::focusOutEvent( TQFocusEvent * ) +{ + TQWidget * fw = tqApp->focusWidget(); + if ( !fw || ( !::tqqt_cast<PopupMenuEditor*>(fw) && fw != lineEdit ) ) { + hideSubMenu(); + if ( fw && ::tqqt_cast<MenuBarEditor*>(fw) ) + return; + TQWidget * w = this; + while ( w && w != fw && ::tqqt_cast<PopupMenuEditor*>(w) ) { // hide all popups + w->hide(); + w = ((PopupMenuEditor *)w)->parentEditor(); + } + } +} + +void PopupMenuEditor::drawItem( TQPainter * p, PopupMenuEditorItem * i, + const TQRect & r, int f ) const +{ + int x = r.x(); + int y = r.y(); + int h = r.height(); + + p->fillRect( r, colorGroup().brush( TQColorGroup::Background ) ); + + if ( i->isSeparator() ) { + style().tqdrawPrimitive( TQStyle::PE_Separator, p, + TQRect( r.x(), r.y() + 2, r.width(), 1 ), + colorGroup(), TQStyle::Style_Sunken | f ); + return; + } + + const TQAction * a = i->action(); + if ( a->isToggleAction() && a->isOn() ) { + style().tqdrawPrimitive( TQStyle::PE_CheckMark, p, + TQRect( x , y, iconWidth, h ), + colorGroup(), f ); + } else { + TQPixmap icon = a->iconSet().pixmap( TQIconSet::Automatic, TQIconSet::Normal ); + p->drawPixmap( x + ( iconWidth - icon.width() ) / 2, + y + ( h - icon.height() ) / 2, + icon ); + } + x += iconWidth; + p->drawText( x, y, textWidth, h, + TQPainter::AlignLeft | + TQPainter::AlignVCenter | + TQt::ShowPrefix | + TQt::SingleLine, + a->menuText() ); + + x += textWidth + borderSize * 3; + p->drawText( x, y, accelWidth, h, + TQPainter::AlignLeft | TQPainter::AlignVCenter, + a->accel() ); + if ( i->count() ) // Item has submenu + style().tqdrawPrimitive( TQStyle::PE_ArrowRight, p, + TQRect( r.width() - arrowWidth, r.y(), arrowWidth, r.height() ), + colorGroup(), f ); +} + +void PopupMenuEditor::drawWinFocusRect( TQPainter * p, const TQRect & r ) const +{ + if ( currentIndex < (int)itemList.count() && + ((PopupMenuEditor*)this)->itemList.at( currentIndex )->isSeparator() ) { + p->drawWinFocusRect( borderSize, r.y(), width() - borderSize * 2, r.height() ); + return; + } + int y = r.y(); + int h = r.height(); + if ( currentField == 0 ) + p->drawWinFocusRect( borderSize + 1, y, iconWidth - 2, h ); + else if ( currentField == 1 ) + p->drawWinFocusRect( borderSize + iconWidth, y, textWidth, h ); + else if ( currentField == 2 ) + p->drawWinFocusRect( borderSize + iconWidth + textWidth + + borderSize * 3, y, accelWidth, h ); +} + +void PopupMenuEditor::drawItems( TQPainter * p ) +{ + int flags = 0; + int idx = 0; + + TQColorGroup enabled = colorGroup(); + TQColorGroup disabled = palette().disabled(); + TQRect focus; + TQRect rect( borderSize, borderSize, width() - borderSize * 2, 0 ); + + PopupMenuEditorItem * i = itemList.first(); + while ( i ) { + if ( i->isVisible() ) { + rect.setHeight( itemHeight( i ) ); + if ( idx == currentIndex ) + focus = rect; + if ( i->action()->isEnabled() ) { + flags = TQStyle::Style_Enabled; + p->setPen( enabled.buttonText() ); + } else { + flags = TQStyle::Style_Default; + p->setPen( disabled.buttonText() ); + } + drawItem( p, i, rect, flags ); + rect.moveBy( 0, rect.height() ); + } + i = itemList.next(); + idx++; + } + + // Draw the "add item" and "add separator" items + p->setPen( darkBlue ); + rect.setHeight( itemHeight( &addItem ) ); + if ( idx == currentIndex ) + focus = rect; + drawItem( p, &addItem, rect, TQStyle::Style_Default ); + rect.moveBy( 0, rect.height() ); + idx++; + rect.setHeight( itemHeight( &addSeparator ) ); + if ( idx == currentIndex ) + focus = rect; + drawItem( p, &addSeparator, rect, TQStyle::Style_Default ); + idx++; + + if ( hasFocus() && !draggedItem ) + drawWinFocusRect( p, focus ); +} + +TQSize PopupMenuEditor::contentsSize() +{ + TQRect textRect = fontMetrics().boundingRect( addSeparator.action()->menuText() ); + textWidth = textRect.width(); + accelWidth = textRect.height(); // default size + iconWidth = textRect.height(); + + int w = 0; + int h = itemHeight( &addItem ) + itemHeight( &addSeparator ); + PopupMenuEditorItem * i = itemList.first(); + TQAction * a = 0; + while ( i ) { + if ( i->isVisible() ) { + if ( !i->isSeparator() ) { + a = i->action(); + w = a->iconSet().pixmap( TQIconSet::Automatic, TQIconSet::Normal ).rect().width() + + borderSize; // padding + iconWidth = TQMAX( iconWidth, w ); + w = fontMetrics().boundingRect( a->menuText() ).width(); + textWidth = TQMAX( textWidth, w ); + w = fontMetrics().boundingRect( a->accel() ).width() + 2; // added padding? + accelWidth = TQMAX( accelWidth, w ); + } + h += itemHeight( i ); + } + i = itemList.next(); + } + + int width = iconWidth + textWidth + borderSize * 3 + accelWidth + arrowWidth; + return TQSize( width, h ); +} + +int PopupMenuEditor::itemHeight( const PopupMenuEditorItem * item ) const +{ + if ( !item || ( item && !item->isVisible() ) ) + return 0; + if ( item->isSeparator() ) + return 4; // FIXME: hardcoded ( get from styles )r + int padding = + borderSize * 6; + TQAction * a = item->action(); + int h = a->iconSet().pixmap( TQIconSet::Automatic, TQIconSet::Normal ).rect().height(); + h = TQMAX( h, fontMetrics().boundingRect( a->menuText() ).height() + padding ); + h = TQMAX( h, fontMetrics().boundingRect( a->accel() ).height() + padding ); + return h; +} + +int PopupMenuEditor::itemPos( const PopupMenuEditorItem * item ) const +{ + PopupMenuEditor * that = ( PopupMenuEditor * ) this; + int y = 0; + PopupMenuEditorItem * i = that->itemList.first(); + while ( i ) { + if ( i == item ) + return y; + y += itemHeight( i ); + i = that->itemList.next(); + } + return y; +} + +int PopupMenuEditor::snapToItem( int y ) +{ + int iy = 0; + int dy = 0; + + PopupMenuEditorItem * i = itemList.first(); + + while ( i ) { + dy = itemHeight( i ); + if ( iy + dy / 2 > y ) + return iy; + iy += dy; + i = itemList.next(); + } + + return iy; +} + +void PopupMenuEditor::dropInPlace( PopupMenuEditorItem * i, int y ) +{ + int iy = 0; + int dy = 0; + int idx = 0; + + PopupMenuEditorItem * n = itemList.first(); + + while ( n ) { + dy = itemHeight( n ); + if ( iy + dy / 2 > y ) + break; + iy += dy; + idx++; + n = itemList.next(); + } + int same = itemList.findRef( i ); + AddActionToPopupCommand * cmd = new AddActionToPopupCommand( i18n( "Drop Item" ), formWnd, this, i, idx ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + currentIndex = ( same >= 0 && same < idx ) ? idx - 1 : idx; + currentField = 1; +} + +void PopupMenuEditor::dropInPlace( TQActionGroup * g, int y ) +{ + TQObjectList l = g->childrenListObject(); + if (l.isEmpty()) + return; + for ( int i = 0; i < (int)l.count(); ++i ) { + TQAction *a = ::tqqt_cast<TQAction*>(l.at(i)); + TQActionGroup *g = ::tqqt_cast<TQActionGroup*>(l.at(i)); + if ( g ) + dropInPlace( g, y ); + else if ( a ) + dropInPlace( new PopupMenuEditorItem( a, this ), y ); + } +} + +void PopupMenuEditor::safeDec() +{ + do { + currentIndex--; + } while ( currentIndex > 0 && !currentItem()->isVisible() ); + if ( currentIndex == 0 && + !currentItem()->isVisible() && + parentMenu ) { + parentMenu->setFocus(); + } +} + +void PopupMenuEditor::safeInc() +{ + int max = itemList.count() + 1; + if ( currentIndex < max ) { + do { + currentIndex++; + } while ( currentIndex < max && !currentItem()->isVisible() ); // skip invisible items + } +} + +void PopupMenuEditor::clearCurrentField() +{ + if ( currentIndex >= (int)itemList.count() ) + return; // currentIndex is addItem or addSeparator + PopupMenuEditorItem * i = currentItem(); + hideSubMenu(); + if ( i->isSeparator() ) + return; + if ( currentField == 0 ) { + TQIconSet icons( 0 ); + SetActionIconsCommand * cmd = new SetActionIconsCommand( i18n( "Remove Icon" ), + formWnd, + i->action(), + this, + icons ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } else if ( currentField == 2 ) { + i->action()->setAccel( 0 ); + } + resizeToContents(); + showSubMenu(); + return; +} + +void PopupMenuEditor::navigateUp( bool ctrl ) +{ + if ( currentIndex > 0 ) { + hideSubMenu(); + if ( ctrl ) { + ExchangeActionInPopupCommand * cmd = + new ExchangeActionInPopupCommand( i18n( "Move Item Up" ), + formWnd, + this, + currentIndex, + currentIndex - 1 ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + safeDec(); + } else { + safeDec(); + } + showSubMenu(); + } else if ( parentMenu ) { + parentMenu->setFocus(); + parentMenu->update(); + } +} + +void PopupMenuEditor::navigateDown( bool ctrl ) +{ + hideSubMenu(); + if ( ctrl ) { + if ( currentIndex < ( (int)itemList.count() - 1 ) ) { // safe index + ExchangeActionInPopupCommand * cmd = + new ExchangeActionInPopupCommand( i18n( "Move Item Down" ), + formWnd, + this, + currentIndex, + currentIndex + 1 ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + safeInc(); + } + } else { // ! Ctrl + safeInc(); + } + if ( currentIndex >= (int)itemList.count() ) + currentField = 1; + showSubMenu(); +} + +void PopupMenuEditor::navigateLeft() +{ + if ( currentItem()->isSeparator() || + currentIndex >= (int)itemList.count() || + currentField == 0 ) { + if ( parentMenu ) { + hideSubMenu(); + parentMenu->setFocus(); + } else if ( !currentItem()->isSeparator() ) { + currentField = 2; + } + } else { + currentField--; + } +} + +void PopupMenuEditor::navigateRight() +{ + if ( !currentItem()->isSeparator() && + currentIndex < (int)itemList.count() ) { + if ( currentField == 2 ) { + focusOnSubMenu(); + } else { + currentField++; + currentField %= 3; + } + } +} + +void PopupMenuEditor::enterEditMode( TQKeyEvent * e ) +{ + PopupMenuEditorItem * i = currentItem(); + + if ( i == &addSeparator ) { + i = createItem( new QSeparatorAction( 0 ) ); + } else if ( i->isSeparator() ) { + return; + } else if ( currentField == 0 ) { + choosePixmap(); + } else if ( currentField == 1 ) { + showLineEdit(); + return; + } else {// currentField == 2 + setAccelerator( e->key(), e->state() ); + } + showSubMenu(); + return; +} + +void PopupMenuEditor::leaveEditMode( TQKeyEvent * e ) +{ + setFocus(); + lineEdit->hide(); + + PopupMenuEditorItem * i = 0; + if ( e && e->key() == TQt::Key_Escape ) { + update(); + return; + } + + if ( currentIndex >= (int)itemList.count() ) { + // new item was created + TQAction * a = formWnd->mainWindow()->actioneditor()->newActionEx(); + TQString actionText = lineEdit->text(); + actionText.replace("&&", "&"); + TQString menuText = lineEdit->text(); + a->setText( actionText ); + a->setMenuText( menuText ); + i = createItem( a ); + TQString n = constructName( i ); + formWindow()->unify( a, n, TRUE ); + a->setName( n ); + MetaDataBase::addEntry( a ); + MetaDataBase::setPropertyChanged( a, "menuText", TRUE ); + ActionEditor *ae = (ActionEditor*)formWindow()->mainWindow()->child( 0, "ActionEditor" ); + if ( ae ) + ae->updateActionName( a ); + } else { + i = itemList.at( currentIndex ); + RenameActionCommand * cmd = new RenameActionCommand( i18n( "Rename Item" ), + formWnd, + i->action(), + this, + lineEdit->text() ); + formWnd->commandHistory()->addCommand( cmd ); + cmd->execute(); + } + resizeToContents(); + + if ( !i ) + return; + + if ( i->isSeparator() ) + hideSubMenu(); + else + showSubMenu(); +} + +TQString PopupMenuEditor::constructName( PopupMenuEditorItem *item ) +{ + TQString s; + TQString name = item->action()->menuText(); + TQWidget *e = parentEditor(); + PopupMenuEditor *p = ::tqqt_cast<PopupMenuEditor*>(e); + if ( p ) { + int idx = p->find( item->m ); + PopupMenuEditorItem * i = ( idx > -1 ? p->at( idx ) : 0 ); + s = ( i ? TQString( i->action()->name() ).remove( "Action" ) : TQString( "" ) ); + } else { + MenuBarEditor *b = ::tqqt_cast<MenuBarEditor*>(e); + if ( b ) { + int idx = b->findItem( item->m ); + MenuBarEditorItem * i = ( idx > -1 ? b->item( idx ) : 0 ); + s = ( i ? i->menuText().lower() : TQString( "" ) ); + } + } + // replace illegal characters + + return ( RenameMenuCommand::makeLegal( s ) + + RenameMenuCommand::makeLegal( name ) + "Action" ); +} diff --git a/kdevdesigner/designer/popupmenueditor.h b/kdevdesigner/designer/popupmenueditor.h new file mode 100644 index 00000000..714ecf42 --- /dev/null +++ b/kdevdesigner/designer/popupmenueditor.h @@ -0,0 +1,237 @@ +/********************************************************************** +** Copyright (C) 2003 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef POPUPMENUEDITOR_H +#define POPUPMENUEDITOR_H + +#include <tqwidget.h> +#include <tqptrlist.h> +#include <tqaction.h> + +class PopupMenuEditor; +class TQMenuItem; + +class PopupMenuEditorItem : public TQObject +{ + Q_OBJECT + + + friend class PopupMenuEditor; + + PopupMenuEditorItem( PopupMenuEditor * menu = 0, TQObject * parent = 0, const char * name = 0 ); + +public: + enum ItemType { + Unknown = -1, + Separator = 0, + Action = 1 + }; + + PopupMenuEditorItem( TQAction * action, PopupMenuEditor * menu, + TQObject * parent = 0, const char * name = 0 ); + PopupMenuEditorItem( PopupMenuEditorItem * item, PopupMenuEditor * menu, + TQObject * parent = 0, const char * name = 0 ); + ~PopupMenuEditorItem(); + + void init(); + + ItemType type() const; + TQAction * action() const { return a; } + + void setVisible( bool enable ); + bool isVisible() const; + + void setSeparator( bool enable ) { separator = enable; } + bool isSeparator() const { return separator; } + + void setRemovable( bool enable ) { removable = enable; } + bool isRemovable() const { return removable; } + + void showMenu( int x, int y ); + void hideMenu(); + void focusOnMenu(); + PopupMenuEditor * subMenu() const { return s; } + + int count() const; + + bool eventFilter( TQObject *, TQEvent * event ); + +public slots: + void selfDestruct(); + +protected: + +private: + TQAction * a; + PopupMenuEditor * s; + PopupMenuEditor * m; + uint separator : 1; + uint removable : 1; +}; + +class FormWindow; +class MainWindow; +class TQLineEdit; + +#include <tqpopupmenu.h> + +class PopupMenuEditor : public TQWidget +{ + Q_OBJECT + + + friend class PopupMenuEditorItem; + friend class MenuBarEditor; + friend class Resource; + +public: + PopupMenuEditor( FormWindow * fw, TQWidget * parent = 0, const char * name = 0 ); + PopupMenuEditor( FormWindow * fw, PopupMenuEditor * menu, TQWidget * parent, const char * name = 0 ); + ~PopupMenuEditor(); + + void init(); + + void insert( PopupMenuEditorItem * item, int index = -1 ); + void insert( TQAction * action, int index = -1 ); + void insert( TQActionGroup * actionGroup, int index = -1 ); + int find( const TQAction * action ); + int find( PopupMenuEditor * menu ); + int count(); + PopupMenuEditorItem * at( int index ); + PopupMenuEditorItem * at( TQPoint pos ) { return itemAt( pos.y() ); } + void exchange( int a, int b ); + + void cut( int index ); + void copy( int index ); + void paste( int index ); + + void insertedActions( TQPtrList<TQAction> & list ); + + void show(); + void choosePixmap( int index = -1 ); + void showLineEdit( int index = -1); + void setAccelerator( int key, TQt::ButtonState state, int index = -1 ); + + FormWindow * formWindow() { return formWnd; } + bool isCreatingAccelerator() { return ( currentField == 2 ); } + + TQPtrList<PopupMenuEditorItem> * items() { return &itemList; } + + TQWidget * parentEditor() { return parentMenu; } + +signals: + void inserted( TQAction * ); + void removed( TQAction * ); + +public slots: + + void cut() { cut( currentIndex ); } + void copy() { copy( currentIndex ); } + void paste() { paste( currentIndex ); } + + void remove( int index ); + void remove( TQAction * a ) { remove( find( a ) ); } + + void resizeToContents(); + void showSubMenu(); + void hideSubMenu(); + void focusOnSubMenu(); + +protected: + PopupMenuEditorItem * createItem( TQAction * a = 0 ); + void removeItem( int index = -1 ); + PopupMenuEditorItem * currentItem(); + PopupMenuEditorItem * itemAt( int y ); + void setFocusAt( const TQPoint & pos ); + + bool eventFilter( TQObject * o, TQEvent * e ); + void paintEvent( TQPaintEvent * e ); + void mousePressEvent( TQMouseEvent * e ); + void mouseDoubleClickEvent( TQMouseEvent * e ); + void mouseMoveEvent( TQMouseEvent * e ); + void dragEnterEvent( TQDragEnterEvent * e ); + void dragLeaveEvent( TQDragLeaveEvent * e ); + void dragMoveEvent( TQDragMoveEvent * e ); + void dropEvent( TQDropEvent * e ); + void keyPressEvent( TQKeyEvent * e ); + void focusInEvent( TQFocusEvent * e ); + void focusOutEvent( TQFocusEvent * e ); + + void drawItems( TQPainter * p ); + void drawItem( TQPainter * p, PopupMenuEditorItem * i, const TQRect & r, int f ) const; + void drawWinFocusRect( TQPainter * p, const TQRect & r ) const; + + TQSize contentsSize(); + int itemHeight( const PopupMenuEditorItem * item ) const; + int itemPos( const PopupMenuEditorItem * item ) const; + + int snapToItem( int y ); + void dropInPlace( PopupMenuEditorItem * i, int y ); + void dropInPlace( TQActionGroup * g, int y ); + + void safeDec(); + void safeInc(); + + void clearCurrentField(); + void navigateUp( bool ctrl ); + void navigateDown( bool ctrl ); + void navigateLeft(); + void navigateRight(); + void enterEditMode( TQKeyEvent * e ); + void leaveEditMode( TQKeyEvent * e ); + + TQString constructName( PopupMenuEditorItem *item ); + +private: + FormWindow * formWnd; + TQLineEdit * lineEdit; + TQWidget * dropLine; + TQPtrList<PopupMenuEditorItem> itemList; + PopupMenuEditorItem addItem; + PopupMenuEditorItem addSeparator; + TQWidget * parentMenu; + + int iconWidth; + int textWidth; + int accelWidth; + int arrowWidth; + int borderSize; + + int currentField; + int currentIndex; + TQPoint mousePressPos; + static PopupMenuEditorItem * draggedItem; + + enum ClipboardOperation { + None = 0, + Cut = 1, + Copy = 2 + }; + static int clipboardOperation; + static PopupMenuEditorItem * clipboardItem; +}; + +#endif //POPUPMENUEDITOR_H diff --git a/kdevdesigner/designer/preferences.ui b/kdevdesigner/designer/preferences.ui new file mode 100644 index 00000000..363164ed --- /dev/null +++ b/kdevdesigner/designer/preferences.ui @@ -0,0 +1,648 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>Preferences</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>Preferences</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>482</width> + <height>480</height> + </rect> + </property> + <property name="caption"> + <string>Preferences</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Preferences</b><p>Change the preferences of Qt Designer. There is always one tab with general preferences. There may be additional tabs, depending on which plugins are installed.</p></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTabWidget"> + <property name="name"> + <cstring>tabWidget</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>pageGeneral</cstring> + </property> + <attribute name="title"> + <string>General</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQGroupBox" row="1" column="1"> + <property name="name"> + <cstring>groupBox4</cstring> + </property> + <property name="title"> + <string>File Saving</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBoxAutoSave</cstring> + </property> + <property name="text"> + <string>Enable auto sa&ve</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>textLabelAutoSave</cstring> + </property> + <property name="text"> + <string>Auto save &interval:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>timeEditAutoSave</cstring> + </property> + </widget> + <widget class="TQTimeEdit"> + <property name="name"> + <cstring>timeEditAutoSave</cstring> + </property> + <property name="time"> + <time> + <hour>0</hour> + <minute>30</minute> + <second>0</second> + </time> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="TQButtonGroup" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>buttonGroup2</cstring> + </property> + <property name="title"> + <string>Plu&gin Paths</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQTextEdit"> + <property name="name"> + <cstring>textEditPluginPaths</cstring> + </property> + </widget> + </hbox> + </widget> + <spacer row="3" column="1"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="whatsThis" stdset="0"> + <string>A splash screen is displayed when starting Qt Designer if this option is checked.</string> + </property> + </spacer> + <widget class="TQGroupBox" row="1" column="0"> + <property name="name"> + <cstring>GroupBox5</cstring> + </property> + <property name="title"> + <string>Ge&neral</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBoxWorkspace</cstring> + </property> + <property name="text"> + <string>Restore last &workspace on startup</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Restore last workspace</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The current workspace settings will be restored the next time you start Qt Designer if this option is checked.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBoxSplash</cstring> + </property> + <property name="text"> + <string>Show &splash screen on startup</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Show Splashscreen</string> + </property> + <property name="whatsThis" stdset="0"> + <string>A splash screen is displayed when starting Qt Designer if this option is checked.</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBoxStartDialog</cstring> + </property> + <property name="text"> + <string>Show start &dialog</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkAutoEdit</cstring> + </property> + <property name="text"> + <string>Disable data&base auto-edit in preview</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBoxTextLabels</cstring> + </property> + <property name="text"> + <string>Show toolbutton lab&els</string> + </property> + <property name="toolTip" stdset="0"> + <string>Text Labels</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Text labels will be used in the toolbars if this is checked.</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQGroupBox" row="0" column="1"> + <property name="name"> + <cstring>groupBoxGrid</cstring> + </property> + <property name="title"> + <string>G&rid</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBoxSnapGrid</cstring> + </property> + <property name="text"> + <string>Sn&ap to grid</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Snap to the grid</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Customize the grid-settings for all forms.</b><p>When <b>Snap to Grid</b> is checked, the widgets snap to the grid using the the X/Y resolution.</p></string> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQSpinBox" row="0" column="1"> + <property name="name"> + <cstring>spinGridX</cstring> + </property> + <property name="maxValue"> + <number>50</number> + </property> + <property name="minValue"> + <number>5</number> + </property> + <property name="value"> + <number>10</number> + </property> + <property name="toolTip" stdset="0"> + <string>Grid resolution</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Customize the grid-settings for all forms.</b><p>When <b>Show Grid</b> is checked, a grid is shown on all forms using the X/Y resolution.</p></string> + </property> + </widget> + <widget class="TQSpinBox" row="1" column="1"> + <property name="name"> + <cstring>spinGridY</cstring> + </property> + <property name="maxValue"> + <number>50</number> + </property> + <property name="minValue"> + <number>5</number> + </property> + <property name="value"> + <number>10</number> + </property> + <property name="toolTip" stdset="0"> + <string>Grid resolution</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Customize the grid-settings for all forms.</b><p>When <b>Show Grid</b> is checked, a grid is shown on all forms using the X/Y resolution.</p></string> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>Label1</cstring> + </property> + <property name="text"> + <string>Grid-&X:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>spinGridX</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label1_2</cstring> + </property> + <property name="text"> + <string>Grid-&Y:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>spinGridY</cstring> + </property> + </widget> + </grid> + </widget> + </vbox> + </widget> + <widget class="TQButtonGroup" row="0" column="0"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Backgro&und</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="StyledButton" row="0" column="1"> + <property name="name"> + <cstring>buttonColor</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Choose a color</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Select a color in the color dialog.</string> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="0"> + <property name="name"> + <cstring>radioColor</cstring> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Co&lor</string> + </property> + <property name="toolTip" stdset="0"> + <string>Use a background color</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Use a background color.</string> + </property> + </widget> + <widget class="TQRadioButton" row="1" column="0"> + <property name="name"> + <cstring>radioPixmap</cstring> + </property> + <property name="text"> + <string>&Pixmap</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Use a background pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Use a background pixmap.</string> + </property> + </widget> + <widget class="StyledButton" row="1" column="1"> + <property name="name"> + <cstring>buttonPixmap</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="scale" stdset="0"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Select a pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose a pixmap file.</string> + </property> + </widget> + </grid> + </widget> + </grid> + </widget> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>helpButton</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>false</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>StyledButton</class> + <header location="local">styledbutton.h</header> + <sizehint> + <width>40</width> + <height>25</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>"image0"</pixmap> + <signal>clicked()</signal> + <signal>changed()</signal> + <property type="Color">color</property> + <property type="Pixmap">pixmap</property> + <property type="Bool">scale</property> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data> + </image> +</images> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>Preferences</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>Preferences</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>radioColor</sender> + <signal>toggled(bool)</signal> + <receiver>buttonColor</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>radioPixmap</sender> + <signal>toggled(bool)</signal> + <receiver>buttonPixmap</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>tabWidget</tabstop> + <tabstop>radioColor</tabstop> + <tabstop>radioPixmap</tabstop> + <tabstop>buttonColor</tabstop> + <tabstop>buttonPixmap</tabstop> + <tabstop>checkBoxSnapGrid</tabstop> + <tabstop>spinGridX</tabstop> + <tabstop>spinGridY</tabstop> + <tabstop>checkBoxWorkspace</tabstop> + <tabstop>checkBoxSplash</tabstop> + <tabstop>checkBoxStartDialog</tabstop> + <tabstop>checkAutoEdit</tabstop> + <tabstop>checkBoxTextLabels</tabstop> + <tabstop>helpButton</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>styledbutton.h</includehint> + <includehint>styledbutton.h</includehint> +</includehints> +</UI> diff --git a/kdevdesigner/designer/previewframe.cpp b/kdevdesigner/designer/previewframe.cpp new file mode 100644 index 00000000..c26d51fc --- /dev/null +++ b/kdevdesigner/designer/previewframe.cpp @@ -0,0 +1,57 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvbox.h> +#include <tqpainter.h> + +#include "previewframe.h" + +PreviewFrame::PreviewFrame( TQWidget *parent, const char *name ) + : TQVBox( parent, name ) +{ + setMinimumSize(200, 200); + setFrameStyle(TQFrame::StyledPanel | TQFrame::Sunken); + setLineWidth(1); + + PreviewWorkspace * w = new PreviewWorkspace( this ); + w->setEraseColor(colorGroup().dark()); + previewWidget = new PreviewWidget( w ); + previewWidget->move( 10, 10 ); +} + +void PreviewFrame::setPreviewPalette(TQPalette pal) +{ + previewWidget->setPalette(pal); +} + +void PreviewWorkspace::paintEvent( TQPaintEvent* ) +{ + TQPainter p ( this ); + p.setPen( TQPen( white ) ); + p.drawText ( 0, height() / 2, width(), height(), AlignHCenter, + "The moose in the noose\nate the goose who was loose." ); +} + diff --git a/kdevdesigner/designer/previewframe.h b/kdevdesigner/designer/previewframe.h new file mode 100644 index 00000000..1883a062 --- /dev/null +++ b/kdevdesigner/designer/previewframe.h @@ -0,0 +1,61 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PREVIEWFRAME_H +#define PREVIEWFRAME_H + +#include <tqvbox.h> +#include <tqworkspace.h> + +#include "previewwidgetimpl.h" + +class PreviewWorkspace : public TQWorkspace +{ + Q_OBJECT + +public: + PreviewWorkspace( TQWidget* parent = 0, const char* name = 0 ) + : TQWorkspace( parent, name ) {} + ~PreviewWorkspace() {} + +protected: + void paintEvent( TQPaintEvent* ); +}; + +class PreviewFrame : public TQVBox +{ + Q_OBJECT + + +public: + PreviewFrame( TQWidget *parent = 0, const char *name = 0 ); + void setPreviewPalette(TQPalette); + +private: + PreviewWidget *previewWidget; +}; + +#endif diff --git a/kdevdesigner/designer/previewwidget.ui b/kdevdesigner/designer/previewwidget.ui new file mode 100644 index 00000000..3b792253 --- /dev/null +++ b/kdevdesigner/designer/previewwidget.ui @@ -0,0 +1,304 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>PreviewWidgetBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQWidget"> + <property name="name"> + <cstring>PreviewWidgetBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>378</width> + <height>236</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property name="caption"> + <string>Preview Window</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout17</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>ButtonGroup</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>RadioButton1</cstring> + </property> + <property name="text"> + <string>RadioButton1</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>RadioButton2</cstring> + </property> + <property name="text"> + <string>RadioButton2</string> + </property> + </widget> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>RadioButton3</cstring> + </property> + <property name="text"> + <string>RadioButton3</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQButtonGroup"> + <property name="name"> + <cstring>ButtonGroup2</cstring> + </property> + <property name="title"> + <string>ButtonGroup2</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>CheckBox1</cstring> + </property> + <property name="text"> + <string>CheckBox1</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>CheckBox2</cstring> + </property> + <property name="text"> + <string>CheckBox2</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQProgressBar"> + <property name="name"> + <cstring>ProgressBar1</cstring> + </property> + <property name="progress"> + <number>50</number> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="KLineEdit"> + <property name="name"> + <cstring>LineEdit1</cstring> + </property> + <property name="text"> + <string>LineEdit</string> + </property> + </widget> + <widget class="TQComboBox"> + <item> + <property name="text"> + <string>ComboBox</string> + </property> + </item> + <property name="name"> + <cstring>ComboBox1</cstring> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout13</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQSpinBox"> + <property name="name"> + <cstring>SpinBox1</cstring> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton1</cstring> + </property> + <property name="text"> + <string>PushButton</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQScrollBar"> + <property name="name"> + <cstring>ScrollBar1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="TQSlider"> + <property name="name"> + <cstring>Slider1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="TQTextView"> + <property name="name"> + <cstring>textView</cstring> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>50</height> + </size> + </property> + <property name="text"> + <string><p> +<a href="http://www.trolltech.com/">http://www.trolltech.com</a> +</p> +<p> +<a href="http://www.kde.org/">http://www.kde.org</a> +</p></string> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </vbox> +</widget> +<connections> + <slot access="protected" language="C++" returnType="void">init()</slot> + <slot access="protected" language="C++" returnType="void">destroy()</slot> +</connections> +</UI> diff --git a/kdevdesigner/designer/previewwidgetimpl.cpp b/kdevdesigner/designer/previewwidgetimpl.cpp new file mode 100644 index 00000000..d574f9ae --- /dev/null +++ b/kdevdesigner/designer/previewwidgetimpl.cpp @@ -0,0 +1,65 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "tqobjectlist.h" +#include "previewwidgetimpl.h" + +PreviewWidget::PreviewWidget( TQWidget *parent, const char *name ) + : PreviewWidgetBase( parent, name ) +{ + // install event filter on child widgets + TQObjectList *l = queryList(TQWIDGET_OBJECT_NAME_STRING); + TQObjectListIt it(*l); + TQObject * obj; + while ((obj = it.current()) != 0) { + ++it; + obj->installEventFilter(this); + ((TQWidget*)obj)->setFocusPolicy(TQ_NoFocus); + } +} + +void PreviewWidget::closeEvent(TQCloseEvent *e) +{ + e->ignore(); +} + +bool PreviewWidget::eventFilter(TQObject *, TQEvent *e) +{ + switch ( e->type() ) { + case TQEvent::MouseButtonPress: + case TQEvent::MouseButtonRelease: + case TQEvent::MouseButtonDblClick: + case TQEvent::MouseMove: + case TQEvent::KeyPress: + case TQEvent::KeyRelease: + case TQEvent::Enter: + case TQEvent::Leave: + return TRUE; // ignore; + default: + break; + } + return FALSE; +} diff --git a/kdevdesigner/designer/previewwidgetimpl.h b/kdevdesigner/designer/previewwidgetimpl.h new file mode 100644 index 00000000..d8887bee --- /dev/null +++ b/kdevdesigner/designer/previewwidgetimpl.h @@ -0,0 +1,44 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PREVIEWWIDGETIMPL_H +#define PREVIEWWIDGETIMPL_H + +#include "previewwidget.h" + +class PreviewWidget : public PreviewWidgetBase +{ + Q_OBJECT + + +public: + PreviewWidget( TQWidget *parent = 0, const char *name = 0 ); + + void closeEvent(TQCloseEvent *); + bool eventFilter(TQObject *, TQEvent *); +}; + +#endif diff --git a/kdevdesigner/designer/project.cpp b/kdevdesigner/designer/project.cpp new file mode 100644 index 00000000..0ab26894 --- /dev/null +++ b/kdevdesigner/designer/project.cpp @@ -0,0 +1,1558 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +**1 This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "project.h" +#include "formwindow.h" +#include "designerappiface.h" +#include "../interfaces/languageinterface.h" +#include "pixmapcollection.h" +#ifndef TQT_NO_SQL +#include "dbconnectionimpl.h" +#endif +#include "resource.h" +#include <tqwidgetfactory.h> +#include "outputwindow.h" + +#include <tqfile.h> +#include <tqtextstream.h> +#include <tqurl.h> +#include <tqobjectlist.h> +#include <tqfeatures.h> +#include <tqtextcodec.h> +#include <tqdom.h> +#include <tqmessagebox.h> +#include <tqapplication.h> +#include "mainwindow.h" +#include <tqworkspace.h> + +#ifndef TQT_NO_SQL +#include <tqsqldatabase.h> +#include <tqsqlrecord.h> +#include <tqdatatable.h> +#endif + +#include <stdlib.h> +#ifdef Q_OS_UNIX +# include <unistd.h> +#endif + +#include <tdelocale.h> + +#ifndef TQT_NO_SQL +DatabaseConnection::~DatabaseConnection() +{ + delete iface; +} + +bool DatabaseConnection::refreshCatalog() +{ +#ifndef TQT_NO_SQL + if ( loaded ) + return TRUE; + if ( !open() ) + return FALSE; + tbls = conn->tables( TQSql::TableType( TQSql::Tables | TQSql::Views ) ); + flds.clear(); + for ( TQStringList::Iterator it = tbls.begin(); it != tbls.end(); ++it ) { + TQSqlRecord fil = conn->record( *it ); + TQStringList lst; + for ( uint j = 0; j < fil.count(); ++j ) + lst << fil.field( j )->name(); + flds.insert( *it, lst ); + } + loaded = TRUE; + conn->close(); + return loaded; +#else + return FALSE; +#endif +} + +#ifndef TQT_NO_SQL +void DatabaseConnection::remove() +{ + if ( nm == "(default)" ) + TQSqlDatabase::removeDatabase( TQSqlDatabase::defaultConnection ); + else + TQSqlDatabase::removeDatabase( nm ); + // the above will effectively delete the current connection + conn = 0; +} +#endif + +bool DatabaseConnection::open( bool suppressDialog ) +{ +#ifndef TQT_NO_SQL + // register our name, if nec + if ( nm == "(default)" ) { + if ( !TQSqlDatabase::contains() ) // default doesn't exists? + conn = TQSqlDatabase::addDatabase( drv ); + else + conn = TQSqlDatabase::database(); + } else { + if ( !TQSqlDatabase::contains( nm ) ) + conn = TQSqlDatabase::addDatabase( drv, nm ); + else + conn = TQSqlDatabase::database( nm ); + } + conn->setDatabaseName( dbName ); + conn->setUserName( uname ); + conn->setPassword( pword ); + conn->setHostName( hname ); + conn->setPort( prt ); + bool success = conn->open(); + for( ; suppressDialog == FALSE ; ) { + bool done = FALSE; + if ( !success ) { + DatabaseConnectionEditor dia( this, 0 , 0 , TRUE ); + switch( dia.exec() ) { + case TQDialog::Accepted: + done = FALSE; + break; + case TQDialog::Rejected: + done = TRUE; + break; + } + } + if ( done ) + break; + conn->setUserName( uname ); + conn->setPassword( pword ); + conn->setHostName( hname ); + conn->setPort( prt ); + success = conn->open(); + if ( !success ) { + switch( TQMessageBox::warning( project->messageBoxParent(), i18n( "Connection" ), + i18n( "Could not connect to the database.\n" + "Press 'OK' to continue or 'Cancel' to " + "specify different\nconnection information.\n" ) + + TQString( "[" + conn->lastError().driverText() + "\n" + + conn->lastError().databaseText() + "]\n" ), + i18n( "&OK" ), + i18n( "&Cancel" ), TQString(), 0, 1 ) ) { + case 0: // OK or Enter + continue; + case 1: // Cancel or Escape + done = TRUE; + break; + } + } else + break; + if ( done ) + break; + } + if ( !success ) { + dbErr = conn->lastError().driverText() + "\n" + conn->lastError().databaseText(); + remove(); + } + return success; +#else + return FALSE; +#endif +} + +void DatabaseConnection::close() +{ + if ( !loaded ) + return; +#ifndef TQT_NO_SQL + if ( conn ) { + conn->close(); + } +#endif +} + +DesignerDatabase *DatabaseConnection::iFace() +{ + if ( !iface ) + iface = new DesignerDatabaseImpl( this ); + return iface; +} + +#endif + +//////// + +bool Project::isDummy() const +{ + return isDummyProject; +} + +Project::Project( const TQString &fn, const TQString &pName, + TQPluginManager<ProjectSettingsInterface> *pm, bool isDummy, + const TQString &l ) + : proName( pName ), projectSettingsPluginManager( pm ), isDummyProject( isDummy ) +{ + modified = TRUE; + pixCollection = new PixmapCollection( this ); + iface = 0; + lang = l; + is_cpp = lang == "C++"; + cfg.insert( "(all)", "qt warn_on release" ); + templ = "app"; + setFileName( fn ); + if ( !pName.isEmpty() ) + proName = pName; + sourcefiles.setAutoDelete( TRUE ); + modified = FALSE; + objs.setAutoDelete( FALSE ); + fakeFormFiles.setAutoDelete( FALSE ); +} + +Project::~Project() +{ + if ( singleProjectMode() ) + removeTempProject(); + delete iface; + delete pixCollection; +} + +void Project::setModified( bool b ) +{ + modified = b; + emit projectModified(); +} + +#ifndef TQT_NO_SQL +DatabaseConnection *Project::databaseConnection( const TQString &name ) +{ + for ( DatabaseConnection *conn = dbConnections.first(); + conn; + conn = dbConnections.next() ) { + if ( conn->name() == name ) + return conn; + } + return 0; +} +#endif + +void Project::setFileName( const TQString &fn, bool doClear ) +{ + if ( fn == filename ) + return; + + if ( singleProjectMode() ) { + TQString qsa = TQString( getenv( "HOME" ) ) + TQString( "/.qsa" ); + if ( !TQFile::exists( qsa ) ) { + TQDir d; + d.mkdir( qsa ); + } + if ( fn == singleProFileName ) + return; + singleProFileName = fn; + static int counter = 0; + TQString str_counter = TQString::number( counter++ ); + str_counter = "/.qsa/" + str_counter; + LanguageInterface *iface = MetaDataBase::languageInterface( language() ); + filename = TQString( getenv( "HOME" ) + str_counter + TQString( "tmp_" ) + + TQFileInfo( fn ).baseName() + "/" + TQFileInfo( fn ).baseName() + ".pro" ); + removeTempProject(); + if ( iface && iface->supports( LanguageInterface::CompressProject ) ) { + filename = iface->uncompressProject( makeAbsolute( singleProFileName ), + TQString( getenv( "HOME" ) + + str_counter + TQString( "tmp_" ) + + TQFileInfo( fn ).baseName() ) ); + proName = makeAbsolute( singleProFileName ); + } + } else { + filename = fn; + if ( !filename.endsWith( ".pro" ) ) + filename += ".pro"; + proName = filename; + } + + + if ( proName.contains( '.' ) ) + proName = proName.left( proName.find( '.' ) ); + + if ( !doClear ) + return; + clear(); + if ( TQFile::exists( filename ) ) + parse(); +} + +TQString Project::fileName( bool singlePro ) const +{ + if ( singlePro ) + return singleProFileName; + return filename; +} + +TQString Project::databaseDescription() const +{ + return dbFile; +} + +TQString Project::projectName() const +{ + return proName; +} + +static TQString parse_part( const TQString &part ) +{ + TQString res; + bool inName = FALSE; + TQString currName; + for ( int i = 0; i < (int)part.length(); ++i ) { + TQChar c = part[ i ]; + if ( !inName ) { + if ( c != ' ' && c != '\t' && c != '\n' && c != '=' && c != '\\' && c != '+' ) + inName = TRUE; + else + continue; + } + if ( inName ) { + if ( c == '\n' ) + break; + res += c; + } + } + return res; +} + +TQStringList parse_multiline_part( const TQString &contents, const TQString &key, int *start = 0 ) +{ + if ( start ) + *start = -1; + TQString lastWord; + // Account for things like win32: SOURCES + int extraWhiteSpaceCount = 0; + int braceCount = 0; + for ( int i = 0; i < (int)contents.length(); ++i ) { + TQChar c( contents[ i ] ); + switch ( c ) { + case '{': + braceCount++; + lastWord = ""; + break; + case '}': + braceCount--; + lastWord = ""; + break; + case ' ': case '\t': + if (!key.startsWith(lastWord)) { + lastWord = ""; + extraWhiteSpaceCount = 0; + } else { + extraWhiteSpaceCount++; + } + break; + case '\\': case '\n': + lastWord = ""; + break; + default: + lastWord += c; + } + + // ### we should read the 'bla { SOURCES= ... }' stuff as well (braceCount > 0) + if ( lastWord == key && braceCount == 0 ) { + if ( start ) + *start = i - lastWord.length() - extraWhiteSpaceCount + 1; + TQStringList lst; + bool inName = FALSE; + TQString currName; + bool hadEqual = FALSE; + for ( ; i < (int)contents.length(); ++i ) { + c = contents[ i ]; + if ( !hadEqual && c != '=' ) + continue; + if ( !hadEqual ) { + hadEqual = TRUE; + continue; + } + if ( ( c.isLetter() || c.isDigit() || c == '.' || c == '/' || c == '_' || c == '\\' || + c == '\"' || c == '\'' || c == '=' || + c == '$' || c == '-' || c == '(' || c == ')' || c == ':' || c == '+' || c == ',' || c == '~' ) && + c != ' ' && c != '\t' && c != '\n' ) { + if ( !inName ) + currName = TQString(); + if ( c != '\\' || contents[i+1] != '\n' ) { + currName += c; + inName = TRUE; + } + } else { + if ( inName ) { + inName = FALSE; + if ( currName.simplifyWhiteSpace() != "\\" ) + lst.append( currName ); + } + if ( c == '\n' && i > 0 && contents[ (int)i - 1 ] != '\\' ) + break; + } + } + return lst; + } + } + + return TQStringList(); +} + +void Project::parse() +{ + TQFile f( filename ); + if ( !f.exists() || !f.open( IO_ReadOnly ) ) + return; + TQTextStream ts( &f ); + TQString contents = ts.read(); + f.close(); + + proName = TQFileInfo( filename ).baseName(); + + TQStringList::ConstIterator it; + + int i = contents.find( "LANGUAGE" ); + if ( i != -1 ) { + lang = ""; + is_cpp = FALSE; + TQString part = contents.mid( i + TQString( "LANGUAGE" ).length() ); + lang = parse_part( part ); + is_cpp = lang == "C++"; + } + + i = contents.find( "DBFILE" ); + if ( i != -1 ) { + dbFile = ""; + TQString part = contents.mid( i + TQString( "DBFILE" ).length() ); + dbFile = parse_part( part ); + } + + TQStringList uifiles = parse_multiline_part( contents, "FORMS" ); + uifiles += parse_multiline_part( contents, "INTERFACES" ); // compatibility + for ( it = uifiles.begin(); it != uifiles.end(); ++it ) { + if ( (*it).startsWith( "__APPOBJ" ) ) + continue; + (void) new FormFile( *it, FALSE, this ); + } + + + i = contents.find( "TEMPLATE" ); + if ( i != -1 ) { + templ = ""; + TQString part = contents.mid( i + TQString( "TEMPLATE" ).length() ); + templ = parse_part( part ); + } + + readPlatformSettings( contents, "CONFIG", cfg ); + readPlatformSettings( contents, "LIBS", lbs ); + readPlatformSettings( contents, "INCLUDEPATH", inclPath ); + readPlatformSettings( contents, "DEFINES", defs ); + readPlatformSettings( contents, "SOURCES", sources ); + readPlatformSettings( contents, "HEADERS", headers ); + + LanguageInterface *iface = MetaDataBase::languageInterface( lang ); + if ( iface ) { + TQStringList sourceKeys; + iface->sourceProjectKeys( sourceKeys ); + for ( TQStringList::Iterator it = sourceKeys.begin(); it != sourceKeys.end(); ++it ) { + TQStringList lst = parse_multiline_part( contents, *it ); + for ( TQStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) + (void) new SourceFile( *it, FALSE, this ); + } + } + + updateCustomSettings(); + + for ( it = csList.begin(); it != csList.end(); ++it ) { + i = contents.find( *it ); + if ( i != -1 ) { + TQString val = ""; + TQString part = contents.mid( i + TQString( *it ).length() ); + val = parse_part( part ); + customSettings.replace( *it, val ); + } + } + + loadConnections(); + + TQStringList images = parse_multiline_part( contents, "IMAGES" ); + + // ### remove that for the final - this is beta-compatibility + if ( images.isEmpty() && TQDir( TQFileInfo( filename ).dirPath( TRUE ) + "/images" ).exists() ) { + images = TQDir( TQFileInfo( filename ).dirPath( TRUE ) + "/images" ).entryList(); + for ( int i = 0; i < (int)images.count(); ++i ) + images[ i ].prepend( "images/" ); + modified = TRUE; + } + + for ( TQStringList::ConstIterator pit = images.begin(); pit != images.end(); ++pit ) + pixCollection->load( *pit ); +} + +void Project::clear() +{ + dbFile = ""; + proName = "unnamed"; + desc = ""; +} + +bool Project::removeSourceFile( SourceFile *sf ) +{ + if ( !sourcefiles.containsRef( sf ) ) + return FALSE; + if ( !sf->close() ) + return FALSE; + sourcefiles.removeRef( sf ); + modified = TRUE; + emit sourceFileRemoved( sf ); + return TRUE; +} + +void Project::setDatabaseDescription( const TQString &db ) +{ + dbFile = db; +} + +void Project::setDescription( const TQString &s ) +{ + desc = s; +} + +TQString Project::description() const +{ + return desc; +} + + +bool Project::isValid() const +{ + // #### do more checking here? + if ( filename.isEmpty() || proName.isEmpty() ) + return FALSE; + + return TRUE; +} + +TQString Project::makeAbsolute( const TQString &f ) +{ + if ( isDummy() ) + return f; + TQString encodedUrl = TQFileInfo( filename ).dirPath( TRUE ); + TQUrl::encode( encodedUrl ); + TQUrl u( encodedUrl, f ); + return u.path(); +} + +TQString Project::makeRelative( const TQString &f ) +{ + if ( isDummy() ) + return f; + TQString p = TQFileInfo( filename ).dirPath( TRUE ); + TQString f2 = f; + if ( f2.left( p.length() ) == p ) + f2.remove( 0, p.length() + 1 ); + return f2; +} + +static void remove_contents( TQString &contents, const TQString &s ) +{ + int i = contents.find( s ); + if ( i != -1 ) { + int start = i; + int end = contents.find( '\n', i ); + if ( end == -1 ) + end = contents.length() - 1; + contents.remove( start, end - start + 1 ); + } +} + +static void remove_multiline_contents( TQString &contents, const TQString &s, int *strt = 0 ) +{ + int i = contents.find( s ); + if ( strt ) + *strt = i; + int start = i; + bool lastWasBackspash = FALSE; + if ( i != -1 && ( i == 0 || contents[ i - 1 ] != '{' || contents[ i - 1 ] != ':' ) ) { + for ( ; i < (int)contents.length(); ++i ) { + if ( contents[ i ] == '\n' && !lastWasBackspash ) + break; + lastWasBackspash = ( contents[ i ] == '\\' || + lastWasBackspash && ( contents[ i ] == ' ' || contents[ i ] == '\t' ) ); + } + contents.remove( start, i - start + 1 ); + } +} + +void Project::save( bool onlyProjectFile ) +{ + bool anythingModified = FALSE; + + // save sources and forms + if ( !onlyProjectFile ) { + + saveConnections(); + + for ( SourceFile *sf = sourcefiles.first(); sf; sf = sourcefiles.next() ) { + anythingModified = anythingModified || sf->isModified(); + if ( !sf->save() ) + return; + } + + for ( FormFile *ff = formfiles.first(); ff; ff = formfiles.next() ) { + anythingModified = anythingModified || ff->isModified(); + if ( !ff->save() ) + return; + } + } + + if ( isDummy() || filename.isEmpty() ) + return; + + if ( !modified ) { + if ( singleProjectMode() ) { + LanguageInterface *iface = MetaDataBase::languageInterface( language() ); + if ( iface && iface->supports( LanguageInterface::CompressProject ) ) + iface->compressProject( makeAbsolute( filename ), singleProFileName, anythingModified ); + } + return; + } + + TQFile f( filename ); + TQString original = ""; + + // read the existing file + bool hasPreviousContents = FALSE; + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + original = ts.read(); + f.close(); + hasPreviousContents = TRUE; + remove_contents( original, "{SOURCES+=" ); // ### compatibility with early 3.0 betas + remove_contents( original, "DBFILE" ); + remove_contents( original, "LANGUAGE" ); + remove_contents( original, "TEMPLATE" ); + removePlatformSettings( original, "CONFIG" ); + removePlatformSettings( original, "DEFINES" ); + removePlatformSettings( original, "LIBS" ); + removePlatformSettings( original, "INCLUDEPATH" ); + removePlatformSettings( original, "SOURCES" ); + removePlatformSettings( original, "HEADERS" ); + remove_multiline_contents( original, "FORMS" ); + remove_multiline_contents( original, "INTERFACES" ); // compatibility + remove_multiline_contents( original, "IMAGES" ); + for ( TQStringList::Iterator it = csList.begin(); it != csList.end(); ++it ) + remove_contents( original, *it ); + } + + // the contents of the saved file + TQString contents; + + // template + contents += "TEMPLATE\t= " + templ + "\n"; + + // language + contents += "LANGUAGE\t= " + lang + "\n"; + contents += "\n"; + + // config + writePlatformSettings( contents, "CONFIG", cfg ); + LanguageInterface *iface = MetaDataBase::languageInterface( lang ); + if ( iface ) { + TQStringList sourceKeys; + iface->sourceProjectKeys( sourceKeys ); + for ( TQStringList::Iterator spit = sourceKeys.begin(); spit != sourceKeys.end(); ++spit ) + remove_multiline_contents( contents, *spit ); + } + contents += "\n"; + + // libs, defines, includes + writePlatformSettings( contents, "LIBS", lbs ); + writePlatformSettings( contents, "DEFINES", defs ); + writePlatformSettings( contents, "INCLUDEPATH", inclPath ); + writePlatformSettings( contents, "SOURCES", sources ); + writePlatformSettings( contents, "HEADERS", headers ); + + // unix + if ( !hasPreviousContents ) { + contents += + "unix {\n" + " UI_DIR = .ui\n" + " MOC_DIR = .moc\n" + " OBJECTS_DIR = .obj\n" + "}\n"; + } + contents += "\n"; + + // sources + if ( !sourcefiles.isEmpty() && iface ) { + TQMap<TQString, TQStringList> sourceToKey; + for ( SourceFile *f = sourcefiles.first(); f; f = sourcefiles.next() ) { + TQString key = iface->projectKeyForExtension( TQFileInfo( f->fileName() ).extension() ); + TQStringList lst = sourceToKey[ key ]; + lst << makeRelative( f->fileName() ); + sourceToKey.replace( key, lst ); + } + + for ( TQMap<TQString, TQStringList>::Iterator skit = sourceToKey.begin(); + skit != sourceToKey.end(); ++skit ) { + TQString part = skit.key() + "\t+= "; + TQStringList lst = *skit; + for ( TQStringList::Iterator sit = lst.begin(); sit != lst.end(); ++sit ) { + part += *sit; + part += ++sit != lst.end() ? " \\\n\t" : ""; + --sit; + } + part += "\n"; + contents += part; + } + } + + // forms and interfaces + if ( !formfiles.isEmpty() ) { + contents += "FORMS\t= "; + for ( TQPtrListIterator<FormFile> fit = formfiles; fit.current(); ++fit ) { + contents += fit.current()->fileName() + + (fit != formfiles.last() ? " \\\n\t" : ""); + } + contents += "\n"; + } + + // images + if ( !pixCollection->isEmpty() ) { + contents += "IMAGES\t= "; + TQValueList<PixmapCollection::Pixmap> pixmaps = pixCollection->pixmaps(); + for ( TQValueList<PixmapCollection::Pixmap>::Iterator it = pixmaps.begin(); + it != pixmaps.end(); ++it ) { + contents += makeRelative( (*it).absname ); + contents += ++it != pixmaps.end() ? " \\\n\t" : ""; + --it; + } + contents += "\n"; + } + + // database + if ( !dbFile.isEmpty() ) + contents += "DBFILE\t= " + dbFile + "\n"; + contents += "\n"; + + // custom settings + for ( TQStringList::Iterator it = csList.begin(); it != csList.end(); ++it ) { + TQString val = *customSettings.find( *it ); + if ( !val.isEmpty() ) + contents += *it + "\t= " + val + "\n"; + } + + if ( !f.open( IO_WriteOnly | IO_Translate ) ) { + TQMessageBox::warning( messageBoxParent(), + "Save Project Failed", "Couldn't write project file " + filename ); + return; + } + + TQTextStream os( &f ); + os << contents; + if (hasPreviousContents) + os << original; + + f.close(); + + setModified( FALSE ); + + if ( singleProjectMode() ) { + LanguageInterface *iface = MetaDataBase::languageInterface( language() ); + if ( iface && iface->supports( LanguageInterface::CompressProject ) ) + iface->compressProject( makeAbsolute( filename ), singleProFileName, TRUE ); + } +} + +#ifndef TQT_NO_SQL +TQPtrList<DatabaseConnection> Project::databaseConnections() const +{ + return dbConnections; +} +#endif + +#ifndef TQT_NO_SQL +void Project::setDatabaseConnections( const TQPtrList<DatabaseConnection> &lst ) +{ + dbConnections = lst; +} +#endif + +#ifndef TQT_NO_SQL +void Project::addDatabaseConnection( DatabaseConnection *conn ) +{ + dbConnections.append( conn ); + modified = TRUE; +} +#endif + +#ifndef TQT_NO_SQL +void Project::removeDatabaseConnection( const TQString &c ) +{ + for ( DatabaseConnection *conn = dbConnections.first(); conn; conn = dbConnections.next() ) { + if ( conn->name() == c ) { + conn->remove(); + dbConnections.removeRef( conn ); + delete conn; + return; + } + } +} +#endif + +#ifndef TQT_NO_SQL +TQStringList Project::databaseConnectionList() +{ + TQStringList lst; + for ( DatabaseConnection *conn = dbConnections.first(); conn; conn = dbConnections.next() ) + lst << conn->name(); + return lst; +} +#endif + +#ifndef TQT_NO_SQL +TQStringList Project::databaseTableList( const TQString &connection ) +{ + DatabaseConnection *conn = databaseConnection( connection ); + if ( !conn ) { + return TQStringList(); + } + return conn->tables(); +} +#endif + +#ifndef TQT_NO_SQL +TQStringList Project::databaseFieldList( const TQString &connection, const TQString &table ) +{ + DatabaseConnection *conn = databaseConnection( connection ); + if ( !conn ) + return TQStringList(); + return conn->fields( table ); +} +#endif + +#ifndef TQT_NO_SQL +static TQString makeIndent( int indent ) +{ + TQString s; + s.fill( ' ', indent * 4 ); + return s; +} +#endif + +#ifndef TQT_NO_SQL +static void saveSingleProperty( TQTextStream &ts, const TQString& name, const TQString& value, int indent ) +{ + ts << makeIndent( indent ) << "<property name=\"" << name << "\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<string>" << value << "</string>" << endl; + --indent; + ts << makeIndent( indent ) << "</property>" << endl; +} +#endif + +void Project::saveConnections() +{ +#ifndef TQT_NO_SQL + if ( dbFile.isEmpty() ) { + TQFileInfo fi( fileName() ); + setDatabaseDescription( fi.baseName() + ".db" ); + } + + TQFile f( makeAbsolute( dbFile ) ); + + if ( dbConnections.isEmpty() ) { + if ( f.exists() ) + f.remove(); + setDatabaseDescription( "" ); + modified = TRUE; + return; + } + + /* .db xml */ + if ( f.open( IO_WriteOnly | IO_Translate ) ) { + TQTextStream ts( &f ); + ts.setCodec( TQTextCodec::codecForName( "UTF-8" ) ); + ts << "<!DOCTYPE DB><DB version=\"1.0\">" << endl; + + /* db connections */ + int indent = 0; + for ( DatabaseConnection *conn = dbConnections.first(); conn; conn = dbConnections.next() ) { + ts << makeIndent( indent ) << "<connection>" << endl; + ++indent; + saveSingleProperty( ts, "name", conn->name(), indent ); + saveSingleProperty( ts, "driver", conn->driver(), indent ); + saveSingleProperty( ts, "database", conn->database(), indent ); + saveSingleProperty( ts, "username", conn->username(), indent ); + saveSingleProperty( ts, "hostname", conn->hostname(), indent ); + saveSingleProperty( ts, "port", TQString::number( conn->port() ), indent ); + + /* connection tables */ + TQStringList tables = conn->tables(); + for ( TQStringList::Iterator it = tables.begin(); + it != tables.end(); ++it ) { + ts << makeIndent( indent ) << "<table>" << endl; + ++indent; + saveSingleProperty( ts, "name", (*it), indent ); + + /* tables fields */ + TQStringList fields = conn->fields( *it ); + for ( TQStringList::Iterator it2 = fields.begin(); + it2 != fields.end(); ++it2 ) { + ts << makeIndent( indent ) << "<field>" << endl; + ++indent; + saveSingleProperty( ts, "name", (*it2), indent ); + --indent; + ts << makeIndent( indent ) << "</field>" << endl; + } + + --indent; + ts << makeIndent( indent ) << "</table>" << endl; + } + + --indent; + ts << makeIndent( indent ) << "</connection>" << endl; + } + + ts << "</DB>" << endl; + f.close(); + } +#endif +} + +#ifndef TQT_NO_SQL +static TQDomElement loadSingleProperty( TQDomElement e, const TQString& name ) +{ + TQDomElement n; + for ( n = e.firstChild().toElement(); + !n.isNull(); + n = n.nextSibling().toElement() ) { + if ( n.tagName() == "property" && n.toElement().attribute("name") == name ) + return n; + } + return n; +} +#endif + +void Project::loadConnections() +{ +#ifndef TQT_NO_SQL + if ( dbFile.isEmpty() || !TQFile::exists( makeAbsolute( dbFile ) ) ) + return; + + TQFile f( makeAbsolute( dbFile ) ); + if ( f.open( IO_ReadOnly ) ) { + TQDomDocument doc; + TQString errMsg; + int errLine; + if ( doc.setContent( &f, &errMsg, &errLine ) ) { + TQDomElement e; + e = doc.firstChild().toElement(); + + /* connections */ + TQDomNodeList connections = e.toElement().elementsByTagName( "connection" ); + for ( uint i = 0; i < connections.length(); i++ ) { + TQDomElement connection = connections.item(i).toElement(); + TQDomElement connectionName = loadSingleProperty( connection, "name" ); + TQDomElement connectionDriver = loadSingleProperty( connection, "driver" ); + TQDomElement connectionDatabase = loadSingleProperty( connection, + "database" ); + TQDomElement connectionUsername = loadSingleProperty( connection, + "username" ); + TQDomElement connectionHostname = loadSingleProperty( connection, + "hostname" ); + TQDomElement connectionPort = loadSingleProperty( connection, + "port" ); + + DatabaseConnection *conn = new DatabaseConnection( this ); + conn->setName( connectionName.firstChild().firstChild().toText().data() ); + conn->setDriver( connectionDriver.firstChild().firstChild().toText().data() ); + conn->setDatabase( connectionDatabase.firstChild().firstChild().toText().data() ); + conn->setUsername( connectionUsername.firstChild().firstChild().toText().data() ); + conn->setHostname( connectionHostname.firstChild().firstChild().toText().data() ); + conn->setPort( TQString( connectionPort.firstChild().firstChild().toText().data() ).toInt() ); + + /* connection tables */ + TQDomNodeList tables = connection.toElement().elementsByTagName( "table" ); + for ( uint j = 0; j < tables.length(); j++ ) { + TQDomElement table = tables.item(j).toElement(); + TQDomElement tableName = loadSingleProperty( table, "name" ); + conn->addTable( tableName.firstChild().firstChild().toText().data() ); + + /* table fields */ + TQStringList fieldList; + TQDomNodeList fields = table.toElement().elementsByTagName( "field" ); + for ( uint k = 0; k < fields.length(); k++ ) { + TQDomElement field = fields.item(k).toElement(); + TQDomElement fieldName = loadSingleProperty( field, "name" ); + fieldList.append( fieldName.firstChild().firstChild().toText().data() ); + } + conn->setFields( tableName.firstChild().firstChild().toText().data(), + fieldList ); + } + + dbConnections.append( conn ); + } + } else { + tqDebug( TQString("Parse error: ") + errMsg + TQString(" in line %d"), errLine ); + } + f.close(); + } +#endif +} + +/*! Opens the database \a connection. The connection remains open and +can be closed again with closeDatabase(). +*/ + +bool Project::openDatabase( const TQString &connection, bool suppressDialog ) +{ +#ifndef TQT_NO_SQL + DatabaseConnection *conn = databaseConnection( connection ); + if ( connection.isEmpty() && !conn ) + conn = databaseConnection( "(default)" ); + if ( !conn ) + return FALSE; + bool b = conn->open( suppressDialog ); + return b; +#else + Q_UNUSED( connection ); + Q_UNUSED( suppressDialog ); + return FALSE; +#endif +} + +/*! Closes the database \a connection. +*/ +void Project::closeDatabase( const TQString &connection ) +{ +#ifndef TQT_NO_SQL + DatabaseConnection *conn = databaseConnection( connection ); + if ( connection.isEmpty() && !conn ) + conn = databaseConnection( "(default)" ); + if ( !conn ) + return; + conn->close(); +#else + Q_UNUSED( connection ); +#endif +} + +// void Project::formClosed( FormWindow *fw ) +// { +// formWindows.remove( fw ); +// } + +TQObjectList *Project::formList( bool resolveFakeObjects ) const +{ + TQObjectList *l = new TQObjectList; + for ( TQPtrListIterator<FormFile> forms(formfiles); forms.current(); ++forms ) { + FormFile* f = forms.current(); + if ( f->formWindow() ) { + if ( resolveFakeObjects && f->formWindow()->isFake() ) + l->append( objectForFakeForm( f->formWindow() ) ); + else + l->append( f->formWindow()->child( 0, TQWIDGET_OBJECT_NAME_STRING ) ); + } else if ( f->isFake() ) { + l->append( objectForFakeFormFile( f ) ); + } + } + return l; +} + +DesignerProject *Project::iFace() +{ + if ( !iface ) + iface = new DesignerProjectImpl( this ); + return iface; +} + +void Project::setLanguage( const TQString &l ) +{ + if ( l == lang ) + return; + lang = l; + is_cpp = lang == "C++"; + updateCustomSettings(); + modified = TRUE; +} + +TQString Project::language() const +{ + return lang; +} + +void Project::setCustomSetting( const TQString &key, const TQString &value ) +{ + customSettings.remove( key ); + customSettings.insert( key, value ); + modified = TRUE; +} + +TQString Project::customSetting( const TQString &key ) const +{ + return *customSettings.find( key ); +} + +void Project::updateCustomSettings() +{ + if ( !projectSettingsPluginManager ) + return; + +/* + ProjectSettingsInterface *iface = 0; + projectSettingsPluginManager->queryInterface( lang, (TQUnknownInterface**)&iface ); + if ( !iface ) + return; + csList = iface->projectSettings(); + iface->release(); +*/ + + TQInterfacePtr<ProjectSettingsInterface> iface; + projectSettingsPluginManager->queryInterface( lang, &iface ); + if ( !iface ) + return; + csList = iface->projectSettings(); + customSettings.clear(); + +} + +void Project::setActive( bool b ) +{ + pixCollection->setActive( b ); +} + +void Project::addSourceFile( SourceFile *sf ) +{ + sourcefiles.append( sf ); + modified = TRUE; + emit sourceFileAdded( sf ); +} + + +SourceFile* Project::findSourceFile( const TQString& filename, SourceFile *ignore ) const +{ + TQPtrListIterator<SourceFile> it(sourcefiles); + while ( it.current() ) { + if ( it.current() != ignore && it.current()->fileName() == filename ) + return it.current(); + ++it; + } + return 0; +} + +FormFile* Project::findFormFile( const TQString& filename, FormFile *ignore ) const +{ + TQPtrListIterator<FormFile> it(formfiles); + while ( it.current() ) { + if ( it.current() != ignore && it.current()->fileName() == filename ) + return it.current(); + ++it; + } + return 0; +} + +void Project::setIncludePath( const TQString &platform, const TQString &path ) +{ + if ( inclPath[platform] == path ) + return; + inclPath.replace( platform, path ); + modified = TRUE; +} + +void Project::setLibs( const TQString &platform, const TQString &path ) +{ + lbs.replace( platform, path ); +} + +void Project::setDefines( const TQString &platform, const TQString &path ) +{ + defs.replace( platform, path ); +} + +void Project::setConfig( const TQString &platform, const TQString &config ) +{ + cfg.replace( platform, config ); +} + +TQString Project::config( const TQString &platform ) const +{ + return cfg[ platform ]; +} + +TQString Project::libs( const TQString &platform ) const +{ + return lbs[ platform ]; +} + +TQString Project::defines( const TQString &platform ) const +{ + return defs[ platform ]; +} + +TQString Project::includePath( const TQString &platform ) const +{ + return inclPath[ platform ]; +} + +TQString Project::templte() const +{ + return templ; +} + +void Project::setTemplate( const TQString &t ) +{ + templ = t; +} + +void Project::readPlatformSettings( const TQString &contents, + const TQString &setting, + TQMap<TQString, TQString> &res ) +{ + const TQString platforms[] = { "", "win32", "unix", "mac", TQString() }; + for ( int i = 0; platforms[ i ] != TQString(); ++i ) { + TQString p = platforms[ i ]; + if ( !p.isEmpty() ) + p += ":"; + TQStringList lst = parse_multiline_part( contents, p + setting ); + TQString s = lst.join( " " ); + TQString key = platforms[ i ]; + if ( key.isEmpty() ) + key = "(all)"; + res.replace( key, s ); + } +} + +void Project::removePlatformSettings( TQString &contents, const TQString &setting ) +{ + const TQString platforms[] = { "win32", "unix", "mac", "", TQString() }; + for ( int i = 0; platforms[ i ] != TQString(); ++i ) { + TQString p = platforms[ i ]; + if ( !p.isEmpty() ) + p += ":"; + remove_multiline_contents( contents, p + setting ); + } +} + +void Project::writePlatformSettings( TQString &contents, const TQString &setting, + const TQMap<TQString, TQString> &input ) +{ + const TQString platforms[] = { "", "win32", "unix", "mac", TQString() }; + int i; + LanguageInterface *iface = MetaDataBase::languageInterface( lang ); + if (iface && (setting == "SOURCES" || setting == "HEADERS")) // The (all) part will be saved later on + i = 1; + else + i = 0; + for (; platforms[ i ] != TQString(); ++i ) { + TQString p = platforms[ i ]; + if ( !p.isEmpty() ) + p += ":"; + TQString key = platforms[ i ]; + if ( key.isEmpty() ) + key = "(all)"; + TQMap<TQString, TQString>::ConstIterator it = input.find( key ); + if ( it == input.end() || (*it).isEmpty() ) + continue; + contents += p + setting + "\t+= " + *it + "\n"; + } +} + +void Project::addFormFile( FormFile *ff ) +{ + formfiles.append( ff ); + modified = TRUE; + emit formFileAdded( ff ); +} + +bool Project::removeFormFile( FormFile *ff ) +{ + if ( !formfiles.containsRef( ff ) ) + return FALSE; + if ( !ff->close() ) + return FALSE; + formfiles.removeRef( ff ); + modified = TRUE; + emit formFileRemoved( ff ); + return TRUE; +} + +void Project::addObject( TQObject *o ) +{ + bool wasModified = modified; + objs.append( o ); + FormFile *ff = new FormFile( "", FALSE, this, "qt_fakewindow" ); + ff->setFileName( "__APPOBJ" + TQString( o->name() ) + ".ui" ); + fakeFormFiles.insert( (void*)o, ff ); + MetaDataBase::addEntry( o ); + if ( hasGUI() ) { + TQWidget *parent = MainWindow::self ? MainWindow::self->qWorkspace() : 0; + FormWindow *fw = new FormWindow( ff, MainWindow::self, parent, "qt_fakewindow" ); + fw->setProject( this ); + if ( TQFile::exists( ff->absFileName() ) ) + Resource::loadExtraSource( ff, ff->absFileName(), + MetaDataBase::languageInterface( language() ), FALSE ); + if ( MainWindow::self ) + fw->setMainWindow( MainWindow::self ); + if ( MainWindow::self ) { + TQApplication::sendPostedEvents( MainWindow::self->qWorkspace(), TQEvent::ChildInserted ); + connect( fw, + TQT_SIGNAL( undoRedoChanged( bool, bool, const TQString &, const TQString & ) ), + MainWindow::self, + TQT_SLOT( updateUndoRedo( bool, bool, const TQString &, const TQString & ) ) + ); + } + if ( fw->parentWidget() ) { + fw->parentWidget()->setFixedSize( 1, 1 ); + fw->show(); + } + } else { + if ( TQFile::exists( ff->absFileName() ) ) + Resource::loadExtraSource( ff, ff->absFileName(), + MetaDataBase::languageInterface( language() ), FALSE ); + } + emit objectAdded( o ); + modified = wasModified; +} + +void Project::setObjects( const TQObjectList &ol ) +{ + for ( TQObjectListIt it( ol ); it.current(); ++it ) + addObject( it.current() ); +} + +void Project::removeObject( TQObject *o ) +{ + bool wasModified = modified; + objs.removeRef( o ); + MetaDataBase::removeEntry( o ); + fakeFormFiles.remove( (void*)o ); + emit objectRemoved( o ); + modified = wasModified; +} + +TQObjectList Project::objects() const +{ + return objs; +} + +FormFile *Project::fakeFormFileFor( TQObject *o ) const +{ + return fakeFormFiles.find( (void*)o ); +} + +TQObject *Project::objectForFakeForm( FormWindow *fw ) const +{ + for ( TQPtrDictIterator<FormFile> it( fakeFormFiles ); it.current(); ++it ) { + if ( it.current()->formWindow() == fw || + it.current() == fw->formFile() ) + return (TQObject*)it.currentKey(); + } + return 0; +} + +TQObject *Project::objectForFakeFormFile( FormFile *ff ) const +{ + for ( TQPtrDictIterator<FormFile> it( fakeFormFiles ); it.current(); ++it ) { + if ( it.current() == ff ) + return (TQObject*)it.currentKey(); + } + return 0; +} + +void Project::removeTempProject() +{ + if ( !singleProjectMode() ) + return; + TQDir d( TQFileInfo( filename ).dirPath() ); + if ( !d.exists( TQFileInfo( filename ).dirPath() ) ) + return; + TQStringList files = d.entryList( TQDir::Files ); + TQStringList::Iterator it; + for ( it = files.begin(); it != files.end(); ++it ) { + d.remove( *it ); + } + if ( d.exists( TQFileInfo( filename ).dirPath() + "/images" ) ) { + d = TQDir( TQFileInfo( filename ).dirPath() + "/images" ); + files = d.entryList( TQDir::Files ); + for ( it = files.begin(); it != files.end(); ++it ) + d.remove( *it ); + d = TQDir( TQFileInfo( filename ).dirPath() ); + d.remove( "images" ); + } + d.remove( TQFileInfo( filename ).dirPath() ); +#if defined(Q_OS_UNIX) + // ##### implement for all platforms, ideally should be in TQt + ::rmdir( TQFile::encodeName( d.absPath() ) ); +#endif +} + +void Project::addAndEditFunction( const TQString &function, const TQString &functionBody, bool openDeveloper ) +{ + for ( SourceFile *f = sourcefiles.first(); f; f = sourcefiles.next() ) { + if ( TQFileInfo( f->fileName() ).baseName() == "main" ) { + TQValueList<LanguageInterface::Function> funcs; + LanguageInterface *iface = MetaDataBase::languageInterface( language() ); + if ( !iface ) + return; + iface->functions( f->text(), &funcs ); + TQString func = function; + int i = func.find( '(' ); + if ( i != -1 ) + func = func.left( i ); + + bool found = FALSE; + for ( TQValueList<LanguageInterface::Function>::Iterator it = funcs.begin(); + it != funcs.end(); ++it ) { + if ( (*it).name.left( (*it).name.find( '(' ) ) == func ) { + found = TRUE; + break; + } + } + + if ( !found ) { + TQString code = f->text(); + if ( functionBody.isEmpty() ) + code += "\n\n" + iface->createFunctionStart( "", func, "", "" ) + "()\n{\n\n}\n"; + else + code += "\n\n" + iface->createFunctionStart( "", func, "", "" ) + + "()\n" + functionBody + "\n"; + f->setText( code ); + if ( f->editor() ) + f->editor()->refresh( FALSE ); + } + + if ( openDeveloper ) { + if ( MainWindow::self ) + MainWindow::self->editSource( f ); + f->editor()->setFunction( func, "" ); + } + + break; + } + } +} + +bool Project::hasParentObject( TQObject *o ) +{ + for ( TQObject *p = objs.first(); p; p = objs.next() ) { + TQObject *c = p->child( o->name(), o->className() ); + if ( c ) + return TRUE; + } + return FALSE; +} + +TQString Project::qualifiedName( TQObject *o ) +{ + TQString name = o->name(); + TQObject *p = o->parent(); + while ( p ) { + name.prepend( TQString( p->name() ) + "." ); + if ( objs.findRef( p ) != -1 ) + break; + p = p->parent(); + } + return name; +} + +bool Project::singleProjectMode() const +{ + return !MainWindow::self || MainWindow::self->singleProjectMode(); +} + +TQWidget *Project::messageBoxParent() const +{ + return MainWindow::self; +} + +void Project::designerCreated() +{ + for ( FormFile *ff = formfiles.first(); ff; ff = formfiles.next() ) { + FormWindow *fw = ff->formWindow(); + if ( !fw || fw->mainWindow() ) + continue; + fw->setMainWindow( MainWindow::self ); + connect( fw, TQT_SIGNAL( undoRedoChanged( bool, bool, const TQString &, + const TQString & ) ), + MainWindow::self, TQT_SLOT( updateUndoRedo( bool, bool, + const TQString &, const TQString & ) ) ); + fw->reparent( MainWindow::self->qWorkspace(), TQPoint( 0, 0 ), FALSE ); + TQApplication::sendPostedEvents( MainWindow::self->qWorkspace(), + TQEvent::ChildInserted ); + fw->parentWidget()->setFixedSize( 1, 1 ); + fw->show(); + } +} + +void Project::formOpened( FormWindow *fw ) +{ + if ( fw->isFake() ) + return; + emit newFormOpened( fw ); +} + +TQString Project::locationOfObject( TQObject *o ) +{ + if ( !o ) + return TQString(); + + if ( MainWindow::self ) { + TQWidgetList windows = MainWindow::self->qWorkspace()->windowList(); + for ( TQWidget *w = windows.first(); w; w = windows.next() ) { + FormWindow *fw = ::tqqt_cast<FormWindow*>(w); + SourceEditor *se = ::tqqt_cast<SourceEditor*>(w); + if ( fw ) { + if ( fw->isFake() ) + return objectForFakeForm( fw )->name() + TQString( " [Source]" ); + else + return fw->name() + TQString( " [Source]" ); + } else if ( se ) { + if ( !se->object() ) + continue; + if ( se->formWindow() ) + return se->formWindow()->name() + TQString( " [Source]" ); + else + return makeRelative( se->sourceFile()->fileName() ); + } + } + } + + if ( ::tqqt_cast<SourceFile*>(o) ) { + for ( TQPtrListIterator<SourceFile> sources = sourceFiles(); + sources.current(); ++sources ) { + SourceFile* f = sources.current(); + if ( f == o ) + return makeRelative( f->fileName() ); + } + } + + extern TQMap<TQWidget*, TQString> *qwf_forms; + if ( !qwf_forms ) { + tqWarning( "Project::locationOfObject: qwf_forms is NULL!" ); + return TQString(); + } + + TQString s = makeRelative( *qwf_forms->find( (TQWidget*)o ) ); + s += " [Source]"; + return s; +} + +bool Project::hasGUI() const +{ + return tqApp->type() != TQApplication::Tty; +} diff --git a/kdevdesigner/designer/project.h b/kdevdesigner/designer/project.h new file mode 100644 index 00000000..3e80428f --- /dev/null +++ b/kdevdesigner/designer/project.h @@ -0,0 +1,274 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PROJECT_H +#define PROJECT_H + +#include <tqfeatures.h> + +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqptrlist.h> +#include <tqmap.h> +#include <tqpluginmanager_p.h> +#include "../interfaces/projectsettingsiface.h" +#include "sourcefile.h" +#include "formfile.h" +#include <tqobjectlist.h> +#include <tqptrdict.h> +#include "formfile.h" + +class TQObjectList; +struct DesignerProject; +struct DesignerDatabase; +class PixmapCollection; +class Project; + +#ifndef TQT_NO_SQL +class TQSqlDatabase; + +class DatabaseConnection +{ +public: + DatabaseConnection( Project *p ) : +#ifndef TQT_NO_SQL + conn( 0 ), +#endif + project( p ), loaded( FALSE ), iface( 0 ) {} + ~DatabaseConnection(); + + bool refreshCatalog(); + bool open( bool suppressDialog = TRUE ); + void close(); + DesignerDatabase *iFace(); + + bool isLoaded() const { return loaded; } + void setName( const TQString& n ) { nm = n; } + TQString name() const { return nm; } + void setDriver( const TQString& d ) { drv = d; } + TQString driver() const { return drv; } + void setDatabase( const TQString& db ) { dbName = db; } + TQString database() const { return dbName; } + void setUsername( const TQString& u ) { uname = u; } + TQString username() const { return uname; } + void setPassword( const TQString& p ) { pword = p; } + TQString password() const { return pword; } + void setHostname( const TQString& h ) { hname = h; } + TQString hostname() const { return hname; } + void setPort( int p ) { prt = p; } + int port() const { return prt; } + TQString lastError() const { return dbErr; } + void addTable( const TQString& t ) { tbls.append(t); } + void setFields( const TQString& t, const TQStringList& f ) { flds[t] = f; } + TQStringList tables() const { return tbls; } + TQStringList fields( const TQString& t ) { return flds[t]; } + TQMap<TQString, TQStringList> fields() { return flds; } +#ifndef TQT_NO_SQL + TQSqlDatabase* connection() const { return conn; } + void remove(); +#endif + +private: + TQString nm; + TQString drv, dbName, uname, pword, hname; + TQString dbErr; + int prt; + TQStringList tbls; + TQMap<TQString, TQStringList> flds; +#ifndef TQT_NO_SQL + TQSqlDatabase *conn; +#endif + Project *project; + bool loaded; + DesignerDatabase *iface; +}; + +#endif + +class Project : public TQObject +{ + Q_OBJECT + + friend class DatabaseConnection; + +public: + Project( const TQString &fn, const TQString &pName = TQString(), + TQPluginManager<ProjectSettingsInterface> *pm = 0, bool isDummy = FALSE, + const TQString &l = "C++" ); + ~Project(); + + void setFileName( const TQString &fn, bool doClear = TRUE ); + TQString fileName( bool singlePro = FALSE ) const; + TQString projectName() const; + + void setDatabaseDescription( const TQString &db ); + TQString databaseDescription() const; + + void setDescription( const TQString &s ); + TQString description() const; + + void setLanguage( const TQString &l ); + TQString language() const; + + + bool isValid() const; + + // returns TRUE if this project is the <No Project> project + bool isDummy() const; + + TQString makeAbsolute( const TQString &f ); + TQString makeRelative( const TQString &f ); + + void save( bool onlyProjectFile = FALSE ); + +#ifndef TQT_NO_SQL + TQPtrList<DatabaseConnection> databaseConnections() const; + void setDatabaseConnections( const TQPtrList<DatabaseConnection> &lst ); + void addDatabaseConnection( DatabaseConnection *conn ); + void removeDatabaseConnection( const TQString &conn ); + DatabaseConnection *databaseConnection( const TQString &name ); + TQStringList databaseConnectionList(); + TQStringList databaseTableList( const TQString &connection ); + TQStringList databaseFieldList( const TQString &connection, const TQString &table ); +#endif + void saveConnections(); + void loadConnections(); + + bool openDatabase( const TQString &connection, bool suppressDialog = TRUE ); + void closeDatabase( const TQString &connection ); + + TQObjectList *formList( bool resolveFakeObjects = FALSE ) const; + + DesignerProject *iFace(); + + void setCustomSetting( const TQString &key, const TQString &value ); + TQString customSetting( const TQString &key ) const; + + PixmapCollection *pixmapCollection() const { return pixCollection; } + + void setActive( bool b ); + + TQPtrListIterator<SourceFile> sourceFiles() const { return TQPtrListIterator<SourceFile>(sourcefiles); } + void addSourceFile( SourceFile *sf ); + bool removeSourceFile( SourceFile *sf ); + SourceFile* findSourceFile( const TQString& filename, SourceFile *ignore = 0 ) const; + + TQPtrListIterator<FormFile> formFiles() const { return TQPtrListIterator<FormFile>(formfiles); } + void addFormFile( FormFile *ff ); + bool removeFormFile( FormFile *ff ); + FormFile* findFormFile( const TQString& filename, FormFile *ignore = 0 ) const; + + void setIncludePath( const TQString &platform, const TQString &path ); + void setLibs( const TQString &platform, const TQString &path ); + void setDefines( const TQString &platform, const TQString &path ); + void setConfig( const TQString &platform, const TQString &config ); + void setTemplate( const TQString &t ); + + TQString config( const TQString &platform ) const; + TQString libs( const TQString &platform ) const; + TQString defines( const TQString &platform ) const; + TQString includePath( const TQString &platform ) const; + TQString templte() const; + + bool isModified() const { return !isDummy() && modified; } + void setModified( bool b ); + + void addObject( TQObject *o ); + void setObjects( const TQObjectList &ol ); + void removeObject( TQObject *o ); + TQObjectList objects() const; + FormFile *fakeFormFileFor( TQObject *o ) const; + TQObject *objectForFakeForm( FormWindow *fw ) const; + TQObject *objectForFakeFormFile( FormFile *ff ) const; + + void addAndEditFunction( const TQString &functionName, const TQString &functionBody, + bool openDeveloper ); + + void removeTempProject(); + bool hasParentObject( TQObject *o ); + TQString qualifiedName( TQObject *o ); + + bool isCpp() const { return is_cpp; } + + void designerCreated(); + + void formOpened( FormWindow *fw ); + + TQString locationOfObject( TQObject *o ); + + bool hasGUI() const; + +signals: + void projectModified(); + void sourceFileAdded( SourceFile* ); + void sourceFileRemoved( SourceFile* ); + void formFileAdded( FormFile* ); + void formFileRemoved( FormFile* ); + void objectAdded( TQObject * ); + void objectRemoved( TQObject * ); + void newFormOpened( FormWindow *fw ); + +private: + void parse(); + void clear(); + void updateCustomSettings(); + void readPlatformSettings( const TQString &contents, + const TQString &setting, + TQMap<TQString, TQString> &res ); + void removePlatformSettings( TQString &contents, const TQString &setting ); + void writePlatformSettings( TQString &contents, const TQString &setting, + const TQMap<TQString, TQString> &input ); + bool singleProjectMode() const; + TQWidget *messageBoxParent() const; + +private: + TQString filename; + TQString proName; + TQString desc; + TQString dbFile; +#ifndef TQT_NO_SQL + TQPtrList<DatabaseConnection> dbConnections; +#endif + TQString lang; + DesignerProject *iface; + TQMap<TQString, TQString> customSettings; + TQStringList csList; + TQPluginManager<ProjectSettingsInterface> *projectSettingsPluginManager; + PixmapCollection *pixCollection; + TQPtrList<SourceFile> sourcefiles; + TQPtrList<FormFile> formfiles; + TQMap<TQString, TQString> inclPath, defs, lbs, cfg, sources, headers; + TQString templ; + bool isDummyProject; + bool modified; + TQObjectList objs; + TQPtrDict<FormFile> fakeFormFiles; + TQString singleProFileName; + bool is_cpp; + +}; + +#endif diff --git a/kdevdesigner/designer/projectsettings.ui b/kdevdesigner/designer/projectsettings.ui new file mode 100644 index 00000000..d606a521 --- /dev/null +++ b/kdevdesigner/designer/projectsettings.ui @@ -0,0 +1,301 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ProjectSettingsBase</class> +<comment>********************************************************************* +** Copyright (C) 2001-2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ProjectSettingsBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>375</width> + <height>224</height> + </rect> + </property> + <property name="caption"> + <string>Project Settings</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTabWidget"> + <property name="name"> + <cstring>tabWidget</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>tabSettings</cstring> + </property> + <attribute name="title"> + <string>&Settings</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>&Project file:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editProjectFile</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel1_3</cstring> + </property> + <property name="text"> + <string>&Language:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboLanguage</cstring> + </property> + </widget> + <widget class="TQToolButton" row="2" column="2"> + <property name="name"> + <cstring>buttonDatabaseFile_2</cstring> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + <widget class="KLineEdit" row="2" column="1"> + <property name="name"> + <cstring>editDatabaseFile</cstring> + </property> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel1_2_2_2</cstring> + </property> + <property name="text"> + <string>&Database file:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editDatabaseFile</cstring> + </property> + </widget> + <widget class="TQComboBox" row="1" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>comboLanguage</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLayoutWidget" row="0" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="KLineEdit"> + <property name="name"> + <cstring>editProjectFile</cstring> + </property> + </widget> + <widget class="TQToolButton"> + <property name="name"> + <cstring>buttonProject</cstring> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </hbox> + </widget> + <spacer row="4" column="1"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>21</width> + <height>71</height> + </size> + </property> + </spacer> + </grid> + </widget> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>buttonProject</sender> + <signal>clicked()</signal> + <receiver>ProjectSettingsBase</receiver> + <slot>chooseProjectFile()</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>ProjectSettingsBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>ProjectSettingsBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>buttonHelp</sender> + <signal>clicked()</signal> + <receiver>ProjectSettingsBase</receiver> + <slot>helpClicked()</slot> + </connection> + <connection> + <sender>comboLanguage</sender> + <signal>activated(const TQString&)</signal> + <receiver>ProjectSettingsBase</receiver> + <slot>languageChanged(const TQString&)</slot> + </connection> +</connections> +<tabstops> + <tabstop>tabWidget</tabstop> + <tabstop>editProjectFile</tabstop> + <tabstop>comboLanguage</tabstop> + <tabstop>buttonHelp</tabstop> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> +</tabstops> +<Q_SLOTS> + <slot access="protected">chooseDatabaseFile()</slot> + <slot access="protected">chooseProjectFile()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">helpClicked()</slot> + <slot access="protected">init()</slot> + <slot access="protected">languageChanged( const TQString & )</slot> + <slot access="protected">okClicked()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/projectsettingsimpl.cpp b/kdevdesigner/designer/projectsettingsimpl.cpp new file mode 100644 index 00000000..99bb800d --- /dev/null +++ b/kdevdesigner/designer/projectsettingsimpl.cpp @@ -0,0 +1,126 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "projectsettingsimpl.h" +#include "project.h" +#include "formwindow.h" +#include "metadatabase.h" +#include "mainwindow.h" +#include "asciivalidator.h" +#include "mainwindow.h" +#include "sourcefile.h" +#include "workspace.h" + +#include <tdefiledialog.h> +#include <tdelocale.h> +#include <klineedit.h> + +#include <tqtextedit.h> +#include <tqcheckbox.h> +#include <tqfiledialog.h> +#include <tqcombobox.h> +#include <tqobjectlist.h> +#include <tqheader.h> +#include <tqpushbutton.h> +#include <tqlabel.h> + +/* + * Constructs a ProjectSettings which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +ProjectSettings::ProjectSettings( Project *pro, TQWidget* parent, const char* name, bool modal, WFlags fl ) + : ProjectSettingsBase( parent, name, modal, fl ), project( pro ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + + editProjectFile->setFocus(); + + if ( project->isDummy() ) { + editProjectFile->setEnabled( FALSE ); + editProjectFile->setText( project->projectName() ); + } else { + if ( project->fileName().isEmpty() || project->fileName() == ".pro" ) { + editProjectFile->setText( tr( "unnamed.pro" ) ); + editProjectFile->selectAll(); + } else { + editProjectFile->setText( project->fileName() ); + } + } + + editDatabaseFile->setText( project->databaseDescription() ); + + comboLanguage->insertStringList( MetaDataBase::languages() ); + for ( int j = 0; j < (int)comboLanguage->count(); ++j ) { + if ( project->language() == comboLanguage->text( j ) ) { + comboLanguage->setCurrentItem( j ); + break; + } + } +} + +/* + * Destroys the object and frees any allocated resources + */ +ProjectSettings::~ProjectSettings() +{ +} + +void ProjectSettings::chooseDatabaseFile() +{ + TQString fn = KFileDialog::getSaveFileName( editDatabaseFile->text(), i18n( "*.db|Database Files\n*|All Files" ), this ); + if ( fn.isEmpty() ) + return; + editDatabaseFile->setText( fn ); +} + +void ProjectSettings::chooseProjectFile() +{ + TQString fn = KFileDialog::getSaveFileName( editDatabaseFile->text(), i18n( "*.pro|Project Files\n*|All Files" ), this ); + if ( fn.isEmpty() ) + return; + editProjectFile->setText( fn ); +} + +void ProjectSettings::helpClicked() +{ +} + +void ProjectSettings::okClicked() +{ + // ### check for validity + project->setFileName( editProjectFile->text(), FALSE ); + project->setDatabaseDescription( editDatabaseFile->text() ); + project->setLanguage( comboLanguage->text( comboLanguage->currentItem() ) ); + project->setModified( TRUE ); + accept(); +} + +void ProjectSettings::languageChanged( const TQString & ) +{ +} diff --git a/kdevdesigner/designer/projectsettingsimpl.h b/kdevdesigner/designer/projectsettingsimpl.h new file mode 100644 index 00000000..c1b7fb0c --- /dev/null +++ b/kdevdesigner/designer/projectsettingsimpl.h @@ -0,0 +1,57 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PROJECTSETTINGSIMPL_H +#define PROJECTSETTINGSIMPL_H + +#include "projectsettings.h" + +class Project; +class TQListViewItem; +class FormWindow; +class SourceFile; + +class ProjectSettings : public ProjectSettingsBase +{ + Q_OBJECT + + +public: + ProjectSettings( Project *pro, TQWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~ProjectSettings(); + +protected slots: + void chooseDatabaseFile(); + void chooseProjectFile(); + void helpClicked(); + void okClicked(); + void languageChanged( const TQString &lang ); + +private: + Project *project; +}; + +#endif diff --git a/kdevdesigner/designer/propertyeditor.cpp b/kdevdesigner/designer/propertyeditor.cpp new file mode 100644 index 00000000..e7a5d387 --- /dev/null +++ b/kdevdesigner/designer/propertyeditor.cpp @@ -0,0 +1,4332 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler needs this here + +#include "propertyeditor.h" +#include "formwindow.h" +#include "command.h" +#include "metadatabase.h" +#include "propertyobject.h" +#include <widgetdatabase.h> +#include "widgetfactory.h" +#include "globaldefs.h" +#include "defs.h" +#include "asciivalidator.h" +#include "paletteeditorimpl.h" +#include "multilineeditorimpl.h" +#include "mainwindow.h" +#include "project.h" +#include "hierarchyview.h" +#include "database.h" +#include "menubareditor.h" + +#include <kdebug.h> +#include <kiconloader.h> +#include <tdelocale.h> +#include "kdevdesigner_part.h" + +#include <tqpainter.h> +#include <tqpalette.h> +#include <tqapplication.h> +#include <tqheader.h> +#include <tqlineedit.h> +#include <tqstrlist.h> +#include <tqmetaobject.h> +#include <tqcombobox.h> +#include <tqpushbutton.h> +#include <tqhbox.h> +#include <tqfontdialog.h> +#include <tqspinbox.h> +#include <tqevent.h> +#include <tqobjectlist.h> +#include <tqlistbox.h> +#include <tqfontdatabase.h> +#include <tqcolor.h> +#include <tqcolordialog.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqsizepolicy.h> +#include <tqbitmap.h> +#include <tqtooltip.h> +#include <tqwhatsthis.h> +#include <tqaccel.h> +#include <tqworkspace.h> +#include <tqtimer.h> +#include <tqdragobject.h> +#include <tqdom.h> +#include <tqprocess.h> +#include <tqstyle.h> +#include <tqdatetimeedit.h> +#include <tqassistantclient.h> +#include <tqdrawutil.h> +#include <tqmultilineedit.h> // FIXME: obsolete +#include <tqsplitter.h> +#include <tqdatatable.h> +#include <tqtextview.h> + +#include <limits.h> + + +static TQFontDatabase *fontDataBase = 0; +TQString assistantPath(); + +#ifdef TQ_WS_MAC +#include <tqwindowsstyle.h> +static void setupStyle(TQWidget *w) +{ + static TQStyle *windowsStyle = 0; + if(!windowsStyle) + windowsStyle = new TQWindowsStyle; + w->setStyle(windowsStyle); +} +#else +#define setupStyle(x) +#endif + +static void cleanupFontDatabase() +{ + delete fontDataBase; + fontDataBase = 0; +} + +static TQStringList getFontList() +{ + if ( !fontDataBase ) { + fontDataBase = new TQFontDatabase; + tqAddPostRoutine( cleanupFontDatabase ); + } + return fontDataBase->families(); +} + + +class PropertyWhatsThis : public TQWhatsThis +{ +public: + PropertyWhatsThis( PropertyList *l ); + TQString text( const TQPoint &pos ); + bool clicked( const TQString& href ); + +private: + PropertyList *propertyList; + +}; + +PropertyWhatsThis::PropertyWhatsThis( PropertyList *l ) + : TQWhatsThis( l->viewport() ), propertyList( l ) +{ +} + +TQString PropertyWhatsThis::text( const TQPoint &pos ) +{ + return propertyList->whatsThisAt( pos ); +} + +bool PropertyWhatsThis::clicked( const TQString& href ) +{ + if ( !href.isEmpty() ) { + TQAssistantClient *ac = MainWindow::self->assistantClient(); + ac->showPage( TQString( tqInstallPathDocs() ) + "/html/" + href ); + } + return FALSE; // do not hide window +} + + +/*! + \class PropertyItem propertyeditor.h + \brief Base class for all property items + + This is the base class for each property item for the + PropertyList. A simple property item has just a name and a value to + provide an editor for a datatype. But more complex datatypes might + provide an expandable item for editing single parts of the + datatype. See hasSubItems(), initChildren() for that. +*/ + +/*! If this item should be a child of another property item, specify + \a prop as the parent item. +*/ + +PropertyItem::PropertyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ) + : TQListViewItem( l, after ), listview( l ), property( prop ), propertyName( propName ) +{ + setSelectable( FALSE ); + open = FALSE; + setText( 0, propertyName ); + changed = FALSE; + setText( 1, "" ); + resetButton = 0; +} + +PropertyItem::~PropertyItem() +{ + if ( resetButton ) + delete resetButton->parentWidget(); + resetButton = 0; +} + +void PropertyItem::toggle() +{ +} + +void PropertyItem::updateBackColor() +{ + if ( itemAbove() && this != listview->firstChild() ) { + if ( ( ( PropertyItem*)itemAbove() )->backColor == *backColor1 ) + backColor = *backColor2; + else + backColor = *backColor1; + } else { + backColor = *backColor1; + } + if ( listview->firstChild() == this ) + backColor = *backColor1; +} + +TQColor PropertyItem::backgroundColor() +{ + updateBackColor(); + if ( (TQListViewItem*)this == listview->currentItem() ) + return *selectedBack; + return backColor; +} + +/*! If a subclass is a expandable item, this is called when the child +items should be created. +*/ + +void PropertyItem::createChildren() +{ +} + +/*! If a subclass is a expandable item, this is called when the child +items should be initialized. +*/ + +void PropertyItem::initChildren() +{ +} + +void PropertyItem::paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align ) +{ + TQColorGroup g( cg ); + g.setColor( TQColorGroup::Base, backgroundColor() ); + g.setColor( TQColorGroup::Foreground, TQt::black ); + g.setColor( TQColorGroup::Text, TQt::black ); + int indent = 0; + if ( column == 0 ) { + indent = 20 + ( property ? 20 : 0 ); + p->fillRect( 0, 0, width, height(), backgroundColor() ); + p->save(); + p->translate( indent, 0 ); + } + + if ( isChanged() && column == 0 ) { + p->save(); + TQFont f = p->font(); + f.setBold( TRUE ); + p->setFont( f ); + } + + if ( !hasCustomContents() || column != 1 ) { + TQListViewItem::paintCell( p, g, column, width - indent, align ); + } else { + p->fillRect( 0, 0, width, height(), backgroundColor() ); + drawCustomContents( p, TQRect( 0, 0, width, height() ) ); + } + + if ( isChanged() && column == 0 ) + p->restore(); + if ( column == 0 ) + p->restore(); + if ( hasSubItems() && column == 0 ) { + p->save(); + p->setPen( cg.foreground() ); + p->setBrush( cg.base() ); + p->drawRect( 5, height() / 2 - 4, 9, 9 ); + p->drawLine( 7, height() / 2, 11, height() / 2 ); + if ( !isOpen() ) + p->drawLine( 9, height() / 2 - 2, 9, height() / 2 + 2 ); + p->restore(); + } + p->save(); + p->setPen( TQPen( cg.dark(), 1 ) ); + p->drawLine( 0, height() - 1, width, height() - 1 ); + p->drawLine( width - 1, 0, width - 1, height() ); + p->restore(); + + if ( listview->currentItem() == this && column == 0 && + !listview->hasFocus() && !listview->viewport()->hasFocus() ) + paintFocus( p, cg, TQRect( 0, 0, width, height() ) ); +} + +void PropertyItem::paintBranches( TQPainter * p, const TQColorGroup & cg, + int w, int y, int h ) +{ + TQColorGroup g( cg ); + g.setColor( TQColorGroup::Base, backgroundColor() ); + TQListViewItem::paintBranches( p, g, w, y, h ); +} + +void PropertyItem::paintFocus( TQPainter *p, const TQColorGroup &cg, const TQRect &r ) +{ + p->save(); + TQApplication::style().tqdrawPrimitive(TQStyle::PE_Panel, p, r, cg, + TQStyle::Style_Sunken, TQStyleOption(1,1) ); + p->restore(); +} + +/*! Subclasses which are expandable items have to return TRUE + here. Default is FALSE. +*/ + +bool PropertyItem::hasSubItems() const +{ + return FALSE; +} + +/*! Returns the parent property item here if this is a child or 0 + otherwise. + */ + +PropertyItem *PropertyItem::propertyParent() const +{ + return property; +} + +bool PropertyItem::isOpen() const +{ + return open; +} + +void PropertyItem::setOpen( bool b ) +{ + if ( b == open ) + return; + open = b; + + if ( !open ) { + children.setAutoDelete( TRUE ); + children.clear(); + children.setAutoDelete( FALSE ); + tqApp->processEvents(); + listview->updateEditorSize(); + return; + } + + createChildren(); + initChildren(); + tqApp->processEvents(); + listview->updateEditorSize(); +} + +/*! Subclasses have to show the editor of the item here +*/ + +void PropertyItem::showEditor() +{ + createResetButton(); + resetButton->parentWidget()->show(); +} + +/*! Subclasses have to hide the editor of the item here +*/ + +void PropertyItem::hideEditor() +{ + createResetButton(); + resetButton->parentWidget()->hide(); +} + +/*! This is called to init the value of the item. Reimplement in + subclasses to init the editor +*/ + +void PropertyItem::setValue( const TQVariant &v ) +{ + val = v; +} + +TQVariant PropertyItem::value() const +{ + return val; +} + +bool PropertyItem::isChanged() const +{ + return changed; +} + +void PropertyItem::setChanged( bool b, bool updateDb ) +{ + if ( propertyParent() ) + return; + if ( changed == b ) + return; + changed = b; + repaint(); + if ( updateDb ) { + MetaDataBase::setPropertyChanged( listview->propertyEditor()->widget(), name(), changed ); + } + updateResetButtonState(); +} + +TQString PropertyItem::name() const +{ + return propertyName; +} + +void PropertyItem::createResetButton() +{ + if ( resetButton ) { + resetButton->parentWidget()->lower(); + return; + } + const TQPixmap DesignerResetPix = SmallIcon( "designer_resetproperty.png" , KDevDesignerPartFactory::instance()); + + TQHBox *hbox = new TQHBox( listview->viewport() ); + hbox->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + hbox->setLineWidth( 1 ); + resetButton = new TQPushButton( hbox ); + setupStyle( resetButton ); + resetButton->setPixmap( DesignerResetPix ); + resetButton->setFixedWidth( resetButton->sizeHint().width() ); + hbox->layout()->setAlignment( TQt::AlignRight ); + listview->addChild( hbox ); + hbox->hide(); + TQObject::connect( resetButton, TQT_SIGNAL( clicked() ), + listview, TQT_SLOT( resetProperty() ) ); + TQToolTip::add( resetButton, i18n( "Reset the property to its default value" ) ); + TQWhatsThis::add( resetButton, i18n( "Click this button to reset the property to its default value" ) ); + updateResetButtonState(); +} + +void PropertyItem::updateResetButtonState() +{ + if ( !resetButton ) + return; + if ( propertyParent() || !WidgetFactory::canResetProperty( listview->propertyEditor()->widget(), name() ) ) + resetButton->setEnabled( FALSE ); + else + resetButton->setEnabled( isChanged() ); +} + +/*! Call this to place/resize the item editor correctly (normally + call it from showEditor()) +*/ + +void PropertyItem::placeEditor( TQWidget *w ) +{ + createResetButton(); + TQRect r = listview->itemRect( this ); + if ( !r.size().isValid() ) { + listview->ensureItemVisible( this ); +#if defined(TQ_WS_WIN) + listview->repaintContents( FALSE ); +#endif + r = listview->itemRect( this ); + } + r.setX( listview->header()->sectionPos( 1 ) ); + r.setWidth( listview->header()->sectionSize( 1 ) - 1 ); + r.setWidth( r.width() - resetButton->width() - 2 ); + r = TQRect( listview->viewportToContents( r.topLeft() ), r.size() ); + w->resize( r.size() ); + listview->moveChild( w, r.x(), r.y() ); + resetButton->parentWidget()->resize( resetButton->sizeHint().width() + 10, r.height() ); + listview->moveChild( resetButton->parentWidget(), r.x() + r.width() - 8, r.y() ); + resetButton->setFixedHeight( TQMAX( 0, r.height() - 3 ) ); +} + +/*! This should be called by subclasses if the user changed the value + of the property and this value should be applied to the widget property +*/ + +void PropertyItem::notifyValueChange() +{ + if ( !propertyParent() ) { + listview->valueChanged( this ); + setChanged( TRUE ); + if ( hasSubItems() ) + initChildren(); + } else { + propertyParent()->childValueChanged( this ); + setChanged( TRUE ); + } +} + +/*! If a subclass is a expandable item reimplement this as this is + always called if a child item changed its value. So update the + display of the item here then. +*/ + +void PropertyItem::childValueChanged( PropertyItem * ) +{ +} + +/*! When adding a child item, call this (normally from addChildren() +*/ + +void PropertyItem::addChild( PropertyItem *i ) +{ + children.append( i ); +} + +int PropertyItem::childCount() const +{ + return children.count(); +} + +PropertyItem *PropertyItem::child( int i ) const +{ + // ARRRRRRRRG + return ( (PropertyItem*)this )->children.at( i ); +} + +/*! If the contents of the item is not displayable with a text, but + you want to draw it yourself (using drawCustomContents()), return + TRUE here. +*/ + +bool PropertyItem::hasCustomContents() const +{ + return FALSE; +} + +/*! + \sa hasCustomContents() +*/ + +void PropertyItem::drawCustomContents( TQPainter *, const TQRect & ) +{ +} + +TQString PropertyItem::currentItem() const +{ + return TQString(); +} + +int PropertyItem::currentIntItem() const +{ + return -1; +} + +void PropertyItem::setCurrentItem( const TQString & ) +{ +} + +void PropertyItem::setCurrentItem( int ) +{ +} + +int PropertyItem::currentIntItemFromObject() const +{ + return -1; +} + +TQString PropertyItem::currentItemFromObject() const +{ + return TQString(); +} + +void PropertyItem::setFocus( TQWidget *w ) +{ + if ( !tqApp->focusWidget() || + listview->propertyEditor()->formWindow() && + ( !MainWindow::self->isAFormWindowChild( TQT_TQOBJECT(tqApp->focusWidget()) ) && + !tqApp->focusWidget()->inherits( "Editor" ) ) ) + w->setFocus(); +} + +void PropertyItem::setText( int col, const TQString &t ) +{ + TQString txt( t ); + if ( col == 1 ) + txt = txt.replace( "\n", " " ); + TQListViewItem::setText( col, txt ); +} + +// -------------------------------------------------------------- + +PropertyTextItem::PropertyTextItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool comment, bool multiLine, bool ascii, bool a ) + : PropertyItem( l, after, prop, propName ), withComment( comment ), + hasMultiLines( multiLine ), asciiOnly( ascii ), accel( a ) +{ + lin = 0; + box = 0; +} + +TQLineEdit *PropertyTextItem::lined() +{ + if ( lin ) + return lin; + if ( hasMultiLines ) { + box = new TQHBox( listview->viewport() ); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setLineWidth( 2 ); + box->hide(); + } + + lin = 0; + if ( hasMultiLines ) + lin = new TQLineEdit( box ); + else + lin = new TQLineEdit( listview->viewport() ); + + if ( asciiOnly ) { + if ( PropertyItem::name() == "name" ) { + lin->setValidator( new AsciiValidator( TQString(":"), TQT_TQOBJECT(lin), "ascii_validator" ) ); + if ( listview->propertyEditor()->formWindow()->isFake() ) + lin->setEnabled( FALSE ); + } else { + lin->setValidator( new AsciiValidator( TQString("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" + "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9" + "\xaa\xab\xac\xad\xae\xaf\xb1\xb2\xb3" + "\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc" + "\xbd\xbe\xbf"), TQT_TQOBJECT(lin), "ascii_validator" ) ); + } + } if ( !hasMultiLines ) { + lin->hide(); + } else { + button = new TQPushButton( "...", box ); + setupStyle( button ); + button->setFixedWidth( 20 ); + connect( button, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( getText() ) ); + lin->setFrame( FALSE ); + } + connect( lin, TQT_SIGNAL( returnPressed() ), + this, TQT_SLOT( setValue() ) ); + connect( lin, TQT_SIGNAL( textChanged( const TQString & ) ), + this, TQT_SLOT( setValue() ) ); + if ( PropertyItem::name() == "name" || PropertyItem::name() == "itemName" ) + connect( lin, TQT_SIGNAL( returnPressed() ), + listview->propertyEditor()->formWindow()->commandHistory(), + TQT_SLOT( checkCompressedCommand() ) ); + lin->installEventFilter( listview ); + return lin; +} + +PropertyTextItem::~PropertyTextItem() +{ + delete (TQLineEdit*)lin; + lin = 0; + delete (TQHBox*)box; + box = 0; +} + +void PropertyTextItem::setChanged( bool b, bool updateDb ) +{ + PropertyItem::setChanged( b, updateDb ); + if ( withComment && childCount() > 0 ) + ( (PropertyTextItem*)PropertyItem::child( 0 ) )->lined()->setEnabled( b ); +} + +bool PropertyTextItem::hasSubItems() const +{ + return withComment; +} + +void PropertyTextItem::childValueChanged( PropertyItem *child ) +{ + if ( PropertyItem::name() != "name" ) + MetaDataBase::setPropertyComment( listview->propertyEditor()->widget(), + PropertyItem::name(), child->value().toString() ); + else + MetaDataBase::setExportMacro( listview->propertyEditor()->widget(), child->value().toString() ); + listview->propertyEditor()->formWindow()->commandHistory()->setModified( TRUE ); +} + +void PropertyTextItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !lin || lin->text().length() == 0 ) { + lined()->blockSignals( TRUE ); + lined()->setText( value().toString() ); + lined()->blockSignals( FALSE ); + } + + TQWidget* w; + if ( hasMultiLines ) + w = box; + else + w= lined(); + + placeEditor( w ); + if ( !w->isVisible() || !lined()->hasFocus() ) { + w->show(); + setFocus( lined() ); + } +} + +void PropertyTextItem::createChildren() +{ + PropertyTextItem *i = new PropertyTextItem( listview, this, this, + PropertyItem::name() == "name" ? + "export macro" : "comment", FALSE, FALSE, + PropertyItem::name() == "name" ); + i->lined()->setEnabled( isChanged() ); + addChild( i ); +} + +void PropertyTextItem::initChildren() +{ + if ( !childCount() ) + return; + PropertyItem *item = PropertyItem::child( 0 ); + if ( item ) { + if ( PropertyItem::name() != "name" ) + item->setValue( MetaDataBase::propertyComment( listview->propertyEditor()->widget(), + PropertyItem::name() ) ); + else + item->setValue( MetaDataBase::exportMacro( listview->propertyEditor()->widget() ) ); + } +} + +void PropertyTextItem::hideEditor() +{ + PropertyItem::hideEditor(); + TQWidget* w; + if ( hasMultiLines ) + w = box; + else + w = lined(); + + w->hide(); +} + +void PropertyTextItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + if ( lin ) { + lined()->blockSignals( TRUE ); + int oldCursorPos; + oldCursorPos = lin->cursorPosition(); + lined()->setText( v.toString() ); + if ( oldCursorPos < (int)lin->text().length() ) + lin->setCursorPosition( oldCursorPos ); + lined()->blockSignals( FALSE ); + } + setText( 1, v.toString() ); + PropertyItem::setValue( v ); +} + +void PropertyTextItem::setValue() +{ + setText( 1, lined()->text() ); + TQVariant v; + if ( accel ) { + v = TQVariant( TQKeySequence( lined()->text() ) ); + if ( v.toString().isNull() ) + return; // not yet valid input + } else { + v = lined()->text(); + } + PropertyItem::setValue( v ); + notifyValueChange(); +} + +void PropertyTextItem::getText() +{ + bool richText = !::tqqt_cast<TQButton*>(listview->propertyEditor()->widget()) || + ( text( 0 ) == "whatsThis" ); + bool doWrap = FALSE; + TQString txt = MultiLineEditor::getText( listview, value().toString(), richText, &doWrap ); + if ( !txt.isEmpty() ) { + setText( 1, txt ); + PropertyItem::setValue( txt ); + notifyValueChange(); + lined()->blockSignals( TRUE ); + lined()->setText( txt ); + lined()->blockSignals( FALSE ); + } +} + +// -------------------------------------------------------------- + +PropertyDoubleItem::PropertyDoubleItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + lin = 0; +} + +TQLineEdit *PropertyDoubleItem::lined() +{ + if ( lin ) + return lin; + lin = new TQLineEdit( listview->viewport() ); + lin->setValidator( new TQDoubleValidator( TQT_TQOBJECT(lin), "double_validator" ) ); + + connect( lin, TQT_SIGNAL( returnPressed() ), + this, TQT_SLOT( setValue() ) ); + connect( lin, TQT_SIGNAL( textChanged( const TQString & ) ), + this, TQT_SLOT( setValue() ) ); + lin->installEventFilter( listview ); + return lin; +} + +PropertyDoubleItem::~PropertyDoubleItem() +{ + delete (TQLineEdit*)lin; + lin = 0; +} + +void PropertyDoubleItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !lin ) { + lined()->blockSignals( TRUE ); + lined()->setText( TQString::number( value().toDouble() ) ); + lined()->blockSignals( FALSE ); + } + TQWidget* w = lined(); + + placeEditor( w ); + if ( !w->isVisible() || !lined()->hasFocus() ) { + w->show(); + setFocus( lined() ); + } +} + + +void PropertyDoubleItem::hideEditor() +{ + PropertyItem::hideEditor(); + TQWidget* w = lined(); + w->hide(); +} + +void PropertyDoubleItem::setValue( const TQVariant &v ) +{ + if ( value() == v ) + return; + if ( lin ) { + lined()->blockSignals( TRUE ); + int oldCursorPos; + oldCursorPos = lin->cursorPosition(); + lined()->setText( TQString::number( v.toDouble() ) ); + if ( oldCursorPos < (int)lin->text().length() ) + lin->setCursorPosition( oldCursorPos ); + lined()->blockSignals( FALSE ); + } + setText( 1, TQString::number( v.toDouble() ) ); + PropertyItem::setValue( v ); +} + +void PropertyDoubleItem::setValue() +{ + setText( 1, lined()->text() ); + TQVariant v = lined()->text().toDouble(); + PropertyItem::setValue( v ); + notifyValueChange(); +} + + +// -------------------------------------------------------------- + +PropertyDateItem::PropertyDateItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + lin = 0; +} + +TQDateEdit *PropertyDateItem::lined() +{ + if ( lin ) + return lin; + lin = new TQDateEdit( listview->viewport() ); + TQObjectList *l = lin->queryList( TQLINEEDIT_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) + o->installEventFilter( listview ); + delete l; + connect( lin, TQT_SIGNAL( valueChanged( const TQDate & ) ), + this, TQT_SLOT( setValue() ) ); + return lin; +} + +PropertyDateItem::~PropertyDateItem() +{ + delete (TQDateEdit*)lin; + lin = 0; +} + +void PropertyDateItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !lin ) { + lined()->blockSignals( TRUE ); + lined()->setDate( value().toDate() ); + lined()->blockSignals( FALSE ); + } + placeEditor( lin ); + if ( !lin->isVisible() ) { + lin->show(); + setFocus( lin ); + } +} + +void PropertyDateItem::hideEditor() +{ + PropertyItem::hideEditor(); + if ( lin ) + lin->hide(); +} + +void PropertyDateItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + if ( lin ) { + lined()->blockSignals( TRUE ); + if ( lined()->date() != v.toDate() ) + lined()->setDate( v.toDate() ); + lined()->blockSignals( FALSE ); + } + setText( 1, v.toDate().toString( ::Qt::ISODate ) ); + PropertyItem::setValue( v ); +} + +void PropertyDateItem::setValue() +{ + setText( 1, lined()->date().toString( ::Qt::ISODate ) ); + TQVariant v; + v = lined()->date(); + PropertyItem::setValue( v ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyTimeItem::PropertyTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + lin = 0; +} + +TQTimeEdit *PropertyTimeItem::lined() +{ + if ( lin ) + return lin; + lin = new TQTimeEdit( listview->viewport() ); + connect( lin, TQT_SIGNAL( valueChanged( const TQTime & ) ), + this, TQT_SLOT( setValue() ) ); + TQObjectList *l = lin->queryList( TQLINEEDIT_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) + o->installEventFilter( listview ); + delete l; + return lin; +} + +PropertyTimeItem::~PropertyTimeItem() +{ + delete (TQTimeEdit*)lin; + lin = 0; +} + +void PropertyTimeItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !lin ) { + lined()->blockSignals( TRUE ); + lined()->setTime( value().toTime() ); + lined()->blockSignals( FALSE ); + } + placeEditor( lin ); + if ( !lin->isVisible() ) { + lin->show(); + setFocus( lin ); + } +} + +void PropertyTimeItem::hideEditor() +{ + PropertyItem::hideEditor(); + if ( lin ) + lin->hide(); +} + +void PropertyTimeItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + if ( lin ) { + lined()->blockSignals( TRUE ); + if ( lined()->time() != v.toTime() ) + lined()->setTime( v.toTime() ); + lined()->blockSignals( FALSE ); + } + setText( 1, v.toTime().toString( ::Qt::ISODate ) ); + PropertyItem::setValue( v ); +} + +void PropertyTimeItem::setValue() +{ + setText( 1, lined()->time().toString( ::Qt::ISODate ) ); + TQVariant v; + v = lined()->time(); + PropertyItem::setValue( v ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyDateTimeItem::PropertyDateTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + lin = 0; +} + +TQDateTimeEdit *PropertyDateTimeItem::lined() +{ + if ( lin ) + return lin; + lin = new TQDateTimeEdit( listview->viewport() ); + connect( lin, TQT_SIGNAL( valueChanged( const TQDateTime & ) ), + this, TQT_SLOT( setValue() ) ); + TQObjectList *l = lin->queryList( TQLINEEDIT_OBJECT_NAME_STRING ); + for ( TQObject *o = l->first(); o; o = l->next() ) + o->installEventFilter( listview ); + delete l; + return lin; +} + +PropertyDateTimeItem::~PropertyDateTimeItem() +{ + delete (TQDateTimeEdit*)lin; + lin = 0; +} + +void PropertyDateTimeItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !lin ) { + lined()->blockSignals( TRUE ); + lined()->setDateTime( value().toDateTime() ); + lined()->blockSignals( FALSE ); + } + placeEditor( lin ); + if ( !lin->isVisible() ) { + lin->show(); + setFocus( lin ); + } +} + +void PropertyDateTimeItem::hideEditor() +{ + PropertyItem::hideEditor(); + if ( lin ) + lin->hide(); +} + +void PropertyDateTimeItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + if ( lin ) { + lined()->blockSignals( TRUE ); + if ( lined()->dateTime() != v.toDateTime() ) + lined()->setDateTime( v.toDateTime() ); + lined()->blockSignals( FALSE ); + } + setText( 1, v.toDateTime().toString( ::Qt::ISODate ) ); + PropertyItem::setValue( v ); +} + +void PropertyDateTimeItem::setValue() +{ + setText( 1, lined()->dateTime().toString( ::Qt::ISODate ) ); + TQVariant v; + v = lined()->dateTime(); + PropertyItem::setValue( v ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyBoolItem::PropertyBoolItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + comb = 0; +} + +TQComboBox *PropertyBoolItem::combo() +{ + if ( comb ) + return comb; + comb = new TQComboBox( FALSE, listview->viewport() ); + comb->hide(); + comb->insertItem( i18n( "False" ) ); + comb->insertItem( i18n( "True" ) ); + connect( comb, TQT_SIGNAL( activated( int ) ), + this, TQT_SLOT( setValue() ) ); + comb->installEventFilter( listview ); + return comb; +} + +PropertyBoolItem::~PropertyBoolItem() +{ + delete (TQComboBox*)comb; + comb = 0; +} + +void PropertyBoolItem::toggle() +{ + bool b = value().toBool(); + setValue( TQVariant( !b, 0 ) ); + setValue(); +} + +void PropertyBoolItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !comb ) { + combo()->blockSignals( TRUE ); + if ( value().toBool() ) + combo()->setCurrentItem( 1 ); + else + combo()->setCurrentItem( 0 ); + combo()->blockSignals( FALSE ); + } + placeEditor( combo() ); + if ( !combo()->isVisible() || !combo()->hasFocus() ) { + combo()->show(); + setFocus( combo() ); + } +} + +void PropertyBoolItem::hideEditor() +{ + PropertyItem::hideEditor(); + combo()->hide(); +} + +void PropertyBoolItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + if ( comb ) { + combo()->blockSignals( TRUE ); + if ( v.toBool() ) + combo()->setCurrentItem( 1 ); + else + combo()->setCurrentItem( 0 ); + combo()->blockSignals( FALSE ); + } + TQString tmp = i18n( "True" ); + if ( !v.toBool() ) + tmp = i18n( "False" ); + setText( 1, tmp ); + PropertyItem::setValue( v ); +} + +void PropertyBoolItem::setValue() +{ + if ( !comb ) + return; + setText( 1, combo()->currentText() ); + bool b = combo()->currentItem() == 0 ? (bool)FALSE : (bool)TRUE; + PropertyItem::setValue( TQVariant( b, 0 ) ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyIntItem::PropertyIntItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool s ) + : PropertyItem( l, after, prop, propName ), signedValue( s ) +{ + spinBx = 0; +} + +TQSpinBox *PropertyIntItem::spinBox() +{ + if ( spinBx ) + return spinBx; + if ( signedValue ) + spinBx = new TQSpinBox( -INT_MAX, INT_MAX, 1, listview->viewport() ); + else + spinBx = new TQSpinBox( 0, INT_MAX, 1, listview->viewport() ); + spinBx->hide(); + spinBx->installEventFilter( listview ); + TQObjectList *ol = spinBx->queryList( TQLINEEDIT_OBJECT_NAME_STRING ); + if ( ol && ol->first() ) + ol->first()->installEventFilter( listview ); + delete ol; + connect( spinBx, TQT_SIGNAL( valueChanged( int ) ), + this, TQT_SLOT( setValue() ) ); + return spinBx; +} + +PropertyIntItem::~PropertyIntItem() +{ + delete (TQSpinBox*)spinBx; + spinBx = 0; +} + +void PropertyIntItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !spinBx ) { + spinBox()->blockSignals( TRUE ); + if ( signedValue ) + spinBox()->setValue( value().toInt() ); + else + spinBox()->setValue( value().toUInt() ); + spinBox()->blockSignals( FALSE ); + } + placeEditor( spinBox() ); + if ( !spinBox()->isVisible() || !spinBox()->hasFocus() ) { + spinBox()->show(); + setFocus( spinBox() ); + } +} + +void PropertyIntItem::hideEditor() +{ + PropertyItem::hideEditor(); + spinBox()->hide(); +} + +void PropertyIntItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + if ( spinBx ) { + spinBox()->blockSignals( TRUE ); + if ( signedValue ) + spinBox()->setValue( v.toInt() ); + else + spinBox()->setValue( v.toUInt() ); + spinBox()->blockSignals( FALSE ); + } + + if ( signedValue ) + setText( 1, TQString::number( v.toInt() ) ); + else + setText( 1, TQString::number( v.toUInt() ) ); + PropertyItem::setValue( v ); +} + +void PropertyIntItem::setValue() +{ + if ( !spinBx ) + return; + setText( 1, TQString::number( spinBox()->value() ) ); + if ( signedValue ) + PropertyItem::setValue( spinBox()->value() ); + else + PropertyItem::setValue( (uint)spinBox()->value() ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyLayoutItem::PropertyLayoutItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + spinBx = 0; +} + +PropertyLayoutItem::~PropertyLayoutItem() +{ + delete (TQSpinBox*)spinBx; + spinBx = 0; +} + +TQSpinBox* PropertyLayoutItem::spinBox() +{ + if ( spinBx ) + return spinBx; + spinBx = new TQSpinBox( -1, INT_MAX, 1, listview->viewport() ); + spinBx->setSpecialValueText( i18n( "default" ) ); + spinBx->hide(); + spinBx->installEventFilter( listview ); + TQObjectList *ol = spinBx->queryList( TQLINEEDIT_OBJECT_NAME_STRING ); + if ( ol && ol->first() ) + ol->first()->installEventFilter( listview ); + delete ol; + connect( spinBx, TQT_SIGNAL( valueChanged( int ) ), + this, TQT_SLOT( setValue() ) ); + return spinBx; +} + +void PropertyLayoutItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !spinBx ) { + spinBox()->blockSignals( TRUE ); + spinBox()->setValue( value().toInt() ); + spinBox()->blockSignals( TRUE ); + } + placeEditor( spinBox() ); + if ( !spinBox()->isVisible() || !spinBox()->hasFocus() ) { + spinBox()->show(); + setFocus( spinBox() ); + } +} + +void PropertyLayoutItem::hideEditor() +{ + PropertyItem::hideEditor(); + spinBox()->hide(); +} + +void PropertyLayoutItem::setValue( const TQVariant &v ) +{ + if ( spinBx ) { + spinBox()->blockSignals( TRUE ); + spinBox()->setValue( v.toInt() ); + spinBox()->blockSignals( FALSE ); + } + TQString s = v.toString(); + if ( v.toInt() == -1 ) + s = spinBox()->specialValueText(); + setText( 1, s ); + PropertyItem::setValue( v ); +} + +void PropertyLayoutItem::setValue() +{ + if ( !spinBx ) + return; + PropertyItem::setValue( spinBox()->value() ); + notifyValueChange(); +} + + +// -------------------------------------------------------------- + +PropertyListItem::PropertyListItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool e ) + : PropertyItem( l, after, prop, propName ), editable( e ) +{ + comb = 0; + oldInt = -1; +} + +TQComboBox *PropertyListItem::combo() +{ + if ( comb ) + return comb; + comb = new TQComboBox( editable, listview->viewport() ); + comb->hide(); + connect( comb, TQT_SIGNAL( activated( int ) ), + this, TQT_SLOT( setValue() ) ); + comb->installEventFilter( listview ); + if ( editable ) { + TQObjectList *ol = comb->queryList( TQLINEEDIT_OBJECT_NAME_STRING ); + if ( ol && ol->first() ) + ol->first()->installEventFilter( listview ); + delete ol; + } + return comb; +} + +PropertyListItem::~PropertyListItem() +{ + delete (TQComboBox*)comb; + comb = 0; +} + +void PropertyListItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !comb ) { + combo()->blockSignals( TRUE ); + combo()->clear(); + combo()->insertStringList( value().toStringList() ); + combo()->blockSignals( FALSE ); + } + placeEditor( combo() ); + if ( !combo()->isVisible() || !combo()->hasFocus() ) { + combo()->show(); + setFocus( combo() ); + } +} + +void PropertyListItem::hideEditor() +{ + PropertyItem::hideEditor(); + combo()->hide(); +} + +void PropertyListItem::setValue( const TQVariant &v ) +{ + if ( comb ) { + combo()->blockSignals( TRUE ); + combo()->clear(); + combo()->insertStringList( v.toStringList() ); + combo()->blockSignals( FALSE ); + } + setText( 1, v.toStringList().first() ); + PropertyItem::setValue( v ); +} + +void PropertyListItem::setValue() +{ + if ( !comb ) + return; + setText( 1, combo()->currentText() ); + TQStringList lst; + for ( uint i = 0; i < combo()->listBox()->count(); ++i ) + lst << combo()->listBox()->item( i )->text(); + PropertyItem::setValue( lst ); + notifyValueChange(); + oldInt = currentIntItem(); + oldString = currentItem(); +} + +TQString PropertyListItem::currentItem() const +{ + return ( (PropertyListItem*)this )->combo()->currentText(); +} + +void PropertyListItem::setCurrentItem( const TQString &s ) +{ + if ( comb && currentItem().lower() == s.lower() ) + return; + + if ( !comb ) { + combo()->blockSignals( TRUE ); + combo()->clear(); + combo()->insertStringList( value().toStringList() ); + combo()->blockSignals( FALSE ); + } + for ( uint i = 0; i < combo()->listBox()->count(); ++i ) { + if ( combo()->listBox()->item( i )->text().lower() == s.lower() ) { + combo()->setCurrentItem( i ); + setText( 1, combo()->currentText() ); + break; + } + } + oldInt = currentIntItem(); + oldString = currentItem(); +} + +void PropertyListItem::addItem( const TQString &s ) +{ + combo()->insertItem( s ); +} + +void PropertyListItem::setCurrentItem( int i ) +{ + if ( comb && i == combo()->currentItem() ) + return; + + if ( !comb ) { + combo()->blockSignals( TRUE ); + combo()->clear(); + combo()->insertStringList( value().toStringList() ); + combo()->blockSignals( FALSE ); + } + combo()->setCurrentItem( i ); + setText( 1, combo()->currentText() ); + oldInt = currentIntItem(); + oldString = currentItem(); +} + +int PropertyListItem::currentIntItem() const +{ + return ( (PropertyListItem*)this )->combo()->currentItem(); +} + +int PropertyListItem::currentIntItemFromObject() const +{ + return oldInt; +} + +TQString PropertyListItem::currentItemFromObject() const +{ + return oldString; +} + +// -------------------------------------------------------------- + +PropertyCoordItem::PropertyCoordItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, Type t ) + : PropertyItem( l, after, prop, propName ), typ( t ) +{ + lin = 0; + +} + +TQLineEdit *PropertyCoordItem::lined() +{ + if ( lin ) + return lin; + lin = new TQLineEdit( listview->viewport() ); + lin->setReadOnly( TRUE ); + lin->installEventFilter( listview ); + lin->hide(); + return lin; +} + +void PropertyCoordItem::createChildren() +{ + PropertyItem *i = this; + if ( typ == Rect || typ == Point ) { + i = new PropertyIntItem( listview, i, this, i18n( "x" ), TRUE ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "y" ), TRUE ); + addChild( i ); + } + if ( typ == Rect || typ == Size ) { + i = new PropertyIntItem( listview, i, this, i18n( "width" ), TRUE ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "height" ), TRUE ); + addChild( i ); + } +} + +void PropertyCoordItem::initChildren() +{ + PropertyItem *item = 0; + for ( int i = 0; i < childCount(); ++i ) { + item = PropertyItem::child( i ); + if ( item->name() == i18n( "x" ) ) { + if ( typ == Rect ) + item->setValue( val.toRect().x() ); + else if ( typ == Point ) + item->setValue( val.toPoint().x() ); + } else if ( item->name() == i18n( "y" ) ) { + if ( typ == Rect ) + item->setValue( val.toRect().y() ); + else if ( typ == Point ) + item->setValue( val.toPoint().y() ); + } else if ( item->name() == i18n( "width" ) ) { + if ( typ == Rect ) + item->setValue( val.toRect().width() ); + else if ( typ == Size ) + item->setValue( val.toSize().width() ); + } else if ( item->name() == i18n( "height" ) ) { + if ( typ == Rect ) + item->setValue( val.toRect().height() ); + else if ( typ == Size ) + item->setValue( val.toSize().height() ); + } + } +} + +PropertyCoordItem::~PropertyCoordItem() +{ + delete (TQLineEdit*)lin; + lin = 0; +} + +void PropertyCoordItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !lin ) + lined()->setText( text( 1 ) ); + placeEditor( lined() ); + if ( !lined()->isVisible() || !lined()->hasFocus() ) { + lined()->show(); + setFocus( lined() ); + } +} + +void PropertyCoordItem::hideEditor() +{ + PropertyItem::hideEditor(); + lined()->hide(); +} + +void PropertyCoordItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + TQString s; + if ( typ == Rect ) + s = "[ " + TQString::number( v.toRect().x() ) + ", " + TQString::number( v.toRect().y() ) + ", " + + TQString::number( v.toRect().width() ) + ", " + TQString::number( v.toRect().height() ) + " ]"; + else if ( typ == Point ) + s = "[ " + TQString::number( v.toPoint().x() ) + ", " + + TQString::number( v.toPoint().y() ) + " ]"; + else if ( typ == Size ) + s = "[ " + TQString::number( v.toSize().width() ) + ", " + + TQString::number( v.toSize().height() ) + " ]"; + setText( 1, s ); + if ( lin ) + lined()->setText( s ); + PropertyItem::setValue( v ); +} + +bool PropertyCoordItem::hasSubItems() const +{ + return TRUE; +} + +void PropertyCoordItem::childValueChanged( PropertyItem *child ) +{ + if ( typ == Rect ) { + TQRect r = value().toRect(); + if ( child->name() == i18n( "x" ) ) + r.moveBy( -r.x() + child->value().toInt(), 0 ); + else if ( child->name() == i18n( "y" ) ) + r.moveBy( 0, -r.y() + child->value().toInt() ); + else if ( child->name() == i18n( "width" ) ) + r.setWidth( child->value().toInt() ); + else if ( child->name() == i18n( "height" ) ) + r.setHeight( child->value().toInt() ); + setValue( r ); + } else if ( typ == Point ) { + TQPoint r = value().toPoint(); + if ( child->name() == i18n( "x" ) ) + r.setX( child->value().toInt() ); + else if ( child->name() == i18n( "y" ) ) + r.setY( child->value().toInt() ); + setValue( r ); + } else if ( typ == Size ) { + TQSize r = value().toSize(); + if ( child->name() == i18n( "width" ) ) + r.setWidth( child->value().toInt() ); + else if ( child->name() == i18n( "height" ) ) + r.setHeight( child->value().toInt() ); + setValue( r ); + } + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyPixmapItem::PropertyPixmapItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, Type t ) + : PropertyItem( l, after, prop, propName ), type( t ) +{ + box = new TQHBox( listview->viewport() ); + box->hide(); + pixPrev = new TQLabel( box ); + pixPrev->setSizePolicy( TQSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::Minimum ) ); + pixPrev->setBackgroundColor( pixPrev->colorGroup().color( TQColorGroup::Base ) ); + button = new TQPushButton( "...", box ); + setupStyle( button ); + button->setFixedWidth( 20 ); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setLineWidth( 2 ); + pixPrev->setFrameStyle( TQFrame::NoFrame ); + box->installEventFilter( listview ); + connect( button, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( getPixmap() ) ); +} + +PropertyPixmapItem::~PropertyPixmapItem() +{ + delete (TQHBox*)box; +} + +void PropertyPixmapItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() ) { + box->show(); + listView()->viewport()->setFocus(); + } +} + +void PropertyPixmapItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +void PropertyPixmapItem::setValue( const TQVariant &v ) +{ + TQString s; + if ( type == Pixmap ) + pixPrev->setPixmap( v.toPixmap() ); + else if ( type == IconSet ) + pixPrev->setPixmap( v.toIconSet().pixmap() ); + else + pixPrev->setPixmap( v.toImage() ); + PropertyItem::setValue( v ); + repaint(); +} + +void PropertyPixmapItem::getPixmap() +{ + TQPixmap pix = qChoosePixmap( listview, listview->propertyEditor()->formWindow(), value().toPixmap() ); + if ( !pix.isNull() ) { + if ( type == Pixmap ) + setValue( pix ); + else if ( type == IconSet ) + setValue( TQIconSet( pix ) ); + else + setValue( pix.convertToImage() ); + + notifyValueChange(); + } +} + +bool PropertyPixmapItem::hasCustomContents() const +{ + return TRUE; +} + +void PropertyPixmapItem::drawCustomContents( TQPainter *p, const TQRect &r ) +{ + TQPixmap pix; + if ( type == Pixmap ) + pix = value().toPixmap(); + else if ( type == IconSet ) + pix = value().toIconSet().pixmap(); + else + pix = value().toImage(); + + if ( !pix.isNull() ) { + p->save(); + p->setClipRect( TQRect( TQPoint( (int)(p->worldMatrix().dx() + r.x()), + (int)(p->worldMatrix().dy() + r.y()) ), + r.size() ) ); + p->drawPixmap( r.x(), r.y() + ( r.height() - pix.height() ) / 2, pix ); + p->restore(); + } +} + + +// -------------------------------------------------------------- + +PropertyColorItem::PropertyColorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool children ) + : PropertyItem( l, after, prop, propName ), withChildren( children ) +{ + box = new TQHBox( listview->viewport() ); + box->hide(); + colorPrev = new TQFrame( box ); + button = new TQPushButton( "...", box ); + setupStyle( button ); + button->setFixedWidth( 20 ); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setLineWidth( 2 ); + colorPrev->setFrameStyle( TQFrame::Plain | TQFrame::Box ); + colorPrev->setLineWidth( 2 ); + TQPalette pal = colorPrev->palette(); + TQColorGroup cg = pal.active(); + cg.setColor( TQColorGroup::Foreground, cg.color( TQColorGroup::Base ) ); + pal.setActive( cg ); + pal.setInactive( cg ); + pal.setDisabled( cg ); + colorPrev->setPalette( pal ); + box->installEventFilter( listview ); + connect( button, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( getColor() ) ); +} + +void PropertyColorItem::createChildren() +{ + PropertyItem *i = this; + i = new PropertyIntItem( listview, i, this, i18n( "Red" ), TRUE ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "Green" ), TRUE ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "Blue" ), TRUE ); + addChild( i ); +} + +void PropertyColorItem::initChildren() +{ + PropertyItem *item = 0; + for ( int i = 0; i < childCount(); ++i ) { + item = PropertyItem::child( i ); + if ( item->name() == i18n( "Red" ) ) + item->setValue( val.toColor().red() ); + else if ( item->name() == i18n( "Green" ) ) + item->setValue( val.toColor().green() ); + else if ( item->name() == i18n( "Blue" ) ) + item->setValue( val.toColor().blue() ); + } +} + +PropertyColorItem::~PropertyColorItem() +{ + delete (TQHBox*)box; +} + +void PropertyColorItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() ) { + box->show(); + listView()->viewport()->setFocus(); + } +} + +void PropertyColorItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +void PropertyColorItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + TQString s; + setText( 1, v.toColor().name() ); + colorPrev->setBackgroundColor( v.toColor() ); + PropertyItem::setValue( v ); +} + +bool PropertyColorItem::hasSubItems() const +{ + return withChildren; +} + +void PropertyColorItem::childValueChanged( PropertyItem *child ) +{ + TQColor c( val.toColor() ); + if ( child->name() == i18n( "Red" ) ) + c.setRgb( child->value().toInt(), c.green(), c.blue() ); + else if ( child->name() == i18n( "Green" ) ) + c.setRgb( c.red(), child->value().toInt(), c.blue() ); + else if ( child->name() == i18n( "Blue" ) ) + c.setRgb( c.red(), c.green(), child->value().toInt() ); + setValue( c ); + notifyValueChange(); +} + +void PropertyColorItem::getColor() +{ + TQColor c = TQColorDialog::getColor( val.asColor(), listview ); + if ( c.isValid() ) { + setValue( c ); + notifyValueChange(); + } +} + +bool PropertyColorItem::hasCustomContents() const +{ + return TRUE; +} + +void PropertyColorItem::drawCustomContents( TQPainter *p, const TQRect &r ) +{ + p->save(); + p->setPen( TQPen( black, 1 ) ); + p->setBrush( val.toColor() ); + p->drawRect( r.x() + 2, r.y() + 2, r.width() - 5, r.height() - 5 ); + p->restore(); +} + +// -------------------------------------------------------------- + +PropertyFontItem::PropertyFontItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + box = new TQHBox( listview->viewport() ); + box->hide(); + lined = new TQLineEdit( box ); + button = new TQPushButton( "...", box ); + setupStyle( button ); + button->setFixedWidth( 20 ); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setLineWidth( 2 ); + lined->setFrame( FALSE ); + lined->setReadOnly( TRUE ); + box->setFocusProxy( lined ); + box->installEventFilter( listview ); + lined->installEventFilter( listview ); + button->installEventFilter( listview ); + connect( button, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( getFont() ) ); +} + +void PropertyFontItem::createChildren() +{ + PropertyItem *i = this; + i = new PropertyListItem( listview, i, this, i18n( "Family" ), FALSE ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "Point Size" ), TRUE ); + addChild( i ); + i = new PropertyBoolItem( listview, i, this, i18n( "Bold" ) ); + addChild( i ); + i = new PropertyBoolItem( listview, i, this, i18n( "Italic" ) ); + addChild( i ); + i = new PropertyBoolItem( listview, i, this, i18n( "Underline" ) ); + addChild( i ); + i = new PropertyBoolItem( listview, i, this, i18n( "Strikeout" ) ); + addChild( i ); +} + +void PropertyFontItem::initChildren() +{ + PropertyItem *item = 0; + for ( int i = 0; i < childCount(); ++i ) { + item = PropertyItem::child( i ); + if ( item->name() == i18n( "Family" ) ) { + ( (PropertyListItem*)item )->setValue( getFontList() ); + ( (PropertyListItem*)item )->setCurrentItem( val.toFont().family() ); + } else if ( item->name() == i18n( "Point Size" ) ) + item->setValue( val.toFont().pointSize() ); + else if ( item->name() == i18n( "Bold" ) ) + item->setValue( TQVariant( val.toFont().bold(), 0 ) ); + else if ( item->name() == i18n( "Italic" ) ) + item->setValue( TQVariant( val.toFont().italic(), 0 ) ); + else if ( item->name() == i18n( "Underline" ) ) + item->setValue( TQVariant( val.toFont().underline(), 0 ) ); + else if ( item->name() == i18n( "Strikeout" ) ) + item->setValue( TQVariant( val.toFont().strikeOut(), 0 ) ); + } +} + +PropertyFontItem::~PropertyFontItem() +{ + delete (TQHBox*)box; +} + +void PropertyFontItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() || !lined->hasFocus() ) { + box->show(); + setFocus( lined ); + } +} + +void PropertyFontItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +void PropertyFontItem::setValue( const TQVariant &v ) +{ + if ( value() == v ) + return; + + setText( 1, v.toFont().family() + "-" + TQString::number( v.toFont().pointSize() ) ); + lined->setText( v.toFont().family() + "-" + TQString::number( v.toFont().pointSize() ) ); + PropertyItem::setValue( v ); +} + +void PropertyFontItem::getFont() +{ + bool ok = FALSE; + TQFont f = TQFontDialog::getFont( &ok, val.toFont(), listview ); + if ( ok && f != val.toFont() ) { + setValue( f ); + notifyValueChange(); + } +} + +bool PropertyFontItem::hasSubItems() const +{ + return TRUE; +} + +void PropertyFontItem::childValueChanged( PropertyItem *child ) +{ + TQFont f = val.toFont(); + if ( child->name() == i18n( "Family" ) ) + f.setFamily( ( (PropertyListItem*)child )->currentItem() ); + else if ( child->name() == i18n( "Point Size" ) ) + f.setPointSize( child->value().toInt() ); + else if ( child->name() == i18n( "Bold" ) ) + f.setBold( child->value().toBool() ); + else if ( child->name() == i18n( "Italic" ) ) + f.setItalic( child->value().toBool() ); + else if ( child->name() == i18n( "Underline" ) ) + f.setUnderline( child->value().toBool() ); + else if ( child->name() == i18n( "Strikeout" ) ) + f.setStrikeOut( child->value().toBool() ); + setValue( f ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyDatabaseItem::PropertyDatabaseItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool wField ) + : PropertyItem( l, after, prop, propName ), withField( wField ) +{ + box = new TQHBox( listview->viewport() ); + box->hide(); + lined = new TQLineEdit( box ); + button = new TQPushButton( "...", box ); + setupStyle( button ); + button->setFixedWidth( 20 ); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setLineWidth( 2 ); + lined->setFrame( FALSE ); + lined->setReadOnly( TRUE ); + box->setFocusProxy( lined ); + box->installEventFilter( listview ); + lined->installEventFilter( listview ); + button->installEventFilter( listview ); +} + +void PropertyDatabaseItem::createChildren() +{ + PropertyItem *i = this; + i = new PropertyListItem( listview, i, this, i18n( "Connection" ), TRUE ); + addChild( i ); + i = new PropertyListItem( listview, i, this, i18n( "Table" ), TRUE ); + addChild( i ); + if ( withField ) { + i = new PropertyListItem( listview, i, this, i18n( "Field" ), TRUE ); + addChild( i ); + } +} + +void PropertyDatabaseItem::initChildren() +{ +#ifndef TQT_NO_SQL + PropertyItem *item = 0; + TQStringList lst = value().toStringList(); + TQString conn, table; + for ( int i = 0; i < childCount(); ++i ) { + item = PropertyItem::child( i ); + if ( item->name() == i18n( "Connection" ) ) { + TQStringList cl = listview->propertyEditor()->formWindow()->project()->databaseConnectionList(); + if ( !cl.isEmpty() ) + item->setValue( cl ); + else if ( lst.count() > 0 ) + item->setValue( TQStringList( lst[ 0 ] ) ); + else if ( withField ) + item->setValue( TQStringList( MetaDataBase::fakeProperty( TQT_TQOBJECT(listview->propertyEditor()->formWindow()->mainContainer()), + "database" ).toStringList()[ 0 ] ) ); + + if ( lst.count() > 0 && !lst[ 0 ].isEmpty() ) + item->setCurrentItem( lst[ 0 ] ); + else if ( !isChanged() && withField ) + item->setCurrentItem( MetaDataBase::fakeProperty( TQT_TQOBJECT(listview->propertyEditor()->formWindow()->mainContainer()), + "database" ).toStringList()[ 0 ] ); + else + item->setCurrentItem( 0 ); + conn = item->currentItem(); + } else if ( item->name() == i18n( "Table" ) ) { + TQStringList cl = listview->propertyEditor()->formWindow()->project()->databaseTableList( conn ); + if ( !cl.isEmpty() ) + item->setValue( cl ); + else if ( lst.count() > 1 ) + item->setValue( TQStringList( lst[ 1 ] ) ); + else if ( withField ) { + TQStringList fakeLst = MetaDataBase::fakeProperty( TQT_TQOBJECT(listview->propertyEditor()->formWindow()->mainContainer()), "database" ).toStringList(); + if ( fakeLst.count() > 1 ) + item->setValue( fakeLst[ 1 ] ); + } + + if ( lst.count() > 1 && !lst[ 1 ].isEmpty() ) + item->setCurrentItem( lst[ 1 ] ); + else if ( !isChanged() && withField ) { + TQStringList fakeLst = MetaDataBase::fakeProperty( TQT_TQOBJECT(listview->propertyEditor()->formWindow()->mainContainer()), "database" ).toStringList(); + if ( fakeLst.count() > 1 ) + item->setCurrentItem( fakeLst[ 1 ] ); + else + item->setCurrentItem( 0 ); + } else + item->setCurrentItem( 0 ); + table = item->currentItem(); + } else if ( item->name() == i18n( "Field" ) ) { + TQStringList cl = listview->propertyEditor()->formWindow()->project()->databaseFieldList( conn, table ); + if ( !cl.isEmpty() ) + item->setValue( cl ); + else if ( lst.count() > 2 ) + item->setValue( TQStringList( lst[ 2 ] ) ); + if ( lst.count() > 2 && !lst[ 2 ].isEmpty() ) + item->setCurrentItem( lst[ 2 ] ); + else + item->setCurrentItem( 0 ); + } + } +#endif +} + +PropertyDatabaseItem::~PropertyDatabaseItem() +{ + delete (TQHBox*)box; +} + +void PropertyDatabaseItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() || !lined->hasFocus() ) { + box->show(); + setFocus( lined ); + } +} + +void PropertyDatabaseItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +void PropertyDatabaseItem::setValue( const TQVariant &v ) +{ + if ( value() == v ) + return; + + TQStringList lst = v.toStringList(); + TQString s = lst.join( "." ); + setText( 1, s ); + lined->setText( s ); + PropertyItem::setValue( v ); +} + +bool PropertyDatabaseItem::hasSubItems() const +{ + return TRUE; +} + +void PropertyDatabaseItem::childValueChanged( PropertyItem *c ) +{ +#ifndef TQT_NO_SQL + TQStringList lst; + lst << ( (PropertyListItem*)PropertyItem::child( 0 ) )->currentItem() + << ( (PropertyListItem*)PropertyItem::child( 1 ) )->currentItem(); + if ( withField ) + lst << ( (PropertyListItem*)PropertyItem::child( 2 ) )->currentItem(); + if ( c == PropertyItem::child( 0 ) ) { // if the connection changed + lst[ 0 ] = ( (PropertyListItem*)c )->currentItem(); + PropertyItem::child( 1 )->setValue( listview->propertyEditor()->formWindow()->project()->databaseTableList( lst[ 0 ] ) ); + if ( withField ) + PropertyItem::child( 2 )->setValue( listview->propertyEditor()->formWindow()->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] ) ); + } else if ( withField && c == PropertyItem::child( 1 ) ) { // if the table changed + lst[ 1 ] = ( (PropertyListItem*)c )->currentItem(); + if ( withField ) + PropertyItem::child( 2 )->setValue( listview->propertyEditor()->formWindow()->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] ) ); + } + lst.clear(); + lst << ( (PropertyListItem*)PropertyItem::child( 0 ) )->currentItem() + << ( (PropertyListItem*)PropertyItem::child( 1 ) )->currentItem(); + if ( withField ) + lst << ( (PropertyListItem*)PropertyItem::child( 2 ) )->currentItem(); + setValue( lst ); + notifyValueChange(); +#else + Q_UNUSED( c ); +#endif +} + +// -------------------------------------------------------------- + +PropertySizePolicyItem::PropertySizePolicyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + lin = 0; +} + +TQLineEdit *PropertySizePolicyItem::lined() +{ + if ( lin ) + return lin; + lin = new TQLineEdit( listview->viewport() ); + lin->hide(); + lin->setReadOnly( TRUE ); + return lin; +} + +void PropertySizePolicyItem::createChildren() +{ + TQStringList lst; + lst << "Fixed" << "Minimum" << "Maximum" << "Preferred" << "MinimumExpanding" << "Expanding" << "Ignored"; + + PropertyItem *i = this; + i = new PropertyListItem( listview, i, this, i18n( "hSizeType" ), FALSE ); + i->setValue( lst ); + addChild( i ); + i = new PropertyListItem( listview, i, this, i18n( "vSizeType" ), FALSE ); + i->setValue( lst ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "horizontalStretch" ), TRUE ); + addChild( i ); + i = new PropertyIntItem( listview, i, this, i18n( "verticalStretch" ), TRUE ); + addChild( i ); +} + +void PropertySizePolicyItem::initChildren() +{ + PropertyItem *item = 0; + TQSizePolicy sp = val.toSizePolicy(); + for ( int i = 0; i < childCount(); ++i ) { + item = PropertyItem::child( i ); + if ( item->name() == i18n( "hSizeType" ) ) + ( (PropertyListItem*)item )->setCurrentItem( size_type_to_int( sp.horData() ) ); + else if ( item->name() == i18n( "vSizeType" ) ) + ( (PropertyListItem*)item )->setCurrentItem( size_type_to_int( sp.verData() ) ); + else if ( item->name() == i18n( "horizontalStretch" ) ) + ( (PropertyIntItem*)item )->setValue( sp.horStretch() ); + else if ( item->name() == i18n( "verticalStretch" ) ) + ( (PropertyIntItem*)item )->setValue( sp.verStretch() ); + } +} + +PropertySizePolicyItem::~PropertySizePolicyItem() +{ + delete (TQLineEdit*)lin; +} + +void PropertySizePolicyItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( lined() ); + if ( !lined()->isVisible() || !lined()->hasFocus() ) { + lined()->show(); + listView()->viewport()->setFocus(); + } +} + +void PropertySizePolicyItem::hideEditor() +{ + PropertyItem::hideEditor(); + lined()->hide(); +} + +void PropertySizePolicyItem::setValue( const TQVariant &v ) +{ + if ( value() == v ) + return; + + TQString s = i18n( "%1/%2/%3/%4" ); + s = s.arg( size_type_to_string( v.toSizePolicy().horData() ) ). + arg( size_type_to_string( v.toSizePolicy().verData() ) ). + arg( v.toSizePolicy().horStretch() ). + arg( v.toSizePolicy().verStretch() ); + setText( 1, s ); + lined()->setText( s ); + PropertyItem::setValue( v ); +} + +void PropertySizePolicyItem::childValueChanged( PropertyItem *child ) +{ + TQSizePolicy sp = val.toSizePolicy(); + if ( child->name() == i18n( "hSizeType" ) ) + sp.setHorData( int_to_size_type( ( ( PropertyListItem*)child )->currentIntItem() ) ); + else if ( child->name() == i18n( "vSizeType" ) ) + sp.setVerData( int_to_size_type( ( ( PropertyListItem*)child )->currentIntItem() ) ); + else if ( child->name() == i18n( "horizontalStretch" ) ) + sp.setHorStretch( ( ( PropertyIntItem*)child )->value().toInt() ); + else if ( child->name() == i18n( "verticalStretch" ) ) + sp.setVerStretch( ( ( PropertyIntItem*)child )->value().toInt() ); + setValue( sp ); + notifyValueChange(); +} + +bool PropertySizePolicyItem::hasSubItems() const +{ + return TRUE; +} + +// -------------------------------------------------------------- + +PropertyPaletteItem::PropertyPaletteItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + box = new TQHBox( listview->viewport() ); + box->hide(); + palettePrev = new TQLabel( box ); + button = new TQPushButton( "...", box ); + setupStyle( button ); + button->setFixedWidth( 20 ); + box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken ); + box->setLineWidth( 2 ); + palettePrev->setFrameStyle( TQFrame::NoFrame ); + box->installEventFilter( listview ); + connect( button, TQT_SIGNAL( clicked() ), + this, TQT_SLOT( getPalette() ) ); +} +PropertyPaletteItem::~PropertyPaletteItem() +{ + delete (TQHBox*)box; +} + +void PropertyPaletteItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() ) { + box->show(); + listView()->viewport()->setFocus(); + } +} + +void PropertyPaletteItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +void PropertyPaletteItem::setValue( const TQVariant &v ) +{ + TQString s; + palettePrev->setPalette( v.toPalette() ); + PropertyItem::setValue( v ); + repaint(); +} + +void PropertyPaletteItem::getPalette() +{ + if ( !listview->propertyEditor()->widget()->isWidgetType() ) + return; + bool ok = FALSE; + TQWidget *w = (TQWidget*)listview->propertyEditor()->widget(); + if ( ::tqqt_cast<TQScrollView*>(w) ) + w = ( (TQScrollView*)w )->viewport(); + TQPalette pal = PaletteEditor::getPalette( &ok, val.toPalette(), +#if defined(TQT_NON_COMMERCIAL) + w->backgroundMode(), listview->topLevelWidget(), +#else + w->backgroundMode(), listview, +#endif + "choose_palette", listview->propertyEditor()->formWindow() ); + if ( !ok ) + return; + setValue( pal ); + notifyValueChange(); +} + +bool PropertyPaletteItem::hasCustomContents() const +{ + return TRUE; +} + +void PropertyPaletteItem::drawCustomContents( TQPainter *p, const TQRect &r ) +{ + TQPalette pal( value().toPalette() ); + p->save(); + p->setClipRect( TQRect( TQPoint( (int)(p->worldMatrix().dx() + r.x()), + (int)(p->worldMatrix().dy() + r.y()) ), + r.size() ) ); + TQRect r2( r ); + r2.setX( r2.x() + 2 ); + r2.setY( r2.y() + 2 ); + r2.setWidth( r2.width() - 3 ); + r2.setHeight( r2.height() - 3 ); + p->setPen( TQPen( black, 1 ) ); + p->setBrush( pal.active().background() ); + p->drawRect( r2 ); + p->restore(); +} + +// -------------------------------------------------------------- + +PropertyCursorItem::PropertyCursorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + comb = 0; +} + +TQComboBox *PropertyCursorItem::combo() +{ + if ( comb ) + return comb; + comb = new TQComboBox( FALSE, listview->viewport() ); + comb->hide(); + TQBitmap cur; + + const TQPixmap ArrowPix = SmallIcon( "designer_arrow.png" , KDevDesignerPartFactory::instance()); + const TQPixmap UpArrowPix = SmallIcon( "designer_uparrow.png" , KDevDesignerPartFactory::instance()); + const TQPixmap CrossPix = SmallIcon( "designer_cross.png" , KDevDesignerPartFactory::instance()); + const TQPixmap WaitPix = SmallIcon( "designer_wait.png" , KDevDesignerPartFactory::instance()); + const TQPixmap IBeamPix = SmallIcon( "designer_ibeam.png" , KDevDesignerPartFactory::instance()); + const TQPixmap SizeVPix = SmallIcon( "designer_sizev.png" , KDevDesignerPartFactory::instance()); + const TQPixmap SizeHPix = SmallIcon( "designer_sizeh.png" , KDevDesignerPartFactory::instance()); + const TQPixmap SizeFPix = SmallIcon( "designer_sizef.png" , KDevDesignerPartFactory::instance()); + const TQPixmap SizeBPix = SmallIcon( "designer_sizeb.png" , KDevDesignerPartFactory::instance()); + const TQPixmap SizeAllPix = SmallIcon( "designer_sizeall.png" , KDevDesignerPartFactory::instance()); + const TQPixmap VSplitPix = SmallIcon( "designer_vsplit.png" , KDevDesignerPartFactory::instance()); + const TQPixmap HSplitPix = SmallIcon( "designer_hsplit.png" , KDevDesignerPartFactory::instance()); + const TQPixmap HandPix = SmallIcon( "designer_hand.png" , KDevDesignerPartFactory::instance()); + const TQPixmap NoPix = SmallIcon( "designer_no.png" , KDevDesignerPartFactory::instance()); + + comb->insertItem( ArrowPix, i18n("Arrow"), TQObject::ArrowCursor); + comb->insertItem( UpArrowPix, i18n("Up-Arrow"), TQObject::UpArrowCursor ); + comb->insertItem( CrossPix, i18n("Cross"), TQObject::CrossCursor ); + comb->insertItem( WaitPix, i18n("Waiting"), TQObject::WaitCursor ); + comb->insertItem( IBeamPix, i18n("iBeam"), TQObject::IbeamCursor ); + comb->insertItem( SizeVPix, i18n("SizeQt::Vertical"), TQObject::SizeVerCursor ); + comb->insertItem( SizeHPix, i18n("SizeQt::Horizontal"), TQObject::SizeHorCursor ); + comb->insertItem( SizeFPix, i18n("Size Slash"), TQObject::SizeBDiagCursor ); + comb->insertItem( SizeBPix, i18n("Size Backslash"), TQObject::SizeFDiagCursor ); + comb->insertItem( SizeAllPix, i18n("Size All"), TQObject::SizeAllCursor ); + cur = TQBitmap( 25, 25, 1 ); + cur.setMask( cur ); + comb->insertItem( cur, i18n("Blank"), TQObject::BlankCursor ); + comb->insertItem( VSplitPix, i18n("SplitQt::Vertical"), TQObject::SplitVCursor ); + comb->insertItem( HSplitPix, i18n("SplitQt::Horizontal"), TQObject::SplitHCursor ); + comb->insertItem( HandPix, i18n("Pointing Hand"), TQObject::PointingHandCursor ); + comb->insertItem( NoPix, i18n("Forbidden"), TQObject::ForbiddenCursor ); + + connect( comb, TQT_SIGNAL( activated( int ) ), + this, TQT_SLOT( setValue() ) ); + comb->installEventFilter( listview ); + return comb; +} + +PropertyCursorItem::~PropertyCursorItem() +{ + delete (TQComboBox*)comb; +} + +void PropertyCursorItem::showEditor() +{ + PropertyItem::showEditor(); + if ( !comb ) { + combo()->blockSignals( TRUE ); + combo()->setCurrentItem( (int)value().toCursor().shape() ); + combo()->blockSignals( FALSE ); + } + placeEditor( combo() ); + if ( !combo()->isVisible() || !combo()->hasFocus() ) { + combo()->show(); + setFocus( combo() ); + } +} + +void PropertyCursorItem::hideEditor() +{ + PropertyItem::hideEditor(); + combo()->hide(); +} + +void PropertyCursorItem::setValue( const TQVariant &v ) +{ + if ( ( !hasSubItems() || !isOpen() ) + && value() == v ) + return; + + combo()->blockSignals( TRUE ); + combo()->setCurrentItem( (int)v.toCursor().shape() ); + combo()->blockSignals( FALSE ); + setText( 1, combo()->currentText() ); + PropertyItem::setValue( v ); +} + +void PropertyCursorItem::setValue() +{ + if ( !comb ) + return; + if ( TQVariant( TQCursor( combo()->currentItem() ) ) == val ) + return; + setText( 1, combo()->currentText() ); + PropertyItem::setValue( TQCursor( combo()->currentItem() ) ); + notifyValueChange(); +} + +// -------------------------------------------------------------- + +PropertyKeysequenceItem::PropertyKeysequenceItem( PropertyList *l, + PropertyItem *after, + PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ), + k1( 0 ), k2( 0 ), k3( 0 ), k4( 0 ), num( 0 ), mouseEnter( FALSE ) +{ + box = new TQHBox( listview->viewport() ); + box->hide(); + sequence = new TQLineEdit( box ); + connect( sequence, TQT_SIGNAL(textChanged( const TQString & )), + this, TQT_SLOT(setValue()) ); + sequence->installEventFilter( this ); +} + +PropertyKeysequenceItem::~PropertyKeysequenceItem() +{ + delete (TQHBox*)box; +} + +void PropertyKeysequenceItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() ) { + box->show(); + sequence->setFocus(); + } +} + +void PropertyKeysequenceItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +bool PropertyKeysequenceItem::eventFilter( TQObject *o, TQEvent *e ) +{ + Q_UNUSED( o ); + if ( e->type() == TQEvent::KeyPress ) { + TQKeyEvent *k = (TQKeyEvent *)e; + if ( !mouseEnter && + (k->key() == TQObject::Key_Up || + k->key() == TQObject::Key_Down) ) + return FALSE; + handleKeyEvent( k ); + return TRUE; + } else if ( (e->type() == TQEvent::FocusIn) || + (e->type() == TQEvent::MouseButtonPress) ) { + mouseEnter = ( listview->lastEvent() == PropertyList::MouseEvent ) || + (e->type() == TQEvent::MouseButtonPress); + return TRUE; + } + + // Lets eat accelerators now.. + if ( e->type() == TQEvent::Accel || + e->type() == TQEvent::AccelOverride || + e->type() == TQEvent::KeyRelease ) + return TRUE; + return FALSE; +} + +void PropertyKeysequenceItem::handleKeyEvent( TQKeyEvent *e ) +{ + int nextKey = e->key(); + + if ( num > 3 || + nextKey == TQObject::Key_Control || + nextKey == TQObject::Key_Shift || + nextKey == TQObject::Key_Meta || + nextKey == TQObject::Key_Alt ) + return; + + nextKey |= translateModifiers( e->state() ); + switch( num ) { + case 0: + k1 = nextKey; + break; + case 1: + k2 = nextKey; + break; + case 2: + k3 = nextKey; + break; + case 3: + k4 = nextKey; + break; + default: + break; + } + num++; + TQKeySequence ks( k1, k2, k3, k4 ); + sequence->setText( ks ); +} + +int PropertyKeysequenceItem::translateModifiers( int state ) +{ + int result = 0; + if ( state & TQObject::ShiftButton ) + result |= TQObject::SHIFT; + if ( state & TQObject::ControlButton ) + result |= TQObject::CTRL; + if ( state & TQObject::MetaButton ) + result |= TQObject::META; + if ( state & TQObject::AltButton ) + result |= TQObject::ALT; + return result; +} + +void PropertyKeysequenceItem::setValue() +{ + TQVariant v; + v = TQVariant( TQKeySequence(sequence->text()) ); + if ( v.toString().isNull() ) + return; + setText( 1, sequence->text() ); + PropertyItem::setValue( v ); + if ( sequence->hasFocus() ) + notifyValueChange(); + setChanged( TRUE ); +} + +void PropertyKeysequenceItem::setValue( const TQVariant &v ) +{ + TQKeySequence ks = v.toKeySequence(); + if ( sequence ) { + sequence->setText( ks ); + } + num = ks.count(); + k1 = ks[0]; + k2 = ks[1]; + k3 = ks[2]; + k4 = ks[3]; + setText( 1, ks ); + PropertyItem::setValue( v ); +} + +// -------------------------------------------------------------- + +EnumPopup::EnumPopup( TQWidget *parent, const char *name, WFlags f ) + : TQFrame( parent, name, f ) +{ + setLineWidth( 1 ); + setFrameStyle( Panel | Plain ); + setPaletteBackgroundColor( TQt::white ); + popLayout = new TQVBoxLayout( this, 3 ); + checkBoxList.setAutoDelete( TRUE ); +} + +EnumPopup::~EnumPopup() +{ +} + +void EnumPopup::insertEnums( TQValueList<EnumItem> lst ) +{ + while ( checkBoxList.count() ) + checkBoxList.removeFirst(); + + itemList = lst; + TQCheckBox *cb; + TQValueListConstIterator<EnumItem> it = itemList.begin(); + for ( ; it != itemList.end(); ++it ) { + cb = new TQCheckBox( this ); + cb->setText( (*it).key ); + cb->setChecked( (*it).selected ); + if ( it == itemList.begin() ) + cb->setFocus(); + checkBoxList.append( cb ); + cb->resize( width(), cb->height() ); + popLayout->addWidget( cb ); + } +} + +void EnumPopup::keyPressEvent( TQKeyEvent *e ) +{ + if ( e->key() == Key_Escape ) { + hide(); + emit hidden(); + } else if ( e->key() == Key_Enter || e->key() == Key_Return ) { + closeWidget(); + } +} + +void EnumPopup::closeWidget() +{ + TQPtrListIterator<TQCheckBox> it( checkBoxList ); + int i = 0; + while ( it.current() != 0 ) { + itemList[i].selected = (*it)->isChecked(); + ++it; + ++i; + } + close(); + emit closed(); +} + +TQValueList<EnumItem> EnumPopup::enumList() const +{ + return itemList; +} + +EnumBox::EnumBox( TQWidget *parent, const char *name ) + : TQComboBox( parent, name ) +{ + pop = new EnumPopup( this, "popup", TQObject::WType_Popup ); + connect( pop, TQT_SIGNAL( hidden() ), this, TQT_SLOT( popupHidden() ) ); + connect( pop, TQT_SIGNAL( closed() ), this, TQT_SLOT( popupClosed() ) ); + popupShown = FALSE; + arrowDown = FALSE; +} + +void EnumBox::popupHidden() +{ + popupShown = FALSE; +} + +void EnumBox::popupClosed() +{ + popupShown = FALSE; + emit valueChanged(); +} + +void EnumBox::paintEvent( TQPaintEvent * ) +{ + TQPainter p( this ); + const TQColorGroup & g = colorGroup(); + p.setPen(g.text()); + + TQStyle::SFlags flags = TQStyle::Style_Default; + if (isEnabled()) + flags |= TQStyle::Style_Enabled; + if (hasFocus()) + flags |= TQStyle::Style_HasFocus; + + if ( width() < 5 || height() < 5 ) { + qDrawShadePanel( &p, rect().x(), rect().y(), rect().width(), rect().height(), g, FALSE, 2, + &g.brush( TQColorGroup::Button ) ); + return; + } + style().drawComplexControl( TQStyle::CC_ComboBox, &p, this, rect(), g, + flags, TQStyle::SC_All, + (arrowDown ? + TQStyle::SC_ComboBoxArrow : + TQStyle::SC_None )); + + TQRect re = style().querySubControlMetrics( TQStyle::CC_ComboBox, this, + TQStyle::SC_ComboBoxEditField ); + re = TQStyle::visualRect(re, this); + p.setClipRect( re ); + + if ( !str.isNull() ) { + p.save(); + p.setFont(font()); + TQFontMetrics fm(font()); + int x = re.x(), y = re.y() + fm.ascent(); + p.drawText( x, y, str ); + p.restore(); + } +} + +void EnumBox::insertEnums( TQValueList<EnumItem> lst ) +{ + pop->insertEnums( lst ); +} + +TQValueList<EnumItem> EnumBox::enumList() const +{ + return pop->enumList(); +} + +void EnumBox::popup() +{ + if ( popupShown ) { + pop->closeWidget(); + popupShown = FALSE; + return; + } + pop->move( ((TQWidget*)parent())->mapToGlobal( geometry().bottomLeft() ) ); + pop->setMinimumWidth( width() ); + emit aboutToShowPopup(); + pop->show(); + popupShown = TRUE; +} + +void EnumBox::mousePressEvent( TQMouseEvent *e ) +{ + if ( e->button() != Qt::LeftButton ) + return; + + TQRect arrowRect = style().querySubControlMetrics( TQStyle::CC_ComboBox, this, + TQStyle::SC_ComboBoxArrow); + arrowRect = TQStyle::visualRect(arrowRect, this); + + arrowRect.setHeight( TQMAX( height() - (2 * arrowRect.y()), arrowRect.height() ) ); + + if ( arrowRect.contains( e->pos() ) ) { + arrowDown = TRUE; + repaint( FALSE ); + } + + popup(); + TQTimer::singleShot( 100, this, TQT_SLOT( restoreArrow() ) ); +} + +void EnumBox::keyPressEvent( TQKeyEvent *e ) +{ + if ( e->key() == Key_Space ) { + popup(); + TQTimer::singleShot( 100, this, TQT_SLOT( restoreArrow() ) ); + } else if ( e->key() == Key_Enter || e->key() == Key_Return ) { + popup(); + } +} + +void EnumBox::restoreArrow() +{ + arrowDown = FALSE; + repaint( FALSE ); +} + +void EnumBox::setText( const TQString &text ) +{ + str = text; + repaint( FALSE ); +} + + + +PropertyEnumItem::PropertyEnumItem( PropertyList *l, + PropertyItem *after, + PropertyItem *prop, + const TQString &propName ) + : PropertyItem( l, after, prop, propName ) +{ + box = new EnumBox( listview->viewport() ); + box->hide(); + box->installEventFilter( listview ); + connect( box, TQT_SIGNAL( aboutToShowPopup() ), this, TQT_SLOT( insertEnums() ) ); + connect( box, TQT_SIGNAL( valueChanged() ), this, TQT_SLOT( setValue() ) ); +} + +PropertyEnumItem::~PropertyEnumItem() +{ + delete (EnumBox*)box; +} + +void PropertyEnumItem::showEditor() +{ + PropertyItem::showEditor(); + placeEditor( box ); + if ( !box->isVisible() ) { + box->show(); + box->setText( enumString ); + listView()->viewport()->setFocus(); + } + box->setFocus(); +} + +void PropertyEnumItem::hideEditor() +{ + PropertyItem::hideEditor(); + box->hide(); +} + +void PropertyEnumItem::setValue( const TQVariant &v ) +{ + enumString = ""; + enumList.clear(); + TQStringList lst = v.toStringList(); + TQValueListConstIterator<TQString> it = lst.begin(); + for ( ; it != lst.end(); ++it ) + enumList.append( EnumItem( *it, FALSE ) ); + enumList.first().selected = TRUE; + enumString = enumList.first().key; + box->setText( enumString ); + setText( 1, enumString ); + PropertyItem::setValue( v ); +} + +void PropertyEnumItem::insertEnums() +{ + box->insertEnums( enumList ); +} + +void PropertyEnumItem::setValue() +{ + enumList = box->enumList(); + enumString = ""; + TQValueListConstIterator<EnumItem> it = enumList.begin(); + for ( ; it != enumList.end(); ++it ) { + if ( (*it).selected ) + enumString += "|" + (*it).key; + } + if ( !enumString.isEmpty() ) + enumString.replace( 0, 1, "" ); + + box->setText( enumString ); + setText( 1, enumString ); + notifyValueChange(); +} + +void PropertyEnumItem::setCurrentValues( TQStrList lst ) +{ + enumString =""; + TQStrList::ConstIterator it = lst.begin(); + TQValueList<EnumItem>::Iterator eit = enumList.begin(); + for ( ; eit != enumList.end(); ++eit ) { + (*eit).selected = FALSE; + for ( it = lst.begin(); it != lst.end(); ++it ) { + if ( TQString( *it ) == (*eit).key ) { + (*eit).selected = TRUE; + enumString += "|" + (*eit).key; + break; + } + } + } + if ( !enumString.isEmpty() ) + enumString.replace( 0, 1, "" ); + box->setText( enumString ); + setText( 1, enumString ); +} + +TQString PropertyEnumItem::currentItem() const +{ + return enumString; +} + +TQString PropertyEnumItem::currentItemFromObject() const +{ + return enumString; +} + +// -------------------------------------------------------------- + +/*! + \class PropertyList propertyeditor.h + \brief PropertyList is a TQListView derived class which is used for editing widget properties + + This class is used for widget properties. It has to be child of a + PropertyEditor. + + To initialize it for editing a widget call setupProperties() which + iterates through the properties of the current widget (see + PropertyEditor::widget()) and builds the list. + + To update the item values, refetchData() can be called. + + If the value of an item has been changed by the user, and this + change should be applied to the widget's property, valueChanged() + has to be called. + + To set the value of an item, setPropertyValue() has to be called. +*/ + +PropertyList::PropertyList( PropertyEditor *e ) + : TQListView( e ), editor( e ) +{ + init_colors(); + + whatsThis = new PropertyWhatsThis( this ); + showSorted = FALSE; + header()->setMovingEnabled( FALSE ); + header()->setStretchEnabled( TRUE ); + setResizePolicy( TQScrollView::Manual ); + viewport()->setAcceptDrops( TRUE ); + viewport()->installEventFilter( this ); + addColumn( i18n( "Property" ) ); + addColumn( i18n( "Value" ) ); + connect( header(), TQT_SIGNAL( sizeChange( int, int, int ) ), + this, TQT_SLOT( updateEditorSize() ) ); + disconnect( header(), TQT_SIGNAL( sectionClicked( int ) ), + this, TQT_SLOT( changeSortColumn( int ) ) ); + connect( header(), TQT_SIGNAL( sectionClicked( int ) ), + this, TQT_SLOT( toggleSort() ) ); + connect( this, TQT_SIGNAL( pressed( TQListViewItem *, const TQPoint &, int ) ), + this, TQT_SLOT( itemPressed( TQListViewItem *, const TQPoint &, int ) ) ); + connect( this, TQT_SIGNAL( doubleClicked( TQListViewItem * ) ), + this, TQT_SLOT( toggleOpen( TQListViewItem * ) ) ); + setSorting( -1 ); + setHScrollBarMode( AlwaysOff ); + setVScrollBarMode( AlwaysOn ); + setColumnWidthMode( 1, Manual ); + mousePressed = FALSE; + pressItem = 0; + theLastEvent = MouseEvent; + header()->installEventFilter( this ); +} + +void PropertyList::toggleSort() +{ + showSorted = !showSorted; + editor->clear(); + editor->setup(); +} + +void PropertyList::resizeEvent( TQResizeEvent *e ) +{ + TQListView::resizeEvent( e ); + if ( currentItem() ) + ( ( PropertyItem* )currentItem() )->showEditor(); +} + +static TQVariant::Type type_to_variant( const TQString &s ) +{ + if ( s == "Invalid " ) + return TQVariant::Invalid; + if ( s == "Map" ) + return TQVariant::Map; + if ( s == "List" ) + return TQVariant::List; + if ( s == "String" ) + return TQVariant::String; + if ( s == "StringList" ) + return TQVariant::StringList; + if ( s == "Font" ) + return TQVariant::Font; + if ( s == "Pixmap" ) + return TQVariant::Pixmap; + if ( s == "Brush" ) + return TQVariant::Brush; + if ( s == "Rect" ) + return TQVariant::Rect; + if ( s == "Size" ) + return TQVariant::Size; + if ( s == "Color" ) + return TQVariant::Color; + if ( s == "Palette" ) + return TQVariant::Palette; + if ( s == "ColorGroup" ) + return TQVariant::ColorGroup; + if ( s == "IconSet" ) + return TQVariant::IconSet; + if ( s == "Point" ) + return TQVariant::Point; + if ( s == "Image" ) + return TQVariant::Image; + if ( s == "Int" ) + return TQVariant::Int; + if ( s == "UInt" ) + return TQVariant::UInt; + if ( s == "Bool" ) + return TQVariant::Bool; + if ( s == "Double" ) + return TQVariant::Double; + if ( s == "CString" ) + return TQVariant::CString; + if ( s == "PointArray" ) + return TQVariant::PointArray; + if ( s == "Region" ) + return TQVariant::Region; + if ( s == "Bitmap" ) + return TQVariant::Bitmap; + if ( s == "Cursor" ) + return TQVariant::Cursor; + if ( s == "SizePolicy" ) + return TQVariant::SizePolicy; + if ( s == "Date" ) + return TQVariant::Date; + if ( s == "Time" ) + return TQVariant::Time; + if ( s == "DateTime" ) + return TQVariant::DateTime; + return TQVariant::Invalid; +} + +#ifndef TQT_NO_SQL +static bool parent_is_data_aware( TQWidget *w ) +{ + TQWidget *p = w ? w->parentWidget() : 0; + while ( p && !p->isTopLevel() ) { + if ( ::tqqt_cast<QDesignerDataBrowser*>(p) || ::tqqt_cast<QDesignerDataView*>(p) ) + return TRUE; + p = p->parentWidget(); + } + return FALSE; +} +#endif + +/*! Sets up the property list by adding an item for each designable +property of the widget which is just edited. +*/ + +void PropertyList::setupProperties() +{ + if ( !editor->widget() ) + return; + bool allProperties = !::tqqt_cast<Spacer*>(editor->widget()); + TQStrList lst = editor->widget()->metaObject()->propertyNames( allProperties ); + PropertyItem *item = 0; + TQMap<TQString, bool> unique; + TQObject *w = editor->widget(); + TQStringList valueSet; + bool parentHasLayout = + w->isWidgetType() && + !editor->formWindow()->isMainContainer( TQT_TQOBJECT(w) ) && ( (TQWidget*)w )->parentWidget() && + WidgetFactory::layoutType( ( (TQWidget*)w )->parentWidget() ) != WidgetFactory::NoLayout; + for ( TQPtrListIterator<char> it( lst ); it.current(); ++it ) { + const TQMetaProperty* p = + editor->widget()->metaObject()-> + property( editor->widget()->metaObject()->findProperty( it.current(), allProperties), allProperties ); + if ( !p ) + continue; + if ( unique.contains( TQString::fromLatin1( it.current() ) ) ) + continue; + if ( ::tqqt_cast<QDesignerToolBar*>(editor->widget()) || + ::tqqt_cast<MenuBarEditor*>(editor->widget()) ) { + if ( qstrcmp( p->name(), "minimumHeight" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "minimumWidth" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumHeight" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumWidth" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "geometry" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "sizePolicy" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "minimumSize" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumSize" ) == 0 ) + continue; + } + unique.insert( TQString::fromLatin1( it.current() ), TRUE ); + if ( editor->widget()->isWidgetType() && + editor->formWindow()->isMainContainer( TQT_TQOBJECT(editor->widget()) ) ) { + if ( qstrcmp( p->name(), "geometry" ) == 0 ) + continue; + } else { // hide some toplevel-only stuff + if ( qstrcmp( p->name(), "icon" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "iconText" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "caption" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "sizeIncrement" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "baseSize" ) == 0 ) + continue; + if ( parentHasLayout && qstrcmp( p->name(), "geometry" ) == 0 ) + continue; + if ( ::tqqt_cast<TQLayoutWidget*>(w) || ::tqqt_cast<Spacer*>(w) ) { + if ( qstrcmp( p->name(), "sizePolicy" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "minimumHeight" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "minimumWidth" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumHeight" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumWidth" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "geometry" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "minimumSize" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumSize" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "enabled" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "paletteForegroundColor" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "paletteBackgroundColor" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "paletteBackgroundPixmap" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "palette" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "font" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "cursor" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "mouseTracking" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "focusPolicy" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "acceptDrops" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "autoMask" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "backgroundOrigin" ) == 0 ) + continue; + } + } + if ( ::tqqt_cast<TQActionGroup*>(w) ) { + if ( qstrcmp( p->name(), "usesDropDown" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "toggleAction" ) == 0 ) + continue; + } + if ( qstrcmp( p->name(), "minimumHeight" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "minimumWidth" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumHeight" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "maximumWidth" ) == 0 ) + continue; + if ( qstrcmp( p->name(), "buttonGroupId" ) == 0 ) { // #### remove this when designable in TQ_PROPERTY can take a function (isInButtonGroup() in this case) + if ( !editor->widget()->isWidgetType() || + !editor->widget()->parent() || + !::tqqt_cast<TQButtonGroup*>(editor->widget()->parent()) ) + continue; + } + + bool isPropertyObject = w->isA( "PropertyObject" ); + + if ( ( p->designable(w) || + isPropertyObject && p->designable( ( (PropertyObject*)w )->widgetList().first() ) ) && + ( !isPropertyObject || qstrcmp( p->name(), "name" ) != 0 ) ) { + if ( p->isSetType() ) { + if ( TQString( p->name() ) == "alignment" ) { + TQStringList lst; + lst << p->valueToKey( AlignAuto ) + << p->valueToKey( AlignLeft ) + << p->valueToKey( AlignHCenter ) + << p->valueToKey( AlignRight ) + << p->valueToKey( AlignJustify ); + item = new PropertyListItem( this, item, 0, "hAlign", FALSE ); + item->setValue( lst ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "hAlign" ) ) + item->setChanged( TRUE, FALSE ); + if ( !::tqqt_cast<TQMultiLineEdit*>(editor->widget()) ) { + lst.clear(); + lst << p->valueToKey( AlignTop ) + << p->valueToKey( AlignVCenter ) + << p->valueToKey( AlignBottom ); + item = new PropertyListItem( this, item, 0, "vAlign", FALSE ); + item->setValue( lst ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "vAlign" ) ) + item->setChanged( TRUE, FALSE ); + item = new PropertyBoolItem( this, item, 0, "wordwrap" ); + if ( ::tqqt_cast<TQGroupBox*>(w) ) + item->setVisible( FALSE ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "wordwrap" ) ) + item->setChanged( TRUE, FALSE ); + } + } else { + TQStrList lst( p->enumKeys() ); + TQStringList l; + TQPtrListIterator<char> it( lst ); + while ( it.current() != 0 ) { + l << TQString(*it); + ++it; + } + item = new PropertyEnumItem( this, item, 0, p->name() ); + item->setValue( l ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), p->name() ) ) + item->setChanged( TRUE, FALSE ); + } + } else if ( p->isEnumType() ) { + TQStrList l = p->enumKeys(); + TQStringList lst; + for ( uint i = 0; i < l.count(); ++i ) { + TQString k = l.at( i ); + // filter out enum-masks + if ( k[0] == 'M' && k[1].category() == TQChar::Letter_Uppercase ) + continue; + lst << k; + } + item = new PropertyListItem( this, item, 0, p->name(), FALSE ); + item->setValue( lst ); + } else { + TQVariant::Type t = TQVariant::nameToType( p->type() ); + if ( !addPropertyItem( item, p->name(), t ) ) + continue; + } + } + if ( item && !p->isSetType() ) { + if ( valueSet.findIndex( item->name() ) == -1 ) { + setPropertyValue( item ); + valueSet << item->name(); + } + if ( MetaDataBase::isPropertyChanged( editor->widget(), p->name() ) ) + item->setChanged( TRUE, FALSE ); + } + } + + if ( !::tqqt_cast<TQSplitter*>(w) && !::tqqt_cast<MenuBarEditor*>(w) && !::tqqt_cast<QDesignerToolBar*>(w) && + w->isWidgetType() && WidgetFactory::layoutType( (TQWidget*)w ) != WidgetFactory::NoLayout ) { + item = new PropertyLayoutItem( this, item, 0, "layoutSpacing" ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "layoutSpacing" ) + || MetaDataBase::spacing( editor->widget() ) != -1 ) + layoutInitValue( item, TRUE ); + else + layoutInitValue( item ); + item = new PropertyLayoutItem( this, item, 0, "layoutMargin" ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "layoutMargin" ) + || MetaDataBase::margin( editor->widget() ) != -1 ) + layoutInitValue( item, TRUE ); + else + layoutInitValue( item ); + TQWidget *widget = (TQWidget*)w; + if ( ( !::tqqt_cast<TQLayoutWidget*>(widget) && + widget->parentWidget() && ::tqqt_cast<FormWindow*>(widget->parentWidget()) ) ) { + item = new PropertyListItem( this, item, 0, "resizeMode", FALSE ); + TQStringList lst; + lst << "Auto" << "FreeResize" << "Minimum" << "Fixed"; + item->setValue( lst ); + setPropertyValue( item ); + TQString resizeMod = MetaDataBase::resizeMode( editor->widget() ); + if ( !resizeMod.isEmpty() && + resizeMod != WidgetFactory::defaultCurrentItem( editor->widget(), "resizeMode" ) ) { + item->setChanged( TRUE, FALSE ); + MetaDataBase::setPropertyChanged( editor->widget(), "resizeMode", TRUE ); + } + } + } + + if ( !::tqqt_cast<Spacer*>(w) && !::tqqt_cast<TQLayoutWidget*>(w) && + !::tqqt_cast<MenuBarEditor*>(w) && !::tqqt_cast<QDesignerToolBar*>(w) ) { + item = new PropertyTextItem( this, item, 0, "toolTip", TRUE, FALSE ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "toolTip" ) ) + item->setChanged( TRUE, FALSE ); + item = new PropertyTextItem( this, item, 0, "whatsThis", TRUE, TRUE ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "whatsThis" ) ) + item->setChanged( TRUE, FALSE ); + } + +#ifndef TQT_NO_SQL + if ( !::tqqt_cast<TQDataTable*>(editor->widget()) && !::tqqt_cast<TQDataBrowser*>(editor->widget()) && + !::tqqt_cast<TQDataView*>(editor->widget()) && parent_is_data_aware( ::tqqt_cast<TQWidget*>(editor->widget()) ) ) { + item = new PropertyDatabaseItem( this, item, 0, "database", TQT_BASE_OBJECT(editor->formWindow()->mainContainer()) != TQT_BASE_OBJECT(w) ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "database" ) ) + item->setChanged( TRUE, FALSE ); + } + + if ( ::tqqt_cast<TQDataTable*>(editor->widget()) || ::tqqt_cast<TQDataBrowser*>(editor->widget()) || + ::tqqt_cast<TQDataView*>(editor->widget()) ) { + item = new PropertyDatabaseItem( this, item, 0, "database", FALSE ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "database" ) ) + item->setChanged( TRUE, FALSE ); + item = new PropertyBoolItem( this, item, 0, "frameworkCode" ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), "frameworkCode" ) ) + item->setChanged( TRUE, FALSE ); + } +#endif + + if ( w->isA("PropertyObject") ) { + const TQWidgetList wl = ( (PropertyObject*)w )->widgetList(); + TQPtrListIterator<TQWidget> wIt( wl ); + while ( *wIt ) { + if ( (*wIt)->inherits("CustomWidget") ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)*wIt )->customWidget(); + setupCusWidgetProperties( cw, unique, item ); + } + ++wIt; + } + } else if ( w->inherits( "CustomWidget" ) ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)w )->customWidget(); + setupCusWidgetProperties( cw, unique, item ); + } + + setCurrentItem( firstChild() ); + + if ( showSorted ) { + setSorting( 0 ); + sort(); + setSorting( -1 ); + setCurrentItem( firstChild() ); + tqApp->processEvents(); + } + + updateEditorSize(); +} + +void PropertyList::setupCusWidgetProperties( MetaDataBase::CustomWidget *cw, + TQMap<TQString, bool> &unique, + PropertyItem *&item ) +{ + if ( !cw ) + return; + + for ( TQValueList<MetaDataBase::Property>::Iterator it = + cw->lstProperties.begin(); it != cw->lstProperties.end(); ++it ) { + if ( unique.contains( TQString( (*it).property ) ) ) + continue; + unique.insert( TQString( (*it).property ), TRUE ); + addPropertyItem( item, (*it).property, type_to_variant( (*it).type ) ); + setPropertyValue( item ); + if ( MetaDataBase::isPropertyChanged( editor->widget(), (*it).property ) ) + item->setChanged( TRUE, FALSE ); + } +} + +bool PropertyList::addPropertyItem( PropertyItem *&item, const TQCString &name, TQVariant::Type t ) +{ + if ( name == "buddy" ) { + PropertyListItem *itm = new PropertyListItem( this, item, 0, name, TRUE ); + TQPtrDict<TQWidget> *widgets = editor->formWindow()->widgets(); + TQPtrDictIterator<TQWidget> it( *widgets ); + TQStringList l; + l << ""; + while ( it.current() ) { + if ( editor->formWindow()->canBeBuddy( it.current() ) ) { + if ( l.find( it.current()->name() ) == l.end() ) + l << it.current()->name(); + } + ++it; + } + l.sort(); + itm->setValue( l ); + item = itm; + return TRUE; + } + + switch ( t ) { + case TQVariant::String: + item = new PropertyTextItem( this, item, 0, name, TRUE, + ::tqqt_cast<TQLabel*>(editor->widget()) || + ::tqqt_cast<TQTextView*>(editor->widget()) || + ::tqqt_cast<TQButton*>(editor->widget()) ); + break; + case TQVariant::CString: + item = new PropertyTextItem( this, item, 0, + name, name == "name" && + TQT_BASE_OBJECT(editor->widget()) == TQT_BASE_OBJECT(editor->formWindow()->mainContainer()), + FALSE, TRUE ); + break; + case TQVariant::Bool: + item = new PropertyBoolItem( this, item, 0, name ); + break; + case TQVariant::Font: + item = new PropertyFontItem( this, item, 0, name ); + break; + case TQVariant::Int: + if ( name == "accel" ) + item = new PropertyTextItem( this, item, 0, name, FALSE, FALSE, FALSE, TRUE ); + else if ( name == "layoutSpacing" || name == "layoutMargin" ) + item = new PropertyLayoutItem( this, item, 0, name ); + else if ( name == "resizeMode" ) + item = new PropertyListItem( this, item, 0, name, TRUE ); + else + item = new PropertyIntItem( this, item, 0, name, TRUE ); + break; + case TQVariant::Double: + item = new PropertyDoubleItem( this, item, 0, name ); + break; + case TQVariant::KeySequence: + item = new PropertyKeysequenceItem( this, item, 0, name ); + break; + case TQVariant::UInt: + item = new PropertyIntItem( this, item, 0, name, FALSE ); + break; + case TQVariant::StringList: + item = new PropertyListItem( this, item, 0, name, TRUE ); + break; + case TQVariant::Rect: + item = new PropertyCoordItem( this, item, 0, name, PropertyCoordItem::Rect ); + break; + case TQVariant::Point: + item = new PropertyCoordItem( this, item, 0, name, PropertyCoordItem::Point ); + break; + case TQVariant::Size: + item = new PropertyCoordItem( this, item, 0, name, PropertyCoordItem::Size ); + break; + case TQVariant::Color: + item = new PropertyColorItem( this, item, 0, name, TRUE ); + break; + case TQVariant::Pixmap: + item = new PropertyPixmapItem( this, item, 0, name, PropertyPixmapItem::Pixmap ); + break; + case TQVariant::IconSet: + item = new PropertyPixmapItem( this, item, 0, name, PropertyPixmapItem::IconSet ); + break; + case TQVariant::Image: + item = new PropertyPixmapItem( this, item, 0, name, PropertyPixmapItem::Image ); + break; + case TQVariant::SizePolicy: + item = new PropertySizePolicyItem( this, item, 0, name ); + break; + case TQVariant::Palette: + item = new PropertyPaletteItem( this, item, 0, name ); + break; + case TQVariant::Cursor: + item = new PropertyCursorItem( this, item, 0, name ); + break; + case TQVariant::Date: + item = new PropertyDateItem( this, item, 0, name ); + break; + case TQVariant::Time: + item = new PropertyTimeItem( this, item, 0, name ); + break; + case TQVariant::DateTime: + item = new PropertyDateTimeItem( this, item, 0, name ); + break; + default: + return FALSE; + } + return TRUE; +} + +void PropertyList::paintEmptyArea( TQPainter *p, const TQRect &r ) +{ + p->fillRect( r, *backColor2 ); +} + +void PropertyList::setCurrentItem( TQListViewItem *i ) +{ + if ( !i ) + return; + + if ( currentItem() ) + ( (PropertyItem*)currentItem() )->hideEditor(); + TQListView::setCurrentItem( i ); + ( (PropertyItem*)currentItem() )->showEditor(); +} + +void PropertyList::updateEditorSize() +{ + if ( currentItem() ) + ( ( PropertyItem* )currentItem() )->showEditor(); +} + +/*! This has to be called if the value if \a i should be set as + property to the currently edited widget. +*/ + +void PropertyList::valueChanged( PropertyItem *i ) +{ + if ( !editor->widget() ) + return; + TQString pn( i18n( "Set '%1' of '%2'" ).arg( i->name() ).arg( editor->widget()->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, editor->formWindow(), + editor->widget(), editor, + i->name(), WidgetFactory::property( editor->widget(), i->name() ), + i->value(), i->currentItem(), i->currentItemFromObject() ); + + cmd->execute(); + editor->formWindow()->commandHistory()->addCommand( cmd, TRUE ); +} + +void PropertyList::layoutInitValue( PropertyItem *i, bool changed ) +{ + if ( !editor->widget() ) + return; + TQString pn( i18n( "Set '%1' of '%2'" ).arg( i->name() ).arg( editor->widget()->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, editor->formWindow(), + editor->widget(), editor, + i->name(), WidgetFactory::property( editor->widget(), i->name() ), + i->value(), i->currentItem(), i->currentItemFromObject() ); + cmd->execute(); + if ( i->value().toString() != "-1" ) + changed = TRUE; + i->setChanged( changed ); +} + +void PropertyList::itemPressed( TQListViewItem *i, const TQPoint &p, int c ) +{ + if ( !i ) + return; + PropertyItem *pi = (PropertyItem*)i; + if ( !pi->hasSubItems() ) + return; + + if ( c == 0 && viewport()->mapFromGlobal( p ).x() < 20 ) + toggleOpen( i ); +} + +void PropertyList::toggleOpen( TQListViewItem *i ) +{ + if ( !i ) + return; + PropertyItem *pi = (PropertyItem*)i; + if ( pi->hasSubItems() ) { + pi->setOpen( !pi->isOpen() ); + } else { + pi->toggle(); + } +} + +bool PropertyList::eventFilter( TQObject *o, TQEvent *e ) +{ + if ( !o || !e ) + return TRUE; + + PropertyItem *i = (PropertyItem*)currentItem(); + if ( e->type() == TQEvent::KeyPress ) + theLastEvent = KeyEvent; + else if ( e->type() == TQEvent::MouseButtonPress ) + theLastEvent = MouseEvent; + + if ( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(this) &&e->type() == TQEvent::KeyPress ) { + TQKeyEvent *ke = (TQKeyEvent*)e; + if ( ( ke->key() == Key_Up || ke->key() == Key_Down ) && + ( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(this) || TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(viewport()) ) && + !( ke->state() & ControlButton ) ) { + TQApplication::sendEvent( this, (TQKeyEvent*)e ); + return TRUE; + } else if ( ( !::tqqt_cast<TQLineEdit*>(o) || + ( ::tqqt_cast<TQLineEdit*>(o) && ( (TQLineEdit*)o )->isReadOnly() ) ) && + i && i->hasSubItems() ) { + if ( !i->isOpen() && + ( ke->key() == Key_Plus || + ke->key() == Key_Right )) + i->setOpen( TRUE ); + else if ( i->isOpen() && + ( ke->key() == Key_Minus || + ke->key() == Key_Left ) ) + i->setOpen( FALSE ); + } else if ( ( ke->key() == Key_Return || ke->key() == Key_Enter ) && ::tqqt_cast<TQComboBox*>(o) ) { + TQKeyEvent ke2( TQEvent::KeyPress, Key_Space, 0, 0 ); + TQApplication::sendEvent( o, &ke2 ); + return TRUE; + } + } else if ( e->type() == TQEvent::FocusOut && ::tqqt_cast<TQLineEdit*>(o) && editor->formWindow() ) { + TQTimer::singleShot( 100, editor->formWindow()->commandHistory(), TQT_SLOT( checkCompressedCommand() ) ); + } else if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(viewport()) ) { + TQMouseEvent *me; + PropertyListItem* i; + switch ( e->type() ) { + case TQEvent::MouseButtonPress: + me = (TQMouseEvent*)e; + i = (PropertyListItem*) itemAt( me->pos() ); + if ( i && ( ::tqqt_cast<PropertyColorItem*>(i) || ::tqqt_cast<PropertyPixmapItem*>(i) ) ) { + pressItem = i; + pressPos = me->pos(); + mousePressed = TRUE; + } + break; + case TQEvent::MouseMove: + me = (TQMouseEvent*)e; + if ( me && me->state() & Qt::LeftButton && mousePressed) { + + i = (PropertyListItem*) itemAt( me->pos() ); + if ( i && i == pressItem ) { + + if (( pressPos - me->pos() ).manhattanLength() > TQApplication::startDragDistance() ){ + if ( ::tqqt_cast<PropertyColorItem*>(i) ) { + TQColor col = i->value().asColor(); + TQColorDrag *drg = new TQColorDrag( col, this ); + TQPixmap pix( 25, 25 ); + pix.fill( col ); + TQPainter p( &pix ); + p.drawRect( 0, 0, pix.width(), pix.height() ); + p.end(); + drg->setPixmap( pix ); + mousePressed = FALSE; + drg->dragCopy(); + } + else if ( ::tqqt_cast<PropertyPixmapItem*>(i) ) { + TQPixmap pix = i->value().asPixmap(); + if( !pix.isNull() ) { + TQImage img = pix.convertToImage(); + TQImageDrag *drg = new TQImageDrag( img, this ); + drg->setPixmap( pix ); + mousePressed = FALSE; + drg->dragCopy(); + } + } + } + } + } + break; + default: + break; + } + } else if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(header()) ) { + if ( e->type() == TQEvent::ContextMenu ) { + ((TQContextMenuEvent *)e)->accept(); + TQPopupMenu menu( 0 ); + menu.setCheckable( TRUE ); + const int cat_id = 1; + const int alpha_id = 2; + menu.insertItem( i18n( "Sort &Categorized" ), cat_id ); + int alpha = menu.insertItem( i18n( "Sort &Alphabetically" ), alpha_id ); + if ( showSorted ) + menu.setItemChecked( alpha_id, TRUE ); + else + menu.setItemChecked( cat_id, TRUE ); + int res = menu.exec( ( (TQContextMenuEvent*)e )->globalPos() ); + if ( res != -1 ) { + bool newShowSorted = ( res == alpha ); + if ( showSorted != newShowSorted ) { + showSorted = newShowSorted; + editor->clear(); + editor->setup(); + } + } + return TRUE; + } + } + + return TQListView::eventFilter( o, e ); +} + +/*! This method re-initializes each item of the property list. +*/ + +void PropertyList::refetchData() +{ + TQListViewItemIterator it( this ); + for ( ; it.current(); ++it ) { + PropertyItem *i = (PropertyItem*)it.current(); + if ( !i->propertyParent() ) + setPropertyValue( i ); + if ( i->hasSubItems() ) + i->initChildren(); + bool changed = MetaDataBase::isPropertyChanged( editor->widget(), i->name() ); + if ( ( i->name() == "layoutSpacing" || i->name() == "layoutMargin" ) ) { + if ( i->value().toString() != "-1" ) + i->setChanged( TRUE, FALSE ); + else + i->setChanged( FALSE, FALSE ); + } + else if ( changed != i->isChanged() ) + i->setChanged( changed, FALSE ); + } + updateEditorSize(); +} + +static void clearAlignList( TQStrList &l ) +{ + if ( l.count() == 1 ) + return; + if ( l.find( "AlignAuto" ) != -1 ) + l.remove( "AlignAuto" ); + if ( l.find( "WordBreak" ) != -1 ) + l.remove( "WordBreak" ); +} + +/*! This method initializes the value of the item \a i to the value + of the corresponding property. +*/ + +void PropertyList::setPropertyValue( PropertyItem *i ) +{ + const TQMetaProperty *p = + editor->widget()->metaObject()-> + property( editor->widget()->metaObject()->findProperty( i->name(), TRUE), TRUE ); + if ( !p ) { + if ( i->name() == "hAlign" ) { + int align = editor->widget()->property( "alignment" ).toInt(); + p = editor->widget()->metaObject()-> + property( editor->widget()->metaObject()->findProperty( "alignment", TRUE ), TRUE ); + align &= ~AlignVertical_Mask; + TQStrList l = p->valueToKeys( align ); + clearAlignList( l ); + ( (PropertyListItem*)i )->setCurrentItem( l.last() ); + } else if ( i->name() == "vAlign" ) { + int align = editor->widget()->property( "alignment" ).toInt(); + p = editor->widget()->metaObject()-> + property( editor->widget()->metaObject()->findProperty( "alignment", TRUE ), TRUE ); + align &= ~AlignHorizontal_Mask; + ( (PropertyListItem*)i )->setCurrentItem( p->valueToKeys( align ).last() ); + } else if ( i->name() == "wordwrap" ) { + int align = editor->widget()->property( "alignment" ).toInt(); + if ( align & WordBreak ) + i->setValue( TQVariant( TRUE, 0 ) ); + else + i->setValue( TQVariant( FALSE, 0 ) ); + } else if ( i->name() == "layoutSpacing" ) { + ( (PropertyLayoutItem*)i )->setValue( MetaDataBase::spacing( TQT_TQOBJECT(WidgetFactory::containerOfWidget( TQT_TQWIDGET(editor->widget()) ) ) )); + } else if ( i->name() == "layoutMargin" ) { + ( (PropertyLayoutItem*)i )->setValue( MetaDataBase::margin( TQT_TQOBJECT(WidgetFactory::containerOfWidget( TQT_TQWIDGET(editor->widget()) ) ) )); + } else if ( i->name() == "resizeMode" ) { + ( (PropertyListItem*)i )->setCurrentItem( MetaDataBase::resizeMode( TQT_TQOBJECT(WidgetFactory::containerOfWidget( TQT_TQWIDGET(editor->widget()) ) )) ); + } else if ( i->name() == "toolTip" || i->name() == "whatsThis" || i->name() == "database" || i->name() == "frameworkCode" ) { + i->setValue( MetaDataBase::fakeProperty( editor->widget(), i->name() ) ); + } else if ( editor->widget()->inherits( "CustomWidget" ) ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)editor->widget() )->customWidget(); + if ( !cw ) + return; + i->setValue( MetaDataBase::fakeProperty( editor->widget(), i->name() ) ); + } + return; + } + if ( p->isSetType() ) + ( (PropertyEnumItem*)i )->setCurrentValues( p->valueToKeys( editor->widget()->property( i->name() ).toInt() ) ); + else if ( p->isEnumType() ) + ( (PropertyListItem*)i )->setCurrentItem( p->valueToKey( editor->widget()->property( i->name() ).toInt() ) ); + else if ( qstrcmp( p->name(), "buddy" ) == 0 ) + ( (PropertyListItem*)i )->setCurrentItem( editor->widget()->property( i->name() ).toString() ); + else + i->setValue( editor->widget()->property( i->name() ) ); +} + +void PropertyList::setCurrentProperty( const TQString &n ) +{ + if ( currentItem() && currentItem()->text( 0 ) == n || + currentItem() && ( (PropertyItem*)currentItem() )->propertyParent() && + ( (PropertyItem*)currentItem() )->propertyParent()->text( 0 ) == n ) + return; + + TQListViewItemIterator it( this ); + for ( ; it.current(); ++it ) { + if ( it.current()->text( 0 ) == n ) { + setCurrentItem( it.current() ); + break; + } + } +} + +PropertyEditor *PropertyList::propertyEditor() const +{ + return editor; +} + +void PropertyList::resetProperty() +{ + if ( !currentItem() ) + return; + PropertyItem *i = (PropertyItem*)currentItem(); + if ( !MetaDataBase::isPropertyChanged( editor->widget(), i->PropertyItem::name() ) ) + return; + TQString pn( i18n( "Reset '%1' of '%2'" ).arg( i->name() ).arg( editor->widget()->name() ) ); + SetPropertyCommand *cmd = new SetPropertyCommand( pn, editor->formWindow(), + editor->widget(), editor, + i->name(), i->value(), + WidgetFactory::defaultValue( editor->widget(), i->name() ), + WidgetFactory::defaultCurrentItem( editor->widget(), i->name() ), + i->currentItem(), TRUE ); + cmd->execute(); + editor->formWindow()->commandHistory()->addCommand( cmd, FALSE ); + if ( i->hasSubItems() ) + i->initChildren(); +} + +void PropertyList::viewportDragEnterEvent( TQDragEnterEvent *e ) +{ + PropertyListItem *i = (PropertyListItem*) itemAt( e->pos() ); + if( !i ) { + e->ignore(); + return; + } + + if ( ::tqqt_cast<PropertyColorItem*>(i) && TQColorDrag::canDecode( e ) ) + e->accept(); + else if ( ::tqqt_cast<PropertyPixmapItem*>(i) && TQImageDrag::canDecode( e ) ) + e->accept(); + else + e->ignore(); +} + +void PropertyList::viewportDragMoveEvent ( TQDragMoveEvent *e ) +{ + PropertyListItem *i = (PropertyListItem*) itemAt( e->pos() ); + if( !i ) { + e->ignore(); + return; + } + + if ( ::tqqt_cast<PropertyColorItem*>(i) && TQColorDrag::canDecode( e ) ) + e->accept(); + else if ( ::tqqt_cast<PropertyPixmapItem*>(i) && TQImageDrag::canDecode( e ) ) + e->accept(); + else + e->ignore(); +} + +void PropertyList::viewportDropEvent ( TQDropEvent *e ) +{ + PropertyListItem *i = (PropertyListItem*) itemAt( e->pos() ); + if( !i ) { + e->ignore(); + return; + } + + if ( ::tqqt_cast<PropertyColorItem*>(i) && TQColorDrag::canDecode( e ) ) { + TQColor color; + TQColorDrag::decode( e, color ); + i->setValue( TQVariant( color ) ); + valueChanged( i ); + e->accept(); + } + else if ( ::tqqt_cast<PropertyPixmapItem*>(i) && TQImageDrag::canDecode( e ) ) { + TQImage img; + TQImageDrag::decode( e, img ); + TQPixmap pm; + pm.convertFromImage( img ); + i->setValue( TQVariant( pm ) ); + valueChanged( i ); + e->accept(); + } + else + e->ignore(); +} + +TQString PropertyList::whatsThisAt( const TQPoint &p ) +{ + return whatsThisText( itemAt( p ) ); +} + +void PropertyList::showCurrentWhatsThis() +{ + if ( !currentItem() ) + return; + TQPoint p( 0, currentItem()->itemPos() ); + p = viewport()->mapToGlobal( contentsToViewport( p ) ); + TQWhatsThis::display( whatsThisText( currentItem() ), p, viewport() ); +} + +TQString PropertyList::whatsThisText( TQListViewItem *i ) +{ + if ( !i || !editor->widget() ) + return TQString(); + readPropertyDocs(); + if ( ( (PropertyItem*)i )->propertyParent() ) + i = ( (PropertyItem*)i )->propertyParent(); + + const TQMetaObject *mo = editor->widget()->metaObject(); + TQString prop = ( (PropertyItem*)i )->name(); + while ( mo ) { + TQString s; + s = TQString( mo->className() ) + "::" + prop; + TQMap<TQString, TQString>::Iterator it; + if ( ( it = propertyDocs.find( s ) ) != propertyDocs.end() ) { + return *it; + } + mo = mo->superClass(); + } + + return i18n( "<p><b>TQWidget::%1</b></p><p>There is no documentation available for this property.</p>" ).arg( prop ); +} + +void PropertyList::readPropertyDocs() +{ + if ( !propertyDocs.isEmpty() ) + return; + + TQString docFile = MainWindow::self->documentationPath() + "/propertydocs"; + TQFile f( docFile ); + if ( !f.open( IO_ReadOnly ) ) + return; + TQDomDocument doc; + TQString errMsg; + int errLine; + if ( !doc.setContent( &f, &errMsg, &errLine ) ) + return; + TQDomElement e = doc.firstChild().toElement().firstChild().toElement(); + + for ( ; !e.isNull(); e = e.nextSibling().toElement() ) { + TQDomElement n = e.firstChild().toElement(); + TQString name; + TQString doc; + for ( ; !n.isNull(); n = n.nextSibling().toElement() ) { + if ( n.tagName() == "name" ) + name = n.firstChild().toText().data(); + else if ( n.tagName() == "doc" ) + doc = n.firstChild().toText().data(); + } + doc.insert( 0, "<p><b>" + name + "</b></p>" ); + propertyDocs.insert( name, doc ); + } +} + +PropertyList::LastEventType PropertyList::lastEvent() +{ + return theLastEvent; +} +// ------------------------------------------------------------ + +EventList::EventList( TQWidget *parent, FormWindow *fw, PropertyEditor *e ) + : HierarchyList( parent, fw, TRUE ), editor( e ) +{ + header()->hide(); + removeColumn( 1 ); + setRootIsDecorated( TRUE ); + connect( this, TQT_SIGNAL( itemRenamed( TQListViewItem *, int, const TQString & ) ), + this, TQT_SLOT( renamed( TQListViewItem * ) ) ); +} + +TQString clean_arguments( const TQString &s ) +{ + TQString slot = s; + TQString arg = slot.mid( slot.find( '(' ) + 1 ); + arg = arg.left( arg.findRev( ')' ) ); + TQStringList args = TQStringList::split( ',', arg ); + slot = slot.left( slot.find( '(' ) + 1 ); + int num = 0; + for ( TQStringList::Iterator it = args.begin(); it != args.end(); ++it, ++num ) { + TQString a = *it; + int i; + if ( ( i =a.find( ':' ) ) == -1 ) + slot += a.simplifyWhiteSpace(); + else + slot += a.mid( i + 1 ).simplifyWhiteSpace(); + if ( num < (int)args.count() - 1 ) + slot += ","; + } + + slot += ")"; + + return slot; +} + + +void EventList::setup() +{ + clear(); + + if ( !formWindow ) + return; + LanguageInterface *iface = MetaDataBase::languageInterface( formWindow->project()->language() ); + const TQPixmap DesignerEditSlotsPix = SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()); + TQStrList sigs; + if ( iface ) + { + sigs = iface->signalNames( editor->widget() ); + } + TQStrListIterator it( sigs ); + while ( it.current() ) { + HierarchyItem *eventItem = new HierarchyItem( HierarchyItem::Event, this, (HierarchyItem*)0, + it.current(), TQString(), TQString() ); + eventItem->setOpen( TRUE ); + TQValueList<MetaDataBase::Connection> conns = + MetaDataBase::connections( TQT_TQOBJECT(formWindow), TQT_TQOBJECT(editor->widget()), TQT_TQOBJECT(formWindow->mainContainer()) ); + HierarchyItem *item = 0; + for ( TQValueList<MetaDataBase::Connection>::Iterator cit = conns.begin(); + cit != conns.end(); ++cit ) { + TQString s = it.current(); + if ( MetaDataBase::normalizeFunction( clean_arguments( TQString( (*cit).signal ) ) ) != + MetaDataBase::normalizeFunction( clean_arguments( s ) ) ) + continue; + item = new HierarchyItem( HierarchyItem::EventFunction, eventItem, item, + (*cit).slot, TQString(), TQString() ); + item->setPixmap( 0, DesignerEditSlotsPix ); + } + ++it; + } +} + +extern TQListViewItem *newItem; + +void EventList::contentsMouseDoubleClickEvent( TQMouseEvent *e ) +{ + TQListViewItem *i = itemAt( contentsToViewport( e->pos() ) ); + if ( !i || i->parent() ) + return; + TQString s; + if ( !formWindow->project()->isCpp() ) { + TQString s1 = i->text( 0 ); + int pt = s1.find( "(" ); + if ( pt != -1 ) + s1 = s1.left( pt ); + s = TQString( editor->widget()->name() ) + "_" + s1; + } else { + s = TQString( editor->widget()->name() ) + "_" + i->text( 0 ); + } + + const TQPixmap DesignerEditSlotsPix = SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()); + insertEntry( i, DesignerEditSlotsPix , s ); +} + +void EventList::setCurrent( TQWidget * ) +{ +} + +void EventList::objectClicked( TQListViewItem *i ) +{ + if ( !i || !i->parent() ) + return; +// formWindow->clearSelection(false); + formWindow->mainWindow()->part()->emitEditFunction(formWindow->fileName(), i->text( 0 )); +// formWindow->mainWindow()->editFunction( i->text( 0 ) ); +} + +void EventList::showRMBMenu( TQListViewItem *i, const TQPoint &pos ) +{ + if ( !i ) + return; + TQPopupMenu menu; + const int NEW_ITEM = 1; + const int DEL_ITEM = 2; + menu.insertItem( SmallIcon( "designer_filenew.png" , KDevDesignerPartFactory::instance()), i18n( "New Signal Handler" ), NEW_ITEM ); + menu.insertItem( SmallIcon( "designer_editcut.png" , KDevDesignerPartFactory::instance()), i18n( "Delete Signal Handler" ), DEL_ITEM ); + int res = menu.exec( pos ); + if ( res == NEW_ITEM ) { + TQString s; + if ( !formWindow->project()->isCpp() ) { + TQString s1 = ( i->parent() ? i->parent() : i )->text( 0 ); + int pt = s1.find( "(" ); + if ( pt != -1 ) + s1 = s1.left( pt ); + s = TQString( editor->widget()->name() ) + "_" + s1; + } else { + s = TQString( editor->widget()->name() ) + "_" + ( i->parent() ? i->parent() : i )->text( 0 ); + } + insertEntry( i->parent() ? i->parent() : i, SmallIcon( "designer_editslots.png" , KDevDesignerPartFactory::instance()), s ); + } else if ( res == DEL_ITEM && i->parent() ) { + MetaDataBase::Connection conn; + conn.sender = editor->widget(); + conn.receiver = TQT_TQOBJECT(formWindow->mainContainer()); + conn.signal = i->parent()->text( 0 ); + conn.slot = i->text( 0 ); + delete i; + RemoveConnectionCommand *cmd = new RemoveConnectionCommand( i18n( "Remove Connection" ), + formWindow, + conn ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + editor->formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + } +} + +void EventList::renamed( TQListViewItem *i ) +{ + if ( newItem == i ) + newItem = 0; + if ( !i->parent() ) + return; + TQListViewItem *itm = i->parent()->firstChild(); + bool del = FALSE; + while ( itm ) { + if ( itm != i && itm->text( 0 ) == i->text( 0 ) ) { + del = TRUE; + break; + } + itm = itm->nextSibling(); + } + i->setRenameEnabled( 0, FALSE ); + if ( del ) { + delete i; + } else { + MetaDataBase::Connection conn; + conn.sender = editor->widget(); + conn.receiver = TQT_TQOBJECT(formWindow->mainContainer()); + conn.signal = i->parent()->text( 0 ); + conn.slot = i->text( 0 ); + AddConnectionCommand *cmd = new AddConnectionCommand( i18n( "Add Connection" ), + formWindow, + conn ); + formWindow->commandHistory()->addCommand( cmd ); + // #### we should look if the specified slot already + // exists and if we can connect to this one + TQString funcname = i->text( 0 ).latin1(); + if ( funcname.find( '(' ) == -1 ) { // try to create a signature + TQString sig = i->parent()->text( 0 ); + sig = sig.mid( sig.find( '(' ) + 1 ); + sig.remove( (int)sig.length() - 1, 1 ); + LanguageInterface *iface = MetaDataBase::languageInterface( formWindow->project()->language() ); + if ( iface ) + sig = iface->createArguments( sig.simplifyWhiteSpace() ); + funcname += "(" + sig + ")"; + } + + //normally add a function in kdevdesigner + AddFunctionCommand *cmd2 = new AddFunctionCommand( i18n( "Add Function" ), + formWindow, funcname.latin1(), "virtual", + "public", + "slot", formWindow->project()->language(), + "void" ); + +/* MetaDataBase::addFunction( formWindow, funcname.latin1(), "virtual", "public", + "slot", formWindow->project()->language(), "void" ); + editor->formWindow()->mainWindow()-> + editFunction( i->text( 0 ).left( i->text( 0 ).find( "(" ) ), TRUE );*/ + cmd->execute(); + cmd2->execute(); + editor->formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + editor->formWindow()->formFile()->setModified( TRUE ); + } +} + +void EventList::save( TQListViewItem *p ) +{ + TQStringList lst; + TQListViewItem *i = p->firstChild(); + while ( i ) { + lst << i->text( 0 ); + i = i->nextSibling(); + } +} + +// -------------------------------------------------------------- + +/*! + \class PropertyEditor propertyeditor.h + \brief PropertyEdior toplevel window + + This is the toplevel window of the property editor which contains a + listview for editing properties. +*/ + +PropertyEditor::PropertyEditor( TQWidget *parent ) + : TQTabWidget( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | + WStyle_StaysOnTop | WStyle_Tool |WStyle_MinMax | WStyle_SysMenu ) +{ + setCaption( i18n( "Property Editor" ) ); + wid = 0; + formwindow = 0; + listview = new PropertyList( this ); + addTab( listview, i18n( "P&roperties" ) ); + eList = new EventList( this, formWindow(), this ); + addTab( eList, i18n( "Signa&l Handlers" ) ); +} + +TQObject *PropertyEditor::widget() const +{ + return wid; +} + +void PropertyEditor::setWidget( TQObject *w, FormWindow *fw ) +{ + if ( fw && fw->isFake() ) + w = fw->project()->objectForFakeForm( fw ); + eList->setFormWindow( fw ); + if ( w && w == wid ) { + // if there is no properties displayed then we really should show them. + // to do this check the number of properties in the list. + bool ret = (listview->childCount() > 0) ? TRUE : FALSE; + if ( wid->isWidgetType() && WidgetFactory::layoutType( (TQWidget*)wid ) != WidgetFactory::NoLayout ) { + TQListViewItemIterator it( listview ); + ret = FALSE; + while ( it.current() ) { + if ( it.current()->text( 0 ) == "layoutSpacing" || it.current()->text( 0 ) == "layoutMargin" ) { + ret = TRUE; + break; + } + ++it; + } + } + if ( ret ) + return; + } + + if ( !w || !fw ) { + setCaption( i18n( "Property Editor" ) ); + clear(); + wid = 0; + formwindow = 0; + return; + } + + wid = w; + formwindow = fw; + setCaption( i18n( "Property Editor (%1)" ).arg( formwindow->name() ) ); + listview->viewport()->setUpdatesEnabled( FALSE ); + listview->setUpdatesEnabled( FALSE ); + clear(); + listview->viewport()->setUpdatesEnabled( TRUE ); + listview->setUpdatesEnabled( TRUE ); + setup(); +} + +void PropertyEditor::clear() +{ + listview->setContentsPos( 0, 0 ); + listview->clear(); + eList->setContentsPos( 0, 0 ); + eList->clear(); +} + +void PropertyEditor::setup() +{ + if ( !formwindow || !wid ) + return; + listview->viewport()->setUpdatesEnabled( FALSE ); + listview->setupProperties(); + listview->viewport()->setUpdatesEnabled( TRUE ); + listview->updateEditorSize(); + + if ( !wid->isA( "PropertyObject" ) ) { + eList->viewport()->setUpdatesEnabled( FALSE ); + eList->setup(); + eList->viewport()->setUpdatesEnabled( TRUE ); + } +} + +void PropertyEditor::refetchData() +{ + listview->refetchData(); +} + +void PropertyEditor::emitWidgetChanged() +{ + if ( formwindow && wid ) + formwindow->widgetChanged( wid ); +} + +void PropertyEditor::closed( FormWindow *w ) +{ + if ( w == formwindow ) { + formwindow = 0; + wid = 0; + clear(); + } +} + +void PropertyEditor::closeEvent( TQCloseEvent *e ) +{ + emit hidden(); + e->accept(); +} + +PropertyList *PropertyEditor::propertyList() const +{ + return listview; +} + +FormWindow *PropertyEditor::formWindow() const +{ + return formwindow; +} + +TQString PropertyEditor::currentProperty() const +{ + if ( !wid ) + return TQString(); + if ( ( (PropertyItem*)listview->currentItem() )->propertyParent() ) + return ( (PropertyItem*)listview->currentItem() )->propertyParent()->name(); + return ( (PropertyItem*)listview->currentItem() )->name(); +} + +TQString PropertyEditor::classOfCurrentProperty() const +{ + if ( !wid ) + return TQString(); + TQObject *o = wid; + TQString curr = currentProperty(); + TQMetaObject *mo = o->metaObject(); + while ( mo ) { + TQStrList props = mo->propertyNames( FALSE ); + if ( props.find( curr.latin1() ) != -1 ) + return mo->className(); + mo = mo->superClass(); + } + return TQString(); +} + +TQMetaObject* PropertyEditor::metaObjectOfCurrentProperty() const +{ + if ( !wid ) + return 0; + return wid->metaObject(); +} + +void PropertyEditor::resetFocus() +{ + if ( listview->currentItem() ) + ( (PropertyItem*)listview->currentItem() )->showEditor(); +} + +EventList *PropertyEditor::eventList() const +{ + return eList; +} + +void PropertyEditor::setPropertyEditorEnabled( bool b ) +{ + if ( !b ) + removePage( listview ); + else + insertTab( listview, i18n( "Property Editor" ), 0 ); + updateWindow(); +} + +void PropertyEditor::setSignalHandlersEnabled( bool b ) +{ + if ( !b ) + removePage( eList ); + else + insertTab( eList, i18n( "Signal Handlers" ), 0 ); + updateWindow(); +} + +void PropertyEditor::updateWindow() +{ + if ( isHidden() && count() ) { + parentWidget()->show(); + MainWindow::self->setAppropriate( (TQDockWindow*)parentWidget(), TRUE ); + } else if ( isShown() && !count() ) { + parentWidget()->hide(); + MainWindow::self->setAppropriate( (TQDockWindow*)parentWidget(), FALSE ); + } +} diff --git a/kdevdesigner/designer/propertyeditor.h b/kdevdesigner/designer/propertyeditor.h new file mode 100644 index 00000000..7b7eccd8 --- /dev/null +++ b/kdevdesigner/designer/propertyeditor.h @@ -0,0 +1,891 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef PROPERTYEDITOR_H +#define PROPERTYEDITOR_H + +#include <tqfeatures.h> +#include <tqvariant.h> +#include <tqlistview.h> +#include <tqptrlist.h> +#include <tqguardedptr.h> +#include <tqtabwidget.h> +#include <tqmodules.h> +#include <tqptrlist.h> +#include <tqlayout.h> +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include "hierarchyview.h" +#include "metadatabase.h" + +class PropertyList; +class PropertyEditor; +class TQPainter; +class TQColorGroup; +class TQLineEdit; +class TQPushButton; +class TQHBox; +class TQSpinBox; +class TQLabel; +class TQFrame; +class FormWindow; +class TQCloseEvent; +class TQResizeEvent; +class PropertyWhatsThis; +class TQDateEdit; +class TQTimeEdit; +class TQDateTimeEdit; + +class PropertyItem : public TQListViewItem +{ +public: + PropertyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ); + ~PropertyItem(); + + void paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align ); + void paintBranches( TQPainter * p, const TQColorGroup & cg, + int w, int y, int h ); + void paintFocus( TQPainter *p, const TQColorGroup &cg, const TQRect &r ); + + virtual bool hasSubItems() const; + virtual void createChildren(); + virtual void initChildren(); + + bool isOpen() const; + void setOpen( bool b ); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + TQVariant value() const; + TQString name() const; + virtual void notifyValueChange(); + + virtual void setChanged( bool b, bool updateDb = TRUE ); + bool isChanged() const; + + virtual void placeEditor( TQWidget *w ); + + virtual PropertyItem *propertyParent() const; + virtual void childValueChanged( PropertyItem *child ); + + void addChild( PropertyItem *i ); + int childCount() const; + PropertyItem *child( int i ) const; + + virtual bool hasCustomContents() const; + virtual void drawCustomContents( TQPainter *p, const TQRect &r ); + + void updateBackColor(); + + void setup() { TQListViewItem::setup(); setHeight( TQListViewItem::height() + 2 ); } + + virtual TQString currentItem() const; + virtual int currentIntItem() const; + virtual void setCurrentItem( const TQString &s ); + virtual void setCurrentItem( int i ); + virtual int currentIntItemFromObject() const; + virtual TQString currentItemFromObject() const; + + void setFocus( TQWidget *w ); + + virtual void toggle(); + void setText( int col, const TQString &txt ); + +protected: + PropertyList *listview; + TQVariant val; + +private: + TQColor backgroundColor(); + void createResetButton(); + void updateResetButtonState(); + +private: + bool open, changed; + PropertyItem *property; + TQString propertyName; + TQPtrList<PropertyItem> children; + TQColor backColor; + TQPushButton *resetButton; + +}; + +class PropertyTextItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyTextItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool comment, bool multiLine, bool ascii = FALSE, bool a = FALSE ); + ~PropertyTextItem(); + + virtual void createChildren(); + virtual void initChildren(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual bool hasSubItems() const; + virtual void childValueChanged( PropertyItem *child ); + + virtual void setChanged( bool b, bool updateDb = TRUE ); + +private slots: + void setValue(); + void getText(); + +private: + TQLineEdit *lined(); + TQGuardedPtr<TQLineEdit> lin; + TQGuardedPtr<TQHBox> box; + TQPushButton *button; + bool withComment, hasMultiLines, asciiOnly, accel; + +}; + + +class PropertyBoolItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyBoolItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ); + ~PropertyBoolItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual void toggle(); + +private slots: + void setValue(); + +private: + TQComboBox *combo(); + TQGuardedPtr<TQComboBox> comb; + +}; + +class PropertyIntItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyIntItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool s ); + ~PropertyIntItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQSpinBox *spinBox(); + TQGuardedPtr<TQSpinBox> spinBx; + bool signedValue; + +}; + +class PropertyLayoutItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyLayoutItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertyLayoutItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQSpinBox *spinBox(); + TQGuardedPtr<TQSpinBox> spinBx; + +}; + +class PropertyDoubleItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyDoubleItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertyDoubleItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQLineEdit *lined(); + TQGuardedPtr<TQLineEdit> lin; +}; + +class PropertyListItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyListItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool editable ); + ~PropertyListItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + + TQString currentItem() const; + int currentIntItem() const; + void setCurrentItem( const TQString &s ); + void setCurrentItem( int i ); + int currentIntItemFromObject() const; + TQString currentItemFromObject() const; + void addItem( const TQString &s ); + +private slots: + void setValue(); + +private: + TQComboBox *combo(); + TQGuardedPtr<TQComboBox> comb; + int oldInt; + bool editable; + TQString oldString; + +}; + +class PropertyFontItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyFontItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ); + ~PropertyFontItem(); + + virtual void createChildren(); + virtual void initChildren(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual bool hasSubItems() const; + virtual void childValueChanged( PropertyItem *child ); + +private slots: + void getFont(); + +private: + TQGuardedPtr<TQLineEdit> lined; + TQGuardedPtr<TQPushButton> button; + TQGuardedPtr<TQHBox> box; + +}; + +class PropertyCoordItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + enum Type { Rect, Size, Point }; + + PropertyCoordItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, Type t ); + ~PropertyCoordItem(); + + virtual void createChildren(); + virtual void initChildren(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual bool hasSubItems() const; + virtual void childValueChanged( PropertyItem *child ); + +private: + TQLineEdit *lined(); + TQGuardedPtr<TQLineEdit> lin; + Type typ; + +}; + +class PropertyColorItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyColorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, bool children ); + ~PropertyColorItem(); + + virtual void createChildren(); + virtual void initChildren(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual bool hasSubItems() const; + virtual void childValueChanged( PropertyItem *child ); + + virtual bool hasCustomContents() const; + virtual void drawCustomContents( TQPainter *p, const TQRect &r ); + +private slots: + void getColor(); + +private: + TQGuardedPtr<TQHBox> box; + TQGuardedPtr<TQFrame> colorPrev; + TQGuardedPtr<TQPushButton> button; + bool withChildren; + +}; + +class PropertyPixmapItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + enum Type { Pixmap, IconSet, Image }; + + PropertyPixmapItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName, Type t ); + ~PropertyPixmapItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + + virtual bool hasCustomContents() const; + virtual void drawCustomContents( TQPainter *p, const TQRect &r ); + +private slots: + void getPixmap(); + +private: + TQGuardedPtr<TQHBox> box; + TQGuardedPtr<TQLabel> pixPrev; + TQPushButton *button; + Type type; + +}; + + +class PropertySizePolicyItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertySizePolicyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertySizePolicyItem(); + + virtual void createChildren(); + virtual void initChildren(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual bool hasSubItems() const; + virtual void childValueChanged( PropertyItem *child ); + +private: + TQLineEdit *lined(); + TQGuardedPtr<TQLineEdit> lin; + +}; + +class PropertyPaletteItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyPaletteItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertyPaletteItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + + virtual bool hasCustomContents() const; + virtual void drawCustomContents( TQPainter *p, const TQRect &r ); + +private slots: + void getPalette(); + +private: + TQGuardedPtr<TQHBox> box; + TQGuardedPtr<TQLabel> palettePrev; + TQGuardedPtr<TQPushButton> button; + +}; + +class PropertyCursorItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyCursorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertyCursorItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQComboBox *combo(); + TQGuardedPtr<TQComboBox> comb; + +}; + +class PropertyKeysequenceItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyKeysequenceItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertyKeysequenceItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + bool eventFilter( TQObject *o, TQEvent *e ); + void handleKeyEvent( TQKeyEvent *e ); + int translateModifiers( int state ); + + TQGuardedPtr<TQLineEdit> sequence; + TQGuardedPtr<TQHBox> box; + int k1,k2,k3,k4; + int num; + bool mouseEnter; +}; + +class PropertyDatabaseItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyDatabaseItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName, bool wField ); + ~PropertyDatabaseItem(); + + virtual void createChildren(); + virtual void initChildren(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + virtual bool hasSubItems() const; + virtual void childValueChanged( PropertyItem *child ); + +private: + TQGuardedPtr<TQLineEdit> lined; + TQGuardedPtr<TQPushButton> button; + TQGuardedPtr<TQHBox> box; + bool withField; + +}; + +struct EnumItem { + EnumItem( const TQString &k, bool s ) + : key( k ), selected( s ) {} + EnumItem() : key( TQString() ), selected( FALSE ) {} + bool operator==( const EnumItem &item ) const { + return key == item.key; + } + TQString key; + bool selected; +}; + +class EnumPopup : public TQFrame +{ + Q_OBJECT + + +public: + EnumPopup( TQWidget *parent, const char *name, WFlags f=0 ); + ~EnumPopup(); + void insertEnums( TQValueList<EnumItem> lst ); + TQValueList<EnumItem> enumList() const; + void closeWidget(); + +signals: + void closed(); + void hidden(); + +protected: + void keyPressEvent( TQKeyEvent *e ); + +private: + TQValueList<EnumItem> itemList; + TQPtrList<TQCheckBox> checkBoxList; + TQVBoxLayout *popLayout; +}; + +class EnumBox : public TQComboBox +{ + Q_OBJECT + + +public: + EnumBox( TQWidget *parent, const char *name = 0 ); + ~EnumBox() {} + void setText( const TQString &text ); + void insertEnums( TQValueList<EnumItem> lst ); + TQValueList<EnumItem> enumList() const; + +signals: + void aboutToShowPopup(); + void valueChanged(); + +protected: + void paintEvent( TQPaintEvent * ); + void mousePressEvent( TQMouseEvent *e ); + void keyPressEvent( TQKeyEvent *e ); + +protected slots: + void restoreArrow(); + void popupHidden(); + void popupClosed(); + +private: + void popup(); + bool arrowDown; + TQString str; + bool popupShown; + EnumPopup *pop; + +}; +class PropertyEnumItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyEnumItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, + const TQString &propName ); + ~PropertyEnumItem(); + + void showEditor(); + void hideEditor(); + void setValue( const TQVariant &v ); + TQString currentItem() const; + TQString currentItemFromObject() const; + void setCurrentValues( TQStrList lst ); + +private slots: + void setValue(); + void insertEnums(); + +private: + TQGuardedPtr<EnumBox> box; + TQValueList<EnumItem> enumList; + TQString enumString; +}; + +class PropertyList : public TQListView +{ + Q_OBJECT + + +public: + PropertyList( PropertyEditor *e ); + + virtual void setupProperties(); + + virtual void setCurrentItem( TQListViewItem *i ); + virtual void valueChanged( PropertyItem *i ); + virtual void refetchData(); + virtual void setPropertyValue( PropertyItem *i ); + virtual void setCurrentProperty( const TQString &n ); + + void layoutInitValue( PropertyItem *i, bool changed = FALSE ); + PropertyEditor *propertyEditor() const; + TQString whatsThisAt( const TQPoint &p ); + void showCurrentWhatsThis(); + + enum LastEventType { KeyEvent, MouseEvent }; + LastEventType lastEvent(); + +public slots: + void updateEditorSize(); + void resetProperty(); + void toggleSort(); + +private slots: + void itemPressed( TQListViewItem *i, const TQPoint &p, int c ); + void toggleOpen( TQListViewItem *i ); + bool eventFilter( TQObject *o, TQEvent *e ); + +protected: + void resizeEvent( TQResizeEvent *e ); + void paintEmptyArea( TQPainter *p, const TQRect &r ); + bool addPropertyItem( PropertyItem *&item, const TQCString &name, TQVariant::Type t ); + + void viewportDragEnterEvent( TQDragEnterEvent * ); + void viewportDragMoveEvent ( TQDragMoveEvent * ); + void viewportDropEvent ( TQDropEvent * ); + +protected: + PropertyEditor *editor; + +private: + void readPropertyDocs(); + void setupCusWidgetProperties( MetaDataBase::CustomWidget *cw, + TQMap<TQString, bool> &unique, + PropertyItem *&item ); + TQString whatsThisText( TQListViewItem *i ); + +private: + PropertyListItem* pressItem; + TQPoint pressPos; + bool mousePressed; + bool showSorted; + TQMap<TQString, TQString> propertyDocs; + PropertyWhatsThis *whatsThis; + LastEventType theLastEvent; +}; + +class EventList : public HierarchyList +{ + Q_OBJECT + + +public: + EventList( TQWidget *parent, FormWindow *fw, PropertyEditor *e ); + + void setup(); + void setCurrent( TQWidget *w ); + +protected: + void contentsMouseDoubleClickEvent( TQMouseEvent *e ); + +private: + void save( TQListViewItem *p ); + +private slots: + void objectClicked( TQListViewItem *i ); + void showRMBMenu( TQListViewItem *, const TQPoint & ); + void renamed( TQListViewItem *i ); + +private: + PropertyEditor *editor; + +}; + + +class PropertyEditor : public TQTabWidget +{ + Q_OBJECT + + +public: + PropertyEditor( TQWidget *parent ); + + TQObject *widget() const; + + void clear(); + void setup(); + + void emitWidgetChanged(); + void refetchData(); + + void closed( FormWindow *w ); + + PropertyList *propertyList() const; + FormWindow *formWindow() const; + EventList *eventList() const; + + TQString currentProperty() const; + TQString classOfCurrentProperty() const; + TQMetaObject* metaObjectOfCurrentProperty() const; + + void resetFocus(); + + void setPropertyEditorEnabled( bool b ); + void setSignalHandlersEnabled( bool b ); + +signals: + void hidden(); + +public slots: + void setWidget( TQObject *w, FormWindow *fw ); + +protected: + void closeEvent( TQCloseEvent *e ); + +private: + void updateWindow(); + +private: + TQObject *wid; + PropertyList *listview; + EventList *eList; + FormWindow *formwindow; + +}; + +class PropertyDateItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyDateItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ); + ~PropertyDateItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQDateEdit *lined(); + TQGuardedPtr<TQDateEdit> lin; + +}; + +class PropertyTimeItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ); + ~PropertyTimeItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQTimeEdit *lined(); + TQGuardedPtr<TQTimeEdit> lin; + +}; + +class PropertyDateTimeItem : public TQObject, + public PropertyItem +{ + Q_OBJECT + + +public: + PropertyDateTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const TQString &propName ); + ~PropertyDateTimeItem(); + + virtual void showEditor(); + virtual void hideEditor(); + + virtual void setValue( const TQVariant &v ); + +private slots: + void setValue(); + +private: + TQDateTimeEdit *lined(); + TQGuardedPtr<TQDateTimeEdit> lin; + +}; + +#endif diff --git a/kdevdesigner/designer/propertyobject.cpp b/kdevdesigner/designer/propertyobject.cpp new file mode 100644 index 00000000..1bd1883f --- /dev/null +++ b/kdevdesigner/designer/propertyobject.cpp @@ -0,0 +1,158 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "propertyobject.h" +#include "metadatabase.h" +#include <tqptrvector.h> +#include <tqptrlist.h> +#include <tqmetaobject.h> +#include <tqvariant.h> + +PropertyObject::PropertyObject( const TQWidgetList &objs ) + : TQObject(), objects( objs ), mobj( 0 ) +{ + TQPtrVector<TQPtrList<TQMetaObject> > v; + v.resize( objects.count() ); + v.setAutoDelete( TRUE ); + + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) { + const TQMetaObject *m = o->metaObject(); + TQPtrList<TQMetaObject> *mol = new TQPtrList<TQMetaObject>; + while ( m ) { + mol->insert( 0, m ); + m = m->superClass(); + } + v.insert( v.count(), mol ); + } + + int numObjects = objects.count(); + int minDepth = v[0]->count(); + int depth = minDepth; + + for ( int i = 0; i < numObjects; ++i ) { + depth = (int)v[i]->count(); + if ( depth < minDepth ) + minDepth = depth; + } + + const TQMetaObject *m = v[0]->at( --minDepth ); + + for ( int j = 0; j < numObjects; ++j ) { + if ( v[j]->at( minDepth ) != m ) { + m = v[0]->at( --minDepth ); + j = 0; + } + } + + mobj = m; + + Q_ASSERT( mobj ); +} + +bool PropertyObject::setProperty( const char *name, const TQVariant& value ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) + o->setProperty( name, value ); + + return TRUE; +} + +TQVariant PropertyObject::property( const char *name ) const +{ + return ( (PropertyObject*)this )->objects.first()->property( name ); +} + +void PropertyObject::mdPropertyChanged( const TQString &property, bool changed ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) + MetaDataBase::setPropertyChanged( o, property, changed ); +} + +bool PropertyObject::mdIsPropertyChanged( const TQString &property ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) { + if ( MetaDataBase::isPropertyChanged( o, property ) ) + return TRUE; + } + return FALSE; +} + +void PropertyObject::mdSetPropertyComment( const TQString &property, const TQString &comment ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) + MetaDataBase::setPropertyComment( o, property, comment ); +} + +TQString PropertyObject::mdPropertyComment( const TQString &property ) +{ + return MetaDataBase::propertyComment( TQT_TQOBJECT(objects.first()), property ); +} + +void PropertyObject::mdSetFakeProperty( const TQString &property, const TQVariant &value ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) + MetaDataBase::setFakeProperty( o, property, value ); +} + +TQVariant PropertyObject::mdFakeProperty( const TQString &property ) +{ + return MetaDataBase::fakeProperty( TQT_TQOBJECT(objects.first()), property ); +} + +void PropertyObject::mdSetCursor( const TQCursor &c ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) { + if ( o->isWidgetType() ) + MetaDataBase::setCursor( (TQWidget*)o, c ); + } +} + +TQCursor PropertyObject::mdCursor() +{ + return MetaDataBase::cursor( objects.first() ); +} + +void PropertyObject::mdSetPixmapKey( int pixmap, const TQString &arg ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) + MetaDataBase::setPixmapKey( o, pixmap, arg ); +} + +TQString PropertyObject::mdPixmapKey( int pixmap ) +{ + return MetaDataBase::pixmapKey( TQT_TQOBJECT(objects.first()), pixmap ); +} + +void PropertyObject::mdSetExportMacro( const TQString ¯o ) +{ + for ( TQObject *o = TQT_TQOBJECT(objects.first()); o; o = TQT_TQOBJECT(objects.next()) ) + MetaDataBase::setExportMacro( o, macro ); +} + +TQString PropertyObject::mdExportMacro() +{ + return MetaDataBase::exportMacro( TQT_TQOBJECT(objects.first()) ); +} diff --git a/kdevdesigner/designer/propertyobject.h b/kdevdesigner/designer/propertyobject.h new file mode 100644 index 00000000..2590399a --- /dev/null +++ b/kdevdesigner/designer/propertyobject.h @@ -0,0 +1,43 @@ +#ifndef PROPERTYOBJECT_H +#define PROPERTYOBJECT_H + +#include <tqobject.h> +#include <tqwidgetlist.h> +#include <tqcursor.h> + +class PropertyObject : public TQObject +{ +public: + TQMetaObject *metaObject() const { return (TQMetaObject*)mobj; } + const char *className() const { return "PropertyObject"; } + TQObject* qObject() { return (TQObject*)this; } +private: + static TQMetaObject *metaObj; + +public: + PropertyObject( const TQWidgetList &objs ); + + bool setProperty( const char *name, const TQVariant& value ); + TQVariant property( const char *name ) const; + + void mdPropertyChanged( const TQString &property, bool changed ); + bool mdIsPropertyChanged( const TQString &property ); + void mdSetPropertyComment( const TQString &property, const TQString &comment ); + TQString mdPropertyComment( const TQString &property ); + void mdSetFakeProperty( const TQString &property, const TQVariant &value ); + TQVariant mdFakeProperty( const TQString &property ); + void mdSetCursor( const TQCursor &c ); + TQCursor mdCursor(); + void mdSetPixmapKey( int pixmap, const TQString &arg ); + TQString mdPixmapKey( int pixmap ); + void mdSetExportMacro( const TQString ¯o ); + TQString mdExportMacro(); + TQWidgetList widgetList() const { return objects; } + +private: + TQWidgetList objects; + const TQMetaObject *mobj; + +}; + +#endif diff --git a/kdevdesigner/designer/qcompletionedit.cpp b/kdevdesigner/designer/qcompletionedit.cpp new file mode 100644 index 00000000..ed0c986e --- /dev/null +++ b/kdevdesigner/designer/qcompletionedit.cpp @@ -0,0 +1,210 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "qcompletionedit.h" +#include <tqlistbox.h> +#include <tqsizegrip.h> +#include <tqapplication.h> +#include <tqvbox.h> + +QCompletionEdit::QCompletionEdit( TQWidget *parent, const char *name ) + : TQLineEdit( parent, name ), aAdd( FALSE ), caseSensitive( FALSE ) +{ + popup = new TQVBox( 0, 0, WType_Popup ); + popup->setFrameStyle( TQFrame::Box | TQFrame::Plain ); + popup->setLineWidth( 1 ); + popup->hide(); + + listbox = new TQListBox( popup ); + listbox->setFrameStyle( TQFrame::NoFrame ); + listbox->setLineWidth( 1 ); + listbox->installEventFilter( this ); + listbox->setHScrollBarMode( TQScrollView::AlwaysOn ); + listbox->setVScrollBarMode( TQScrollView::AlwaysOn ); + listbox->setCornerWidget( new TQSizeGrip( listbox, "completion sizegrip" ) ); + connect( this, TQT_SIGNAL( textChanged( const TQString & ) ), + this, TQT_SLOT( textDidChange( const TQString & ) ) ); + popup->setFocusProxy( listbox ); + installEventFilter( this ); +} + +bool QCompletionEdit::autoAdd() const +{ + return aAdd; +} + +TQStringList QCompletionEdit::completionList() const +{ + return compList; +} + +void QCompletionEdit::setCompletionList( const TQStringList &l ) +{ + compList = l; +} + +void QCompletionEdit::setAutoAdd( bool add ) +{ + aAdd = add; +} + +void QCompletionEdit::textDidChange( const TQString &text ) +{ + if ( text.isEmpty() ) { + popup->close(); + return; + } + updateListBox(); + placeListBox(); +} + +void QCompletionEdit::placeListBox() +{ + if ( listbox->count() == 0 ) { + popup->close(); + return; + } + + popup->resize( TQMAX( listbox->sizeHint().width() + listbox->verticalScrollBar()->width() + 4, width() ), + listbox->sizeHint().height() + listbox->horizontalScrollBar()->height() + 4 ); + + TQPoint p( mapToGlobal( TQPoint( 0, 0 ) ) ); + if ( p.y() + height() + popup->height() <= TQApplication::desktop()->height() ) + popup->move( p.x(), p.y() + height() ); + else + popup->move( p.x(), p.y() - listbox->height() ); + popup->show(); + listbox->setCurrentItem( 0 ); + listbox->setSelected( 0, TRUE ); + setFocus(); +} + +void QCompletionEdit::updateListBox() +{ + listbox->clear(); + if ( compList.isEmpty() ) + return; + for ( TQStringList::Iterator it = compList.begin(); it != compList.end(); ++it ) { + if ( caseSensitive && (*it).left( text().length() ) == text() || + !caseSensitive && (*it).left( text().length() ).lower() == text().lower() ) + listbox->insertItem( *it ); + } +} + +bool QCompletionEdit::eventFilter( TQObject *o, TQEvent *e ) +{ + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(popup) || TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(listbox) || TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(listbox->viewport()) ) { + if ( e->type() == TQEvent::KeyPress ) { + TQKeyEvent *ke = (TQKeyEvent*)e; + if ( ke->key() == Key_Enter || ke->key() == Key_Return || ke->key() == Key_Tab ) { + if ( ke->key() == Key_Tab && listbox->count() > 1 && + listbox->currentItem() < (int)listbox->count() - 1 ) { + listbox->setCurrentItem( listbox->currentItem() + 1 ); + return TRUE; + } + popup->close(); + setFocus(); + blockSignals( TRUE ); + setText( listbox->currentText() ); + blockSignals( FALSE ); + emit chosen( text() ); + return TRUE; + } else if ( ke->key() == Key_Left || ke->key() == Key_Right || + ke->key() == Key_Up || ke->key() == Key_Down || + ke->key() == Key_Home || ke->key() == Key_End || + ke->key() == Key_Prior || ke->key() == Key_Next ) { + return FALSE; + } else if ( ke->key() == Key_Escape ) { + popup->close(); + setFocus(); + } else if ( ke->key() != Key_Shift && ke->key() != Key_Control && + ke->key() != Key_Alt ) { + updateListBox(); + if ( listbox->count() == 0 || text().length() == 0 ) { + popup->close(); + setFocus(); + } + TQApplication::sendEvent( this, e ); + return TRUE; + } + } else if ( e->type() == TQEvent::MouseButtonDblClick ) { + popup->close(); + setFocus(); + blockSignals( TRUE ); + setText( listbox->currentText() ); + blockSignals( FALSE ); + emit chosen( text() ); + return TRUE; + } + } else if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this) ) { + if ( e->type() == TQEvent::KeyPress ) { + TQKeyEvent *ke = (TQKeyEvent*)e; + if ( ke->key() == Key_Up || + ke->key() == Key_Down || + ke->key() == Key_Prior || + ke->key() == Key_Next || + ke->key() == Key_Return || + ke->key() == Key_Enter || + ke->key() == Key_Tab || + ke->key() == Key_Escape ) { + TQApplication::sendEvent( listbox, e ); + return TRUE; + } + } + } + return TQLineEdit::eventFilter( o, e ); +} + +void QCompletionEdit::addCompletionEntry( const TQString &entry ) +{ + if ( compList.find( entry ) == compList.end() ) { + compList << entry; + compList.sort(); + } +} + +void QCompletionEdit::removeCompletionEntry( const TQString &entry ) +{ + TQStringList::Iterator it = compList.find( entry ); + if ( it != compList.end() ) + compList.remove( it ); +} + +void QCompletionEdit::setCaseSensitive( bool b ) +{ + caseSensitive = b; +} + +bool QCompletionEdit::isCaseSensitive() const +{ + return caseSensitive; +} + +void QCompletionEdit::clear() +{ + TQLineEdit::clear(); + compList.clear(); +} diff --git a/kdevdesigner/designer/qcompletionedit.h b/kdevdesigner/designer/qcompletionedit.h new file mode 100644 index 00000000..5c3f7fe1 --- /dev/null +++ b/kdevdesigner/designer/qcompletionedit.h @@ -0,0 +1,80 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef TQCOMPLETIONEDIT_H +#define TQCOMPLETIONEDIT_H + +#include <tqlineedit.h> +#include <tqstringlist.h> + +class TQListBox; +class TQVBox; + +class QCompletionEdit : public TQLineEdit +{ + Q_OBJECT + + TQ_PROPERTY( bool autoAdd READ autoAdd WRITE setAutoAdd ) + TQ_PROPERTY( bool caseSensitive READ isCaseSensitive WRITE setCaseSensitive ) + +public: + QCompletionEdit( TQWidget *parent = 0, const char *name = 0 ); + + bool autoAdd() const; + TQStringList completionList() const; + bool eventFilter( TQObject *o, TQEvent *e ); + bool isCaseSensitive() const; + +public slots: + void setCompletionList( const TQStringList &l ); + void setAutoAdd( bool add ); + void clear(); + void addCompletionEntry( const TQString &entry ); + void removeCompletionEntry( const TQString &entry ); + void setCaseSensitive( bool b ); + +signals: + void chosen( const TQString &text ); + +private slots: + void textDidChange( const TQString &text ); + +private: + void placeListBox(); + void updateListBox(); + +private: + bool aAdd; + TQStringList compList; + TQListBox *listbox; + TQVBox *popup; + bool caseSensitive; + +}; + + + +#endif diff --git a/kdevdesigner/designer/replacedialog.ui b/kdevdesigner/designer/replacedialog.ui new file mode 100644 index 00000000..27d01a58 --- /dev/null +++ b/kdevdesigner/designer/replacedialog.ui @@ -0,0 +1,318 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>ReplaceDialog</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>ReplaceDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>286</width> + <height>217</height> + </rect> + </property> + <property name="caption"> + <string>Replace Text</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>R&eplace:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboReplace</cstring> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>&Find:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboFind</cstring> + </property> + </widget> + <widget class="TQComboBox" row="0" column="1"> + <property name="name"> + <cstring>comboFind</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + <widget class="TQComboBox" row="1" column="1"> + <property name="name"> + <cstring>comboReplace</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="TQLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonReplace</cstring> + </property> + <property name="text"> + <string>&Replace</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonReplaceAll</cstring> + </property> + <property name="text"> + <string>Replace &All</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Close</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQButtonGroup" row="1" column="0"> + <property name="name"> + <cstring>ButtonGroup1</cstring> + </property> + <property name="title"> + <string>Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkWords</cstring> + </property> + <property name="text"> + <string>&Whole words only</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkCase</cstring> + </property> + <property name="text"> + <string>Case &sensitive</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkBegin</cstring> + </property> + <property name="text"> + <string>Start at &beginning</string> + </property> + </widget> + </vbox> + </widget> + <widget class="TQButtonGroup" row="1" column="1"> + <property name="name"> + <cstring>ButtonGroup2</cstring> + </property> + <property name="title"> + <string>Direction</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>radioForward</cstring> + </property> + <property name="text"> + <string>Forwar&d</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="TQRadioButton"> + <property name="name"> + <cstring>radioBackward</cstring> + </property> + <property name="text"> + <string>Bac&kward</string> + </property> + </widget> + </vbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonReplace</sender> + <signal>clicked()</signal> + <receiver>ReplaceDialog</receiver> + <slot>doReplace()</slot> + </connection> + <connection> + <sender>buttonReplaceAll</sender> + <signal>clicked()</signal> + <receiver>ReplaceDialog</receiver> + <slot>doReplaceAll()</slot> + </connection> + <connection> + <sender>PushButton2</sender> + <signal>clicked()</signal> + <receiver>ReplaceDialog</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>comboFind</tabstop> + <tabstop>comboReplace</tabstop> + <tabstop>checkWords</tabstop> + <tabstop>checkCase</tabstop> + <tabstop>checkBegin</tabstop> + <tabstop>radioForward</tabstop> + <tabstop>radioBackward</tabstop> + <tabstop>buttonReplace</tabstop> + <tabstop>buttonReplaceAll</tabstop> + <tabstop>PushButton2</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">../interfaces/editorinterface.h</include> + <include location="global" impldecl="in implementation">tqlineedit.h</include> + <include location="local" impldecl="in implementation">replacedialog.ui.h</include> +</includes> +<forwards> + <forward>struct EditorInterface;</forward> +</forwards> +<variables> + <variable>EditorInterface *editor;</variable> + <variable>TQObject *formWindow;</variable> +</variables> +<Q_SLOTS> + <slot>init()</slot> + <slot>destroy()</slot> + <slot>doReplace()</slot> + <slot>doReplaceAll()</slot> + <slot>setEditor( EditorInterface * e, TQObject * fw )</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/replacedialog.ui.h b/kdevdesigner/designer/replacedialog.ui.h new file mode 100644 index 00000000..63946525 --- /dev/null +++ b/kdevdesigner/designer/replacedialog.ui.h @@ -0,0 +1,75 @@ +/********************************************************************** +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + + +void ReplaceDialog::init() +{ + editor = 0; + formWindow = 0; +} + +void ReplaceDialog::destroy() +{ + if ( editor ) + editor->release(); + editor = 0; + formWindow = 0; +} + +void ReplaceDialog::doReplace() +{ + if ( !editor ) + return; + + if ( !editor->replace( comboFind->currentText(), comboReplace->currentText(), checkCase->isChecked(), + checkWords->isChecked(), radioForward->isChecked(), !checkBegin->isChecked(), FALSE ) ) + checkBegin->setChecked( TRUE ); + else + checkBegin->setChecked( FALSE ); +} + +void ReplaceDialog::doReplaceAll() +{ + if ( !editor ) + return; + + if ( !editor->replace( comboFind->currentText(), comboReplace->currentText(), checkCase->isChecked(), + checkWords->isChecked(), radioForward->isChecked(), !checkBegin->isChecked(), TRUE ) ) + checkBegin->setChecked( TRUE ); + else + checkBegin->setChecked( FALSE ); +} + +void ReplaceDialog::setEditor( EditorInterface * e, TQObject * fw ) +{ + if ( fw != formWindow ) + checkBegin->setChecked( TRUE ); + formWindow = fw; + if ( editor ) + editor->release(); + editor = e; + editor->addRef(); +} diff --git a/kdevdesigner/designer/resource.cpp b/kdevdesigner/designer/resource.cpp new file mode 100644 index 00000000..a6285db5 --- /dev/null +++ b/kdevdesigner/designer/resource.cpp @@ -0,0 +1,3328 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "actiondnd.h" +#include "command.h" +#ifndef TQT_NO_SQL +#include "database.h" +#endif +#include "formfile.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "menubareditor.h" +#include "metadatabase.h" +#include "pixmapcollection.h" +#include "popupmenueditor.h" +#include "project.h" +#include "resource.h" +#include "widgetfactory.h" + +#include <domtool.h> +#include <widgetdatabase.h> + +#include <tqaccel.h> +#include <tqapplication.h> +#include <tqbuffer.h> +#include <tqcombobox.h> +#include <tqdatetime.h> +#include <tqdom.h> +#include <tqfeatures.h> +#include <tqfile.h> +#include <tqheader.h> +#include <tqiconview.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqlistbox.h> +#include <tqlistview.h> +#include <tqmenudata.h> +#include <tqmessagebox.h> +#include <tqmetaobject.h> +#include <tqobject.h> +#include <tqobjectlist.h> +#include <tqtabbar.h> +#ifndef TQT_NO_TABLE +#include <tqtable.h> +#include <tqdatatable.h> +#endif +#include <tqtabwidget.h> +#include <tqtabwidget.h> +#include <tqtextcodec.h> +#include <tqtextstream.h> +#include <tqtooltip.h> +#include <tqwhatsthis.h> +#include <tqwidget.h> +#include <tqwidgetstack.h> +#include <tqwizard.h> +#include <tqworkspace.h> +#include <tqworkspace.h> +#include <tqsplitter.h> +#include <tqucom_p.h> + +#include <kiconloader.h> +#include <tdefiledialog.h> +#include <tdelocale.h> + +#include "kdevdesigner_part.h" + +static TQString makeIndent( int indent ) +{ + TQString s; + s.fill( ' ', indent * 4 ); + return s; +} + +static TQString entitize( const TQString &s, bool attribute = FALSE ) +{ + TQString s2 = s; + s2 = s2.replace( "&", "&" ); + s2 = s2.replace( ">", ">" ); + s2 = s2.replace( "<", "<" ); + if ( attribute ) { + s2 = s2.replace( "\"", """ ); + s2 = s2.replace( "'", "'" ); + } + return s2; +} + +#ifdef TQ_WS_MACX +static struct { + int key; + const char* name; +} keyname[] = { + { TQt::Key_Space, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Space" ) }, + { TQt::Key_Escape, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Esc" ) }, + { TQt::Key_Tab, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Tab" ) }, + { TQt::Key_Backtab, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Backtab" ) }, + { TQt::Key_Backspace, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Backspace" ) }, + { TQt::Key_Return, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Return" ) }, + { TQt::Key_Enter, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Enter" ) }, + { TQt::Key_Insert, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Ins" ) }, + { TQt::Key_Delete, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Del" ) }, + { TQt::Key_Pause, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Pause" ) }, + { TQt::Key_Print, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Print" ) }, + { TQt::Key_SysReq, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "SysReq" ) }, + { TQt::Key_Home, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Home" ) }, + { TQt::Key_End, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "End" ) }, + { TQt::Key_Left, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Left" ) }, + { TQt::Key_Up, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Up" ) }, + { TQt::Key_Right, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Right" ) }, + { TQt::Key_Down, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Down" ) }, + { TQt::Key_Prior, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "PgUp" ) }, + { TQt::Key_Next, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "PgDown" ) }, + { TQt::Key_CapsLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "CapsLock" ) }, + { TQt::Key_NumLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "NumLock" ) }, + { TQt::Key_ScrollLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "ScrollLock" ) }, + { TQt::Key_Menu, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Menu" ) }, + { TQt::Key_Help, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Help" ) }, + + // Multimedia keys + { TQt::Key_Back, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Back" ) }, + { TQt::Key_Forward, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Forward" ) }, + { TQt::Key_Stop, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Stop" ) }, + { TQt::Key_Refresh, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Refresh" ) }, + { TQt::Key_VolumeDown, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Volume Down" ) }, + { TQt::Key_VolumeMute, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Volume Mute" ) }, + { TQt::Key_VolumeUp, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Volume Up" ) }, + { TQt::Key_BassBoost, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Bass Boost" ) }, + { TQt::Key_BassUp, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Bass Up" ) }, + { TQt::Key_BassDown, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Bass Down" ) }, + { TQt::Key_TrebleUp, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Treble Up" ) }, + { TQt::Key_TrebleDown, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Treble Down" ) }, + { TQt::Key_MediaPlay, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Media Play" ) }, + { TQt::Key_MediaStop, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Media Stop" ) }, + { TQt::Key_MediaPrev, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Media Previous" ) }, + { TQt::Key_MediaNext, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Media Next" ) }, + { TQt::Key_MediaRecord, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Media Record" ) }, + { TQt::Key_HomePage, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Home" ) }, + { TQt::Key_Favorites, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Favorites" ) }, + { TQt::Key_Search, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Search" ) }, + { TQt::Key_Standby, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Standby" ) }, + { TQt::Key_OpenUrl, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Open URL" ) }, + { TQt::Key_LaunchMail, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch Mail" ) }, + { TQt::Key_LaunchMedia, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch Media" ) }, + { TQt::Key_Launch0, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (0)" ) }, + { TQt::Key_Launch1, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (1)" ) }, + { TQt::Key_Launch2, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (2)" ) }, + { TQt::Key_Launch3, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (3)" ) }, + { TQt::Key_Launch4, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (4)" ) }, + { TQt::Key_Launch5, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (5)" ) }, + { TQt::Key_Launch6, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (6)" ) }, + { TQt::Key_Launch7, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (7)" ) }, + { TQt::Key_Launch8, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (8)" ) }, + { TQt::Key_Launch9, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (9)" ) }, + { TQt::Key_LaunchA, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (A)" ) }, + { TQt::Key_LaunchB, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (B)" ) }, + { TQt::Key_LaunchC, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (C)" ) }, + { TQt::Key_LaunchD, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (D)" ) }, + { TQt::Key_LaunchE, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (E)" ) }, + { TQt::Key_LaunchF, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Launch (F)" ) }, + + // -------------------------------------------------------------- + // More consistent namings + { TQt::Key_Print, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Print Screen" ) }, + { TQt::Key_Prior, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Page Up" ) }, + { TQt::Key_Next, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Page Down" ) }, + { TQt::Key_CapsLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Caps Lock" ) }, + { TQt::Key_NumLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Num Lock" ) }, + { TQt::Key_NumLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Number Lock" ) }, + { TQt::Key_ScrollLock, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Scroll Lock" ) }, + { TQt::Key_Insert, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Insert" ) }, + { TQt::Key_Delete, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Delete" ) }, + { TQt::Key_Escape, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "Escape" ) }, + { TQt::Key_SysReq, TQT_TRANSLATE_NOOP( TQACCEL_OBJECT_NAME_STRING, "System Request" ) }, + + { 0, 0 } +}; +#endif +static TQString platformNeutralKeySequence(const TQKeySequence &ks) +{ +#ifndef TQ_WS_MACX + return TQString(ks); +#else + uint k; + TQString str; + TQString p; + for (k = 0; k < ks.count(); ++k) { + int keycombo = ks[k]; + int basekey = keycombo & ~(TQt::SHIFT | TQt::CTRL | TQt::ALT | TQt::META); + if (keycombo & TQt::CTRL) + str += "Ctrl+"; + if (keycombo & TQt::ALT) + str += "Alt+"; + if (keycombo & TQt::META) + str += "Meta+"; + if (keycombo & TQt::SHIFT) + str += "Shift+"; + + // begin copy and paste from TQKeySequence :( + if (basekey & TQt::UNICODE_ACCEL) { + // Note: This character should NOT be upper()'ed, since + // the encoded string should indicate EXACTLY what the + // key represents! Hence a 'Ctrl+Shift+c' is posible to + // represent, but is clearly impossible to trigger... + p = TQChar(basekey & 0xffff); + } else if ( basekey >= TQt::Key_F1 && basekey <= TQt::Key_F35 ) { + p = TQAccel::tr( "F%1" ).arg(basekey - TQt::Key_F1 + 1); + } else if ( basekey > TQt::Key_Space && basekey <= TQt::Key_AsciiTilde ) { + p.sprintf( "%c", basekey ); + } else { + int i = 0; + while (keyname[i].name) { + if (basekey == keyname[i].key) { + p = TQAccel::tr(keyname[i].name); + break; + } + ++i; + } + // If we can't find the actual translatable keyname, + // fall back on the unicode representation of it... + // Or else characters like Key_aring may not get displayed + // ( Really depends on you locale ) + if ( !keyname[i].name ) + // Note: This character should NOT be upper()'ed, see above! + p = TQChar(basekey & 0xffff); + } + // end copy... + str += p + ", "; + } + str.truncate(str.length() - 2); + return str; +#endif +} + +static TQString mkBool( bool b ) +{ + return b? "true" : "false"; +} + +/*! + \class Resource resource.h + \brief Class for saving/loading, etc. forms + + This class is used for saving and loading forms, code generation, + transferring data of widgets over the clipboard, etc.. + +*/ + + +Resource::Resource() +{ + mainwindow = 0; + formwindow = 0; + toplevel = 0; + copying = FALSE; + pasting = FALSE; + hadGeometry = FALSE; + langIface = 0; + hasFunctions = FALSE; +} + +Resource::Resource( MainWindow* mw ) + : mainwindow( mw ) +{ + formwindow = 0; + toplevel = 0; + copying = FALSE; + pasting = FALSE; + hadGeometry = FALSE; + langIface = 0; + hasFunctions = FALSE; +} + +Resource::~Resource() +{ + if ( langIface ) + langIface->release(); +} + +void Resource::setWidget( FormWindow *w ) +{ + formwindow = w; + toplevel = w; +} + +TQWidget *Resource::widget() const +{ + return toplevel; +} + +bool Resource::load( FormFile *ff, Project *defProject ) +{ + if ( !ff || ff->absFileName().isEmpty() ) + return FALSE; + currFileName = ff->absFileName(); + mainContainerSet = FALSE; + + TQFile f( ff->absFileName() ); + f.open( IO_ReadOnly | IO_Translate ); + + bool b = load( ff, TQT_TQIODEVICE(&f), defProject ); + f.close(); + + return b; +} + +#undef signals +#undef slots + +bool Resource::load( FormFile *ff, TQIODevice* dev, Project *defProject ) +{ + TQDomDocument doc; + TQString errMsg; + int errLine; + if ( !doc.setContent( dev, &errMsg, &errLine ) ) { + return FALSE; + } + + DomTool::fixDocument( doc ); + + TQWidget *p = mainwindow ? mainwindow->qWorkspace() : 0; + toplevel = formwindow = new FormWindow( ff, p, 0 ); + if ( defProject ) + formwindow->setProject( defProject ); + else if ( MainWindow::self ) + formwindow->setProject( MainWindow::self->currProject() ); + if ( mainwindow ) + formwindow->setMainWindow( mainwindow ); + MetaDataBase::addEntry( TQT_TQOBJECT(formwindow) ); + + if ( !langIface ) { + TQString lang = "TQt Script"; + if ( mainwindow ) + lang = mainwindow->currProject()->language(); + langIface = MetaDataBase::languageInterface( lang ); + if ( langIface ) + langIface->addRef(); + } + + uiFileVersion = doc.firstChild().toElement().attribute("version"); + TQDomElement e = doc.firstChild().toElement().firstChild().toElement(); + + TQDomElement forwards = e; + while ( forwards.tagName() != "forwards" && !forwards.isNull() ) + forwards = forwards.nextSibling().toElement(); + + TQDomElement includes = e; + while ( includes.tagName() != "includes" && !includes.isNull() ) + includes = includes.nextSibling().toElement(); + + TQDomElement variables = e; + while ( variables.tagName() != "variables" && !variables.isNull() ) + variables = variables.nextSibling().toElement(); + + TQDomElement signals = e; + while ( signals.tagName() != "signals" && !signals.isNull() ) + signals = signals.nextSibling().toElement(); + + TQDomElement slots = e; + while ( slots.tagName() != "slots" && !slots.isNull() ) + slots = slots.nextSibling().toElement(); + + TQDomElement functions = e; + while ( functions.tagName() != "functions" && !functions.isNull() ) + functions = functions.nextSibling().toElement(); + + TQDomElement connections = e; + while ( connections.tagName() != "connections" && !connections.isNull() ) + connections = connections.nextSibling().toElement(); + + TQDomElement imageCollection = e; + images.clear(); + while ( imageCollection.tagName() != "images" && !imageCollection.isNull() ) + imageCollection = imageCollection.nextSibling().toElement(); + + TQDomElement customWidgets = e; + while ( customWidgets.tagName() != "customwidgets" && !customWidgets.isNull() ) + customWidgets = customWidgets.nextSibling().toElement(); + + TQDomElement tabOrder = e; + while ( tabOrder.tagName() != "tabstops" && !tabOrder.isNull() ) + tabOrder = tabOrder.nextSibling().toElement(); + + TQDomElement actions = e; + while ( actions.tagName() != "actions" && !actions.isNull() ) + actions = actions.nextSibling().toElement(); + + TQDomElement toolbars = e; + while ( toolbars.tagName() != "toolbars" && !toolbars.isNull() ) + toolbars = toolbars.nextSibling().toElement(); + + TQDomElement menubar = e; + while ( menubar.tagName() != "menubar" && !menubar.isNull() ) + menubar = menubar.nextSibling().toElement(); + + TQDomElement widget; + while ( !e.isNull() ) { + if ( e.tagName() == "widget" ) { + widgets.clear(); + widget = e; + } else if ( e.tagName() == "include" ) { // compatibility with 2.x + MetaDataBase::Include inc; + inc.location = "global"; + if ( e.attribute( "location" ) == "local" ) + inc.location = "local"; + inc.implDecl = "in declaration"; + if ( e.attribute( "impldecl" ) == "in implementation" ) + inc.implDecl = "in implementation"; + inc.header = e.firstChild().toText().data(); + if ( inc.header.right( 5 ) != ".ui.h" ) { + metaIncludes.append( inc ); + } else { + if ( formwindow->formFile() ) + formwindow->formFile()->setCodeFileState( FormFile::Ok ); + } + } else if ( e.tagName() == "comment" ) { + metaInfo.comment = e.firstChild().toText().data(); + } else if ( e.tagName() == "forward" ) { // compatibility with old betas + metaForwards << e.firstChild().toText().data(); + } else if ( e.tagName() == "variable" ) { // compatibility with old betas + MetaDataBase::Variable v; + v.varName = e.firstChild().toText().data(); + v.varAccess = "protected"; + metaVariables << v; + } else if ( e.tagName() == "author" ) { + metaInfo.author = e.firstChild().toText().data(); + } else if ( e.tagName() == "class" ) { + metaInfo.className = e.firstChild().toText().data(); + } else if ( e.tagName() == "pixmapfunction" ) { + if ( formwindow ) { + formwindow->setSavePixmapInline( FALSE ); + formwindow->setSavePixmapInProject( FALSE ); + formwindow->setPixmapLoaderFunction( e.firstChild().toText().data() ); + } + } else if ( e.tagName() == "pixmapinproject" ) { + if ( formwindow ) { + formwindow->setSavePixmapInline( FALSE ); + formwindow->setSavePixmapInProject( TRUE ); + } + } else if ( e.tagName() == "exportmacro" ) { + exportMacro = e.firstChild().toText().data(); + } else if ( e.tagName() == "layoutdefaults" ) { + formwindow->setLayoutDefaultSpacing( e.attribute( "spacing", TQString::number( formwindow->layoutDefaultSpacing() ) ).toInt() ); + formwindow->setLayoutDefaultMargin( e.attribute( "margin", TQString::number( formwindow->layoutDefaultMargin() ) ).toInt() ); + } else if ( e.tagName() == "layoutfunctions" ) { + formwindow->setSpacingFunction( e.attribute( "spacing" ) ); + formwindow->setMarginFunction( e.attribute( "margin" ) ); + if ( !formwindow->marginFunction().isEmpty() || !formwindow->spacingFunction().isEmpty() ) + formwindow->hasLayoutFunctions( TRUE ); + } + + e = e.nextSibling().toElement(); + } + + if ( !imageCollection.isNull() ) + loadImageCollection( imageCollection ); + if ( !customWidgets.isNull() ) + loadCustomWidgets( customWidgets, this ); + +#if defined (TQT_NON_COMMERCIAL) + bool previewMode = MainWindow::self ? MainWindow::self->isPreviewing() : FALSE; + TQWidget *w = (TQWidget*)createObject( widget, !previewMode ? (TQWidget*)formwindow : MainWindow::self ); + if ( !w ) + return FALSE; + if ( previewMode ) + w->reparent( MainWindow::self, TQt::WType_TopLevel, w->pos(), TRUE ); +#else + if ( !createObject( widget, formwindow) ) + return FALSE; +#endif + + if ( !forwards.isNull() ) { + for ( TQDomElement n = forwards.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) + if ( n.tagName() == "forward" ) + metaForwards << n.firstChild().toText().data(); + } + + if ( !includes.isNull() ) { + for ( TQDomElement n = includes.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) + if ( n.tagName() == "include" ) { + if ( n.tagName() == "include" ) { + MetaDataBase::Include inc; + inc.location = "global"; + if ( n.attribute( "location" ) == "local" ) + inc.location = "local"; + inc.implDecl = "in declaration"; + if ( n.attribute( "impldecl" ) == "in implementation" ) + inc.implDecl = "in implementation"; + inc.header = n.firstChild().toText().data(); + if ( inc.header.right( 5 ) != ".ui.h" ) { + metaIncludes.append( inc ); + } else { + if ( formwindow->formFile() ) + formwindow->formFile()->setCodeFileState( FormFile::Ok ); + } + } + } + } + + if ( !variables.isNull() ) { + for ( TQDomElement n = variables.firstChild().toElement(); !n.isNull(); + n = n.nextSibling().toElement() ) { + if ( n.tagName() == "variable" ) { + MetaDataBase::Variable v; + v.varName = n.firstChild().toText().data(); + v.varAccess = n.attribute( "access", "protected" ); + if ( v.varAccess.isEmpty() ) + v.varAccess = "protected"; + metaVariables << v; + } + } + } + if ( !signals.isNull() ) { + for ( TQDomElement n = signals.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) + if ( n.tagName() == "signal" ) + metaSignals << n.firstChild().toText().data(); + } + if ( !slots.isNull() ) { + for ( TQDomElement n = slots.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) + if ( n.tagName() == "slot" ) { + MetaDataBase::Function function; + function.specifier = n.attribute( "specifier", "virtual" ); + if ( function.specifier.isEmpty() ) + function.specifier = "virtual"; + function.access = n.attribute( "access", "public" ); + if ( function.access.isEmpty() ) + function.access = "public"; + function.language = n.attribute( "language", "C++" ); + function.returnType = n.attribute( "returnType", "void" ); + if ( function.returnType.isEmpty() ) + function.returnType = "void"; + function.type = "slot"; + function.function = n.firstChild().toText().data(); + if ( !MetaDataBase::hasFunction( TQT_TQOBJECT(formwindow), function.function, TRUE ) ) + MetaDataBase::addFunction( TQT_TQOBJECT(formwindow), function.function, function.specifier, + function.access, "slot", function.language, function.returnType ); + else + MetaDataBase::changeFunctionAttributes( TQT_TQOBJECT(formwindow), function.function, function.function, + function.specifier, function.access, + "slot", function.language, + function.returnType ); + } + } + + if ( !functions.isNull() ) { + for ( TQDomElement n = functions.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) { + if ( n.tagName() == "function" ) { + MetaDataBase::Function function; + function.specifier = n.attribute( "specifier", "virtual" ); + if ( function.specifier.isEmpty() ) + function.specifier = "virtual"; + function.access = n.attribute( "access", "public" ); + if ( function.access.isEmpty() ) + function.access = "public"; + function.type = n.attribute( "type", "function" ); + function.type = "function"; + function.language = n.attribute( "language", "C++" ); + function.returnType = n.attribute( "returnType", "void" ); + if ( function.returnType.isEmpty() ) + function.returnType = "void"; + function.function = n.firstChild().toText().data(); + if ( !MetaDataBase::hasFunction( TQT_TQOBJECT(formwindow), function.function, TRUE ) ) + MetaDataBase::addFunction( TQT_TQOBJECT(formwindow), function.function, function.specifier, + function.access, function.type, function.language, + function.returnType ); + else + MetaDataBase::changeFunctionAttributes( TQT_TQOBJECT(formwindow), function.function, function.function, + function.specifier, function.access, + function.type, function.language, function.returnType ); + } + } + } + + if ( !actions.isNull() ) + loadActions( actions ); + if ( !toolbars.isNull() ) + loadToolBars( toolbars ); + if ( !menubar.isNull() ) + loadMenuBar( menubar ); + + if ( !connections.isNull() ) + loadConnections( connections ); + + if ( !tabOrder.isNull() ) + loadTabOrder( tabOrder ); + + if ( formwindow ) { + MetaDataBase::setIncludes( TQT_TQOBJECT(formwindow), metaIncludes ); + MetaDataBase::setForwards( TQT_TQOBJECT(formwindow), metaForwards ); + MetaDataBase::setVariables( TQT_TQOBJECT(formwindow), metaVariables ); + MetaDataBase::setSignalList( TQT_TQOBJECT(formwindow), metaSignals ); + metaInfo.classNameChanged = metaInfo.className != TQString( formwindow->name() ); + MetaDataBase::setMetaInfo( TQT_TQOBJECT(formwindow), metaInfo ); + MetaDataBase::setExportMacro( TQT_TQOBJECT(formwindow->mainContainer()), exportMacro ); + } + + loadExtraSource( formwindow->formFile(), currFileName, langIface, hasFunctions ); + + if ( mainwindow && formwindow ) + mainwindow->insertFormWindow( formwindow ); + + if ( formwindow ) { + formwindow->killAccels( TQT_TQOBJECT(formwindow) ); + if ( formwindow->layout() ) + formwindow->layout()->activate(); + if ( hadGeometry ) + formwindow->resize( formwindow->size().expandedTo( formwindow->minimumSize(). + expandedTo( formwindow->minimumSizeHint() ) ) ); + else + formwindow->resize( formwindow->size().expandedTo( formwindow->sizeHint() ) ); + } + + return TRUE; +} + +static bool saveCode( const TQString &filename, const TQString &code ) +{ + TQFile f( filename ); + if ( f.open(IO_WriteOnly | IO_Translate) ) { + TQTextStream ts( &f ); + ts << code; + return TRUE; + } + return FALSE; +} + +bool Resource::save( const TQString& filename, bool formCodeOnly ) +{ + if ( !formwindow || filename.isEmpty() ) + return FALSE; + if (!langIface) { + TQString lang = "TQt Script"; + if ( mainwindow ) + lang = mainwindow->currProject()->language(); + langIface = MetaDataBase::languageInterface( lang ); + if ( langIface ) + langIface->addRef(); + } + if ( formCodeOnly && langIface ) { + if ( saveFormCode(formwindow->formFile(), langIface) ) + return TRUE; + bool breakout = FALSE; + FormFile *ff = formwindow->formFile(); + TQString codeFile = ff->project()->makeAbsolute( ff->codeFile() ); + TQString filter = langIface->fileFilterList().join("\n"); + while ( !breakout ) { + TQString fn = KFileDialog::getSaveFileName( codeFile, filter ); + breakout = fn.isEmpty(); + if ( !breakout ) { + if ( saveCode(fn, ff->code()) ) + return TRUE; + } + } + } + currFileName = filename; + + TQFile f( filename ); + if ( !f.open( IO_WriteOnly | IO_Translate ) ) + return FALSE; + bool b = save( TQT_TQIODEVICE(&f) ); + f.close(); + return b; +} + +bool Resource::save( TQIODevice* dev ) +{ + if ( !formwindow ) + return FALSE; + + if ( !langIface ) { + TQString lang = "C++"; + if ( mainwindow ) + lang = mainwindow->currProject()->language(); + langIface = MetaDataBase::languageInterface( lang ); + if ( langIface ) + langIface->addRef(); + } + + TQTextStream ts( dev ); + ts.setCodec( TQTextCodec::codecForName( "UTF-8" ) ); + + ts << "<!DOCTYPE UI><UI version=\"3.3\" stdsetdef=\"1\">" << endl; + saveMetaInfoBefore( ts, 0 ); + saveObject( TQT_TQOBJECT(formwindow->mainContainer()), 0, ts, 0 ); + if ( ::tqqt_cast<TQMainWindow*>(formwindow->mainContainer()) ) { + saveMenuBar( (TQMainWindow*)formwindow->mainContainer(), ts, 0 ); + saveToolBars( (TQMainWindow*)formwindow->mainContainer(), ts, 0 ); + } + if ( !MetaDataBase::customWidgets()->isEmpty() && !usedCustomWidgets.isEmpty() ) + saveCustomWidgets( ts, 0 ); + if ( ::tqqt_cast<TQMainWindow*>(formwindow->mainContainer()) ) + saveActions( formwindow->actionList(), ts, 0 ); + if ( !images.isEmpty() ) + saveImageCollection( ts, 0 ); + if ( !MetaDataBase::connections( TQT_TQOBJECT(formwindow) ).isEmpty() || + !MetaDataBase::slotList( TQT_TQOBJECT(formwindow) ).isEmpty() ) + saveConnections( ts, 0 ); + saveTabOrder( ts, 0 ); + saveMetaInfoAfter( ts, 0 ); + saveIncludeHints( ts, 0 ); + ts << "</UI>" << endl; + bool ok = saveFormCode( formwindow->formFile(), langIface ); + images.clear(); + + return ok; +} + +TQString Resource::copy() +{ + if ( !formwindow ) + return TQString(); + + copying = TRUE; + TQString s; + TQTextOStream ts( &s ); + + ts << "<!DOCTYPE UI-SELECTION><UI-SELECTION>" << endl; + TQWidgetList widgets = formwindow->selectedWidgets(); + TQWidgetList tmp( widgets ); + for ( TQWidget *w = widgets.first(); w; w = widgets.next() ) { + TQWidget *p = w->parentWidget(); + bool save = TRUE; + while ( p ) { + if ( tmp.findRef( p ) != -1 ) { + save = FALSE; + break; + } + p = p->parentWidget(); + } + if ( save ) + saveObject( TQT_TQOBJECT(w), 0, ts, 0 ); + } + if ( !MetaDataBase::customWidgets()->isEmpty() && !usedCustomWidgets.isEmpty() ) + saveCustomWidgets( ts, 0 ); + if ( !images.isEmpty() ) + saveImageCollection( ts, 0 ); + ts << "</UI-SELECTION>" << endl; + + return s; +} + + +void Resource::paste( const TQString &cb, TQWidget *parent ) +{ + if ( !formwindow ) + return; + mainContainerSet = TRUE; + + pasting = TRUE; + TQDomDocument doc; + TQString errMsg; + int errLine; + doc.setContent( cb, &errMsg, &errLine ); + + TQDomElement firstWidget = doc.firstChild().toElement().firstChild().toElement(); + + TQDomElement imageCollection = firstWidget; + images.clear(); + while ( imageCollection.tagName() != "images" && !imageCollection.isNull() ) + imageCollection = imageCollection.nextSibling().toElement(); + + TQDomElement customWidgets = firstWidget; + while ( customWidgets.tagName() != "customwidgets" && !customWidgets.isNull() ) + customWidgets = customWidgets.nextSibling().toElement(); + + if ( !imageCollection.isNull() ) + loadImageCollection( imageCollection ); + if ( !customWidgets.isNull() ) + loadCustomWidgets( customWidgets, this ); + + TQWidgetList widgets; + formwindow->clearSelection( FALSE ); + formwindow->setPropertyShowingBlocked( TRUE ); + formwindow->clearSelection( FALSE ); + while ( !firstWidget.isNull() ) { + if ( firstWidget.tagName() == "widget" ) { + TQWidget *w = (TQWidget*)createObject( firstWidget, parent, 0 ); + if ( !w ) + continue; + widgets.append( w ); + int x = w->x() + formwindow->grid().x(); + int y = w->y() + formwindow->grid().y(); + if ( w->x() + w->width() > parent->width() ) + x = TQMAX( 0, parent->width() - w->width() ); + if ( w->y() + w->height() > parent->height() ) + y = TQMAX( 0, parent->height() - w->height() ); + if ( x != w->x() || y != w->y() ) + w->move( x, y ); + formwindow->selectWidget( TQT_TQOBJECT(w) ); + } else if ( firstWidget.tagName() == "spacer" ) { + TQWidget *w = createSpacer( firstWidget, parent, 0, firstWidget.tagName() == "vspacer" ? Qt::Vertical : Qt::Horizontal ); + if ( !w ) + continue; + widgets.append( w ); + int x = w->x() + formwindow->grid().x(); + int y = w->y() + formwindow->grid().y(); + if ( w->x() + w->width() > parent->width() ) + x = TQMAX( 0, parent->width() - w->width() ); + if ( w->y() + w->height() > parent->height() ) + y = TQMAX( 0, parent->height() - w->height() ); + if ( x != w->x() || y != w->y() ) + w->move( x, y ); + formwindow->selectWidget( TQT_TQOBJECT(w) ); + } + firstWidget = firstWidget.nextSibling().toElement(); + } + formwindow->setPropertyShowingBlocked( FALSE ); + formwindow->emitShowProperties(); + + PasteCommand *cmd = new PasteCommand( i18n( "Paste" ), formwindow, widgets ); + formwindow->commandHistory()->addCommand( cmd ); +} + +void Resource::saveObject( TQObject *obj, QDesignerGridLayout* grid, TQTextStream &ts, int indent ) +{ + if ( obj && obj->isWidgetType() && ( (TQWidget*)obj )->isHidden() ) + return; + TQString closeTag; + const char* className = WidgetFactory::classNameOf( obj ); + int classID = WidgetDatabase::idFromClassName( className ); + bool isPlugin = WidgetDatabase::isCustomPluginWidget( classID ); + if ( obj->isWidgetType() ) { + if ( obj->isA("CustomWidget") || isPlugin ) { + usedCustomWidgets << TQString( className ); + includeHints << WidgetDatabase::includeFile( classID ); + } + + if ( TQT_BASE_OBJECT(obj) != TQT_BASE_OBJECT(formwindow) && !formwindow->widgets()->find( (TQWidget*)obj ) ) + return; // we don't know anything about this thing + + TQString attributes; + if ( grid ) { + QDesignerGridLayout::Item item = grid->items[ (TQWidget*)obj ]; + attributes += TQString(" row=\"") + TQString::number(item.row) + "\""; + attributes += TQString(" column=\"") + TQString::number(item.column) + "\""; + if ( item.rowspan * item.colspan != 1 ) { + attributes += TQString(" rowspan=\"") + TQString::number(item.rowspan) + "\""; + attributes += TQString(" colspan=\"") + TQString::number(item.colspan) + "\""; + } + } + + if ( qstrcmp( className, "Spacer" ) == 0 ) { + closeTag = makeIndent( indent ) + "</spacer>\n"; + ts << makeIndent( indent ) << "<spacer" << attributes << ">" << endl; + ++indent; + } else { + closeTag = makeIndent( indent ) + "</widget>\n"; + ts << makeIndent( indent ) << "<widget class=\"" << className << "\"" << attributes << ">" << endl; + ++indent; + } + if ( WidgetFactory::hasItems(classID, obj) ) + saveItems( obj, ts, indent ); + saveObjectProperties( obj, ts, indent ); + } else { + // test for other objects we created. Nothing so far. + return; + } + + QDesignerWidgetStack* ws = 0; + + if ( ::tqqt_cast<TQTabWidget*>(obj) ) { + TQTabWidget* tw = (TQTabWidget*) obj; + TQObjectList* tmpl = tw->queryList( TQWIDGETSTACK_OBJECT_NAME_STRING ); + TQWidgetStack *ws = (TQWidgetStack*)tmpl->first(); + TQTabBar *tb = ( (QDesignerTabWidget*)obj )->tabBar(); + for ( int i = 0; i < tb->count(); ++i ) { + TQTab *t = tb->tabAt( i ); + if ( !t ) + continue; + TQWidget *w = ws->widget( t->identifier() ); + if ( !w ) + continue; + if ( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf(TQT_TQOBJECT(w)) ) == -1 ) + continue; // we don't know this widget + ts << makeIndent( indent ) << "<widget class=\"TQWidget\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<property name=\"name\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + + ts << makeIndent( indent ) << "<attribute name=\"title\">" << endl; + indent++; + ts << makeIndent( indent ) << "<string>" << entitize( t->text() ) << "</string>" << endl; + indent--; + ts << makeIndent( indent ) << "</attribute>" << endl; + saveChildrenOf( TQT_TQOBJECT(w), ts, indent ); + --indent; + ts << makeIndent( indent ) << "</widget>" << endl; + } + delete tmpl; + } else if ( (ws = ::tqqt_cast<QDesignerWidgetStack*>(obj)) != 0 ) { + for ( int i = 0; i < ws->count(); ++i ) { + TQWidget *w = ws->page( i ); + if ( !w ) + continue; + if ( WidgetDatabase::idFromClassName(WidgetFactory::classNameOf(TQT_TQOBJECT(w))) == -1 ) + continue; // we don't know this widget + ts << makeIndent( indent ) << "<widget class=\"TQWidget\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<property name=\"name\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + ts << makeIndent( indent ) << "<attribute name=\"id\">" << endl; + indent++; + ts << makeIndent( indent ) << "<number>" << TQString::number(i) << "</number>" << endl; + indent--; + ts << makeIndent( indent ) << "</attribute>" << endl; + saveChildrenOf( TQT_TQOBJECT(w), ts, indent ); + --indent; + ts << makeIndent( indent ) << "</widget>" << endl; + } + } else if ( ::tqqt_cast<TQToolBox*>(obj) ) { + TQToolBox* tb = (TQToolBox*)obj; + for ( int i = 0; i < tb->count(); ++i ) { + TQWidget *w = tb->item( i ); + if ( !w ) + continue; + if ( WidgetDatabase::idFromClassName(WidgetFactory::classNameOf(TQT_TQOBJECT(w))) == -1 ) + continue; // we don't know this widget + ts << makeIndent( indent ) << "<widget class=\"TQWidget\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<property name=\"name\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + ts << makeIndent( indent ) << "<property name=\"backgroundMode\">" << endl; + indent++; + saveEnumProperty( TQT_TQOBJECT(w), "backgroundMode", TQVariant::Invalid, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + ts << makeIndent( indent ) << "<attribute name=\"label\">" << endl; + indent++; + ts << makeIndent( indent ) << "<string>" << entitize( tb->itemLabel( tb->indexOf(w) ) ) << "</string>" << endl; + indent--; + ts << makeIndent( indent ) << "</attribute>" << endl; + saveChildrenOf( TQT_TQOBJECT(w), ts, indent ); + --indent; + ts << makeIndent( indent ) << "</widget>" << endl; + } + } else if ( ::tqqt_cast<TQWizard*>(obj) ) { + TQWizard* wiz = (TQWizard*)obj; + for ( int i = 0; i < wiz->pageCount(); ++i ) { + TQWidget *w = wiz->page( i ); + if ( !w ) + continue; + if ( WidgetDatabase::idFromClassName(WidgetFactory::classNameOf(TQT_TQOBJECT(w))) == -1 ) + continue; // we don't know this widget + ts << makeIndent( indent ) << "<widget class=\"TQWidget\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<property name=\"name\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + + ts << makeIndent( indent ) << "<attribute name=\"title\">" << endl; + indent++; + ts << makeIndent( indent ) << "<string>" << entitize( wiz->title( w ) ) << "</string>" << endl; + indent--; + ts << makeIndent( indent ) << "</attribute>" << endl; + saveChildrenOf( TQT_TQOBJECT(w), ts, indent ); + --indent; + ts << makeIndent( indent ) << "</widget>" << endl; + } + } else if ( ::tqqt_cast<TQMainWindow*>(obj) ) { + saveChildrenOf( TQT_TQOBJECT(( (TQMainWindow*)obj )->centralWidget()), ts, indent ); + } else { + bool saved = FALSE; +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + if ( isPlugin ) { + WidgetInterface *iface = 0; + widgetManager()->queryInterface( className, &iface ); + if ( iface ) { + TQWidgetContainerInterfacePrivate *iface2 = 0; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); + if ( iface2 ) { + if ( iface2->supportsPages( className ) ) { + TQWidgetList containers = iface2->pages( className, (TQWidget*)obj ); + if ( !containers.isEmpty() ) { + saved = TRUE; + int i = 0; + for ( TQWidget *w = containers.first(); w; w = containers.next(), ++i ) { + if ( WidgetDatabase:: + idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ) == -1 ) + continue; // we don't know this widget + ts << makeIndent( indent ) << "<widget class=\"" + << WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) + << "\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<property name=\"name\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) + << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + ts << makeIndent( indent ) << "<attribute name=\"label\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" + << entitize( iface2->pageLabel( className, (TQWidget*)obj, i ) ) + << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</attribute>" << endl; + saveChildrenOf( w, ts, indent ); + --indent; + ts << makeIndent( indent ) << "</widget>" << endl; + } + } + } else { + saved = TRUE; + TQWidget *w = iface2->containerOfWidget( className, (TQWidget*)obj ); + if ( obj != w ) { + ts << makeIndent( indent ) << "<widget class=\"" + << WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) + << "\">" << endl; + ++indent; + ts << makeIndent( indent ) << "<property name=\"name\">" << endl; + indent++; + ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) + << "</cstring>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + saveChildrenOf( w, ts, indent ); + --indent; + ts << makeIndent( indent ) << "</widget>" << endl; + } + // Create a custom widget and then store it in the database + // so we can save the custom widgets. + MetaDataBase::CustomWidget *cw = new MetaDataBase::CustomWidget; + cw->className = className; + cw->includeFile = WidgetDatabase::includeFile( classID ); + TQStrList lst = w->metaObject()->signalNames( TRUE ); + for ( TQPtrListIterator<char> it(lst); it.current(); ++it ) + cw->lstSignals.append(it.current()); + + int i; + int total = w->metaObject()->numProperties( TRUE ); + for ( i = 0; i < total; i++ ) { + const TQMetaProperty *p = w->metaObject()->property( i, TRUE ); + if ( p->designable(w) ) { + MetaDataBase::Property prop; + prop.property = p->name(); + TQString pType = p->type(); + // *sigh* designer types are not normal types + // Handle most cases, the ones it misses are + // probably too difficult to deal with anyway... + if ( pType.startsWith("Q") ) { + pType = pType.right( pType.length() - 1 ); + } else { + pType[0] = pType[0].upper(); + } + prop.type = pType; + cw->lstProperties.append( prop ); + } + } + + total = w->metaObject()->numSlots( TRUE ); + for ( i = 0; i < total; i++ ) { + const TQMetaData *md = w->metaObject()->slot( i, TRUE ); + MetaDataBase::Function funky; + // Find out if we have a return type. + if ( md->method->count > 0 ) { + const TQUParameter p = md->method->parameters[0]; + if ( p.inOut == TQUParameter::InOut ) + funky.returnType = p.type->desc(); + } + + funky.function = md->name; + funky.language = "C++"; + switch ( md->access ) { + case TQMetaData::Public: + funky.access = "public"; + break; + case TQMetaData::Protected: + funky.access = "protected"; + break; + case TQMetaData::Private: + funky.access = "private"; + break; + } + cw->lstSlots.append( funky ); + } + MetaDataBase::addCustomWidget( cw ); + } + iface2->release(); + } + iface->release(); + } + } +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + if ( !saved ) + saveChildrenOf( obj, ts, indent ); + } + + indent--; + ts << closeTag; +} + +void Resource::saveItems( TQObject *obj, TQTextStream &ts, int indent ) +{ + if ( ::tqqt_cast<TQListBox*>(obj) || ::tqqt_cast<TQComboBox*>(obj) ) { + TQListBox *lb = 0; + if ( ::tqqt_cast<TQListBox*>(obj) ) + lb = (TQListBox*)obj; + else + lb = ( (TQComboBox*)obj )->listBox(); + + TQListBoxItem *i = lb->firstItem(); + for ( ; i; i = i->next() ) { + ts << makeIndent( indent ) << "<item>" << endl; + indent++; + TQStringList text; + text << i->text(); + TQPtrList<TQPixmap> pixmaps; + if ( i->pixmap() ) + pixmaps.append( i->pixmap() ); + saveItem( text, pixmaps, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</item>" << endl; + } + } else if ( ::tqqt_cast<TQIconView*>(obj) ) { + TQIconView *iv = (TQIconView*)obj; + + TQIconViewItem *i = iv->firstItem(); + for ( ; i; i = i->nextItem() ) { + ts << makeIndent( indent ) << "<item>" << endl; + indent++; + TQStringList text; + text << i->text(); + TQPtrList<TQPixmap> pixmaps; + if ( i->pixmap() ) + pixmaps.append( i->pixmap() ); + saveItem( text, pixmaps, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</item>" << endl; + } + } else if ( ::tqqt_cast<TQListView*>(obj) ) { + TQListView *lv = (TQListView*)obj; + int i; + for ( i = 0; i < lv->header()->count(); ++i ) { + ts << makeIndent( indent ) << "<column>" << endl; + indent++; + TQStringList l; + l << lv->header()->label( i ); + TQPtrList<TQPixmap> pix; + pix.setAutoDelete( TRUE ); + if ( lv->header()->iconSet( i ) ) + pix.append( new TQPixmap( lv->header()->iconSet( i )->pixmap() ) ); + saveItem( l, pix, ts, indent ); + ts << makeIndent( indent ) << "<property name=\"clickable\">" << endl; + indent++; + ts << makeIndent( indent ) << "<bool>" << mkBool( lv->header()->isClickEnabled( i ) )<< "</bool>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + ts << makeIndent( indent ) << "<property name=\"resizable\">" << endl; + indent++; + ts << makeIndent( indent ) << "<bool>" << mkBool( lv->header()->isResizeEnabled( i ) ) << "</bool>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + indent--; + ts << makeIndent( indent ) << "</column>" << endl; + } + saveItem( lv->firstChild(), ts, indent - 1 ); + } +#if !defined (TQT_NO_TABLE) + else if ( ::tqqt_cast<TQTable*>(obj) ) { + TQTable *table = (TQTable*)obj; + int i; + TQMap<TQString, TQString> columnFields = MetaDataBase::columnFields( TQT_TQOBJECT(table) ); +# ifndef TQT_NO_SQL + bool isDataTable = ::tqqt_cast<TQDataTable*>(table); +# else + bool isDataTable = false; +# endif + for ( i = 0; i < table->horizontalHeader()->count(); ++i ) { + if ( !table->horizontalHeader()->label( i ).isNull() && + table->horizontalHeader()->label( i ).toInt() != i + 1 || + table->horizontalHeader()->iconSet( i ) || + isDataTable ) { + ts << makeIndent( indent ) << "<column>" << endl; + indent++; + TQStringList l; + l << table->horizontalHeader()->label( i ); + TQPtrList<TQPixmap> pix; + pix.setAutoDelete( TRUE ); + if ( table->horizontalHeader()->iconSet( i ) ) + pix.append( new TQPixmap( table->horizontalHeader()->iconSet( i )->pixmap() ) ); + saveItem( l, pix, ts, indent ); + if ( isDataTable && !columnFields.isEmpty() ) { + ts << makeIndent( indent ) << "<property name=\"field\">" << endl; + indent++; + ts << makeIndent( indent ) << "<string>" << entitize( *columnFields.find( l[ 0 ] ) ) << "</string>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + } + indent--; + ts << makeIndent( indent ) << "</column>" << endl; + } + } + for ( i = 0; i < table->verticalHeader()->count(); ++i ) { + if ( !table->verticalHeader()->label( i ).isNull() && + table->verticalHeader()->label( i ).toInt() != i + 1 || + table->verticalHeader()->iconSet( i ) ) { + ts << makeIndent( indent ) << "<row>" << endl; + indent++; + TQStringList l; + l << table->verticalHeader()->label( i ); + TQPtrList<TQPixmap> pix; + pix.setAutoDelete( TRUE ); + if ( table->verticalHeader()->iconSet( i ) ) + pix.append( new TQPixmap( table->verticalHeader()->iconSet( i )->pixmap() ) ); + saveItem( l, pix, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</row>" << endl; + } + } + } +#endif +} + +void Resource::saveItem( TQListViewItem *i, TQTextStream &ts, int indent ) +{ + TQListView *lv = i->listView(); + while ( i ) { + ts << makeIndent( indent ) << "<item>" << endl; + indent++; + + TQPtrList<TQPixmap> pixmaps; + TQStringList textes; + for ( int c = 0; c < lv->columns(); ++c ) { + pixmaps.append( i->pixmap( c ) ); + textes << i->text( c ); + } + saveItem( textes, pixmaps, ts, indent ); + + if ( i->firstChild() ) + saveItem( i->firstChild(), ts, indent ); + + indent--; + ts << makeIndent( indent ) << "</item>" << endl; + i = i->nextSibling(); + } +} + +void Resource::savePixmap( const TQPixmap &p, TQTextStream &ts, int indent, const TQString &tagname ) +{ + if ( p.isNull() ) { + ts << makeIndent( indent ) << "<" << tagname << "></" << tagname << ">" << endl; + return; + } + + if ( formwindow && formwindow->savePixmapInline() ) + ts << makeIndent( indent ) << "<" << tagname << ">" << saveInCollection( p ) << "</" << tagname << ">" << endl; + else if ( formwindow && formwindow->savePixmapInProject() ) + ts << makeIndent( indent ) << "<" << tagname << ">" << MetaDataBase::pixmapKey( TQT_TQOBJECT(formwindow), p.serialNumber() ) + << "</" << tagname << ">" << endl; + else + ts << makeIndent( indent ) << "<" << tagname << ">" << MetaDataBase::pixmapArgument( TQT_TQOBJECT(formwindow), p.serialNumber() ) + << "</" << tagname << ">" << endl; +} + +TQPixmap Resource::loadPixmap( const TQDomElement &e, const TQString &/*tagname*/ ) +{ + TQString arg = e.firstChild().toText().data(); + + if ( formwindow && formwindow->savePixmapInline() ) { + TQImage img = loadFromCollection( arg ); + TQPixmap pix; + pix.convertFromImage( img ); + MetaDataBase::setPixmapArgument( TQT_TQOBJECT(formwindow), pix.serialNumber(), arg ); + return pix; + } else if ( formwindow && formwindow->savePixmapInProject() ) { + TQPixmap pix; + if ( mainwindow && mainwindow->currProject() ) { + pix = mainwindow->currProject()->pixmapCollection()->pixmap( arg ); + } else { + pix = BarIcon( "designer_image.png", KDevDesignerPartFactory::instance() ); + // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that + pix.convertFromImage( pix.convertToImage() ); + } + + MetaDataBase::setPixmapKey( TQT_TQOBJECT(formwindow), pix.serialNumber(), arg ); + return pix; + } + TQPixmap pix = BarIcon( "designer_image.png", KDevDesignerPartFactory::instance() ); + // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that + pix.convertFromImage( pix.convertToImage() ); + MetaDataBase::setPixmapArgument( TQT_TQOBJECT(formwindow), pix.serialNumber(), arg ); + return pix; +} + +void Resource::saveItem( const TQStringList &text, + const TQPtrList<TQPixmap> &pixmaps, TQTextStream &ts, + int indent ) +{ + TQStringList::ConstIterator it = text.begin(); + for ( ; it != text.end(); ++it ) { + ts << makeIndent( indent ) << "<property name=\"text\">" << endl; + indent++; + ts << makeIndent( indent ) << "<string>" << entitize( *it ) << "</string>" << endl; + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + } + + for ( int i = 0; i < (int)pixmaps.count(); ++i ) { + TQPixmap *p = ( (TQPtrList<TQPixmap>)pixmaps ).at( i ); + ts << makeIndent( indent ) << "<property name=\"pixmap\">" << endl; + indent++; + if ( p ) + savePixmap( *p, ts, indent ); + else + savePixmap( TQPixmap(), ts, indent ); + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + } +} + +void Resource::saveChildrenOf( TQObject* obj, TQTextStream &ts, int indent ) +{ + const TQObjectList l = obj->childrenListObject(); + if ( l.isEmpty() ) + return; // no children to save + + TQString closeTag; + // if the widget has a layout we pretend that all widget's childs are childs of the layout - makes the structure nicer + TQLayout *layout = 0; + QDesignerGridLayout* grid = 0; + if ( !::tqqt_cast<TQSplitter*>(obj) && + WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( obj ) ) ) && + obj->isWidgetType() && + WidgetFactory::layoutType( (TQWidget*)obj, layout ) != WidgetFactory::NoLayout ) { + WidgetFactory::LayoutType lay = WidgetFactory::layoutType( (TQWidget*)obj, layout ); + switch ( lay ) { + case WidgetFactory::HBox: + closeTag = makeIndent( indent ) + "</hbox>"; + ts << makeIndent( indent ) << "<hbox>" << endl; + ++indent; + break; + case WidgetFactory::VBox: + closeTag = makeIndent( indent ) + "</vbox>"; + ts << makeIndent( indent ) << "<vbox>" << endl; + ++indent; + break; + case WidgetFactory::Grid: + closeTag = makeIndent( indent ) + "</grid>"; + ts << makeIndent( indent ) << "<grid>" << endl; + ++indent; + grid = (QDesignerGridLayout*) layout; + break; + default: + break; + } + + // save properties of layout + if ( lay != WidgetFactory::NoLayout ) + saveObjectProperties( TQT_TQOBJECT(layout), ts, indent ); + + } + + TQObject *o = 0; + for ( TQPtrListIterator<TQObject> it ( l ); ( o = it.current() ); ++it ) + if ( !TQString( o->name() ).startsWith( "qt_dead_widget_" ) ) + saveObject( o, grid, ts, indent ); + if ( !closeTag.isEmpty() ) { + indent--; + ts << closeTag << endl; + } +} + +void Resource::saveObjectProperties( TQObject *w, TQTextStream &ts, int indent ) +{ + TQStringList saved; + TQStringList changed; + changed = MetaDataBase::changedProperties( w ); + if ( w->isWidgetType() ) { + if ( ::tqqt_cast<Spacer*>(w) ) { + if ( !changed.contains( "sizeHint" ) ) + changed << "sizeHint"; + if ( !changed.contains( "geometry" ) ) + changed << "geometry"; + } else { + TQToolButton *tb = ::tqqt_cast<TQToolButton*>(w); + if ( tb && !tb->iconSet().isNull() ) { + changed << "iconSet"; + } + } + } else if ( ::tqqt_cast<TQLayout*>(w) ) { + if ( MetaDataBase::spacing( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ) > -1 ) + changed << "spacing"; + if ( MetaDataBase::margin( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ) > -1 ) + changed << "margin"; + if ( MetaDataBase::resizeMode( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ) != "Auto" + && !MetaDataBase::resizeMode( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ).isEmpty() ) + changed << "resizeMode"; + } + + if ( TQT_BASE_OBJECT(w) == TQT_BASE_OBJECT(formwindow->mainContainer()) ) { + if ( changed.findIndex( "geometry" ) == -1 ) + changed << "geometry"; + if ( changed.findIndex( "caption" ) == -1 ) + changed << "caption"; + } + + if ( changed.isEmpty() ) + return; + + bool inLayout = TQT_BASE_OBJECT(w) != TQT_BASE_OBJECT(formwindow->mainContainer()) && !copying && w->isWidgetType() && ( (TQWidget*)w )->parentWidget() && + WidgetFactory::layoutType( ( (TQWidget*)w )->parentWidget() ) != WidgetFactory::NoLayout; + + TQStrList lst = w->metaObject()->propertyNames( !::tqqt_cast<Spacer*>(w) ); + for ( TQPtrListIterator<char> it( lst ); it.current(); ++it ) { + if ( changed.find( TQString::fromLatin1( it.current() ) ) == changed.end() ) + continue; + if ( saved.find( TQString::fromLatin1( it.current() ) ) != saved.end() ) + continue; + saved << TQString::fromLatin1( it.current() ); + const TQMetaProperty* p = w->metaObject()-> + property( w->metaObject()->findProperty( it.current(), TRUE ), TRUE ); + if ( !p || !p->stored( w ) || ( inLayout && qstrcmp( p->name(), "geometry" ) == 0 ) ) + continue; + if ( ::tqqt_cast<TQLabel*>(w) && qstrcmp( p->name(), "pixmap" ) == 0 && + ( !( (TQLabel*)w )->pixmap() || ( (TQLabel*)w )->pixmap()->isNull() ) ) + continue; + if ( ::tqqt_cast<MenuBarEditor*>(w) && + ( qstrcmp( p->name(), "itemName" ) == 0 || qstrcmp( p->name(), "itemNumber" ) == 0 || + qstrcmp( p->name(), "itemText" ) == 0 ) ) + continue; + if ( qstrcmp( p->name(), "name" ) == 0 ) + knownNames << w->property( "name" ).toString(); + if ( !p->isSetType() && !p->isEnumType() && !w->property( p->name() ).isValid() ) + continue; + ts << makeIndent( indent ) << "<property"; + ts << " name=\"" << it.current() << "\""; + if ( !p->stdSet() ) + ts << " stdset=\"0\""; + ts << ">" << endl; + indent++; + if ( strcmp( it.current(), "resizeMode" ) == 0 && ::tqqt_cast<TQLayout*>(w) ) { + saveProperty( w, it.current(), "", TQVariant::String, ts, indent ); + } else if ( p->isSetType() ) { + saveSetProperty( w, it.current(), TQVariant::nameToType( p->type() ), ts, indent ); + } else if ( p->isEnumType() ) { + saveEnumProperty( w, it.current(), TQVariant::nameToType( p->type() ), ts, indent ); + } else { + saveProperty( w, it.current(), w->property( p->name() ), TQVariant::nameToType( p->type() ), ts, indent ); + } + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + } + + if ( w->isWidgetType() && MetaDataBase::fakeProperties( w ) ) { + TQMap<TQString, TQVariant>* fakeProperties = MetaDataBase::fakeProperties( w ); + for ( TQMap<TQString, TQVariant>::Iterator fake = fakeProperties->begin(); + fake != fakeProperties->end(); ++fake ) { + if ( MetaDataBase::isPropertyChanged( w, fake.key() ) ) { + if ( w->inherits("CustomWidget") ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)w )->customWidget(); + if ( cw && !cw->hasProperty( fake.key().latin1() ) && fake.key() != "toolTip" && fake.key() != "whatsThis" ) + continue; + } + + ts << makeIndent( indent ) << "<property name=\"" << fake.key() << "\" stdset=\"0\">" << endl; + indent++; + saveProperty( w, fake.key(), *fake, (*fake).type(), ts, indent ); + indent--; + ts << makeIndent( indent ) << "</property>" << endl; + } + } + } +} + +void Resource::saveSetProperty( TQObject *w, const TQString &name, TQVariant::Type, TQTextStream &ts, int indent ) +{ + const TQMetaProperty *p = w->metaObject()->property( w->metaObject()->findProperty( name, TRUE ), TRUE ); + TQStrList l( p->valueToKeys( w->property( name ).toInt() ) ); + TQString v; + for ( uint i = 0; i < l.count(); ++i ) { + v += l.at( i ); + if ( i < l.count() - 1 ) + v += "|"; + } + ts << makeIndent( indent ) << "<set>" << v << "</set>" << endl; +} + +void Resource::saveEnumProperty( TQObject *w, const TQString &name, TQVariant::Type, TQTextStream &ts, int indent ) +{ + const TQMetaProperty *p = w->metaObject()->property( w->metaObject()->findProperty( name, TRUE ), TRUE ); + ts << makeIndent( indent ) << "<enum>" << p->valueToKey( w->property( name ).toInt() ) << "</enum>" << endl; +} + +void Resource::saveProperty( TQObject *w, const TQString &name, const TQVariant &value, TQVariant::Type t, TQTextStream &ts, int indent ) +{ + if ( name == "hAlign" || name =="vAlign" || name == "wordwrap" || + name == "layoutMargin" || name =="layoutSpacing" ) + return; + int num; + uint unum; + double dob; + TQString comment; + if ( w && formwindow->widgets()->find( (TQWidget*)w ) || formwindow->actionList().find( (TQAction*)w ) ) + comment = MetaDataBase::propertyComment( w, name ); + switch ( t ) { + case TQVariant::String: + if ( name == "resizeMode" ) { + TQString resmod = MetaDataBase::resizeMode( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ); + if ( !resmod.isNull() && resmod != "Auto" ) { + ts << makeIndent( indent ) << "<enum>"; + ts << resmod; + ts << "</enum>" << endl; + } + + } else { + ts << makeIndent( indent ) << "<string>" << entitize( value.toString() ) << "</string>" << endl; + if ( !comment.isEmpty() ) + ts << makeIndent( indent ) << "<comment>" << entitize( comment ) << "</comment>" << endl; + } + break; + case TQVariant::CString: + ts << makeIndent( indent ) << "<cstring>" << entitize( value.toCString() ).latin1() << "</cstring>" << endl; + break; + case TQVariant::Bool: + ts << makeIndent( indent ) << "<bool>" << mkBool( value.toBool() ) << "</bool>" << endl; + break; + case TQVariant::Int: + if ( ::tqqt_cast<TQLayout*>(w) ) { + num = -1; + if ( name == "spacing" ) + num = MetaDataBase::spacing( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ); + else if ( name == "margin" ) + num = MetaDataBase::margin( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(w) ) ) ) ); + if ( num != -1 ) + ts << makeIndent( indent ) << "<number>" << TQString::number( num ) << "</number>" << endl; + } else { + num = value.toInt(); + ts << makeIndent( indent ) << "<number>" << TQString::number( num ) << "</number>" << endl; + } + break; + case TQVariant::Double: + dob = value.toDouble(); + ts << makeIndent( indent ) << "<number>" << TQString::number( dob ) << "</number>" << endl; + break; + case TQVariant::KeySequence: + ts << makeIndent( indent ) << "<string>" + << entitize(platformNeutralKeySequence(value.toKeySequence())) << "</string>" << endl; + break; + case TQVariant::UInt: + unum = value.toUInt(); + ts << makeIndent( indent ) << "<number>" << TQString::number( unum ) << "</number>" << endl; + break; + case TQVariant::Rect: { + TQVariant v( value ); + ts << makeIndent( indent ) << "<rect>" << endl; + indent++; + ts << makeIndent( indent ) << "<x>" << TQString::number( v.toRect().x() ) << "</x>" << endl; + ts << makeIndent( indent ) << "<y>" << TQString::number( v.toRect().y() ) << "</y>" << endl; + ts << makeIndent( indent ) << "<width>" << TQString::number( v.toRect().width() ) << "</width>" << endl; + ts << makeIndent( indent ) << "<height>" << TQString::number( v.toRect().height() ) << "</height>" << endl; + indent--; + ts << makeIndent( indent ) << "</rect>" << endl; + } break; + case TQVariant::Point: { + TQVariant v( value ); + ts << makeIndent( indent ) << "<point>" << endl; + indent++; + ts << makeIndent( indent ) << "<x>" << TQString::number( v.toPoint().x() ) << "</x>" << endl; + ts << makeIndent( indent ) << "<y>" << TQString::number( v.toPoint().y() ) << "</y>" << endl; + indent--; + ts << makeIndent( indent ) << "</point>" << endl; + } break; + case TQVariant::Size: { + TQVariant v( value ); + ts << makeIndent( indent ) << "<size>" << endl; + indent++; + ts << makeIndent( indent ) << "<width>" << TQString::number( v.toSize().width() ) << "</width>" << endl; + ts << makeIndent( indent ) << "<height>" << TQString::number( v.toSize().height() ) << "</height>" << endl; + indent--; + ts << makeIndent( indent ) << "</size>" << endl; + } break; + case TQVariant::Color: { + TQVariant v( value ); + ts << makeIndent( indent ) << "<color>" << endl; + indent++; + saveColor( ts, indent, v.toColor() ); + indent--; + ts << makeIndent( indent ) << "</color>" << endl; + } break; + case TQVariant::Font: { + TQVariant v( value ); + ts << makeIndent( indent ) << "<font>" << endl; + TQFont f( tqApp->font() ); + if ( w && w->isWidgetType() && ((TQWidget*)w)->parentWidget() ) + f = ((TQWidget*)w)->parentWidget()->font(); + TQFont f2( v.toFont() ); + indent++; + if ( f.family() != f2.family() ) + ts << makeIndent( indent ) << "<family>" << f2.family() << "</family>" << endl; + if ( f.pointSize() != f2.pointSize() ) + ts << makeIndent( indent ) << "<pointsize>" << TQString::number( f2.pointSize() ) << "</pointsize>" << endl; + if ( f.bold() != f2.bold() ) + ts << makeIndent( indent ) << "<bold>" << TQString::number( (int)f2.bold() ) << "</bold>" << endl; + if ( f.italic() != f2.italic() ) + ts << makeIndent( indent ) << "<italic>" << TQString::number( (int)f2.italic() ) << "</italic>" << endl; + if ( f.underline() != f2.underline() ) + ts << makeIndent( indent ) << "<underline>" << TQString::number( (int)f2.underline() ) << "</underline>" << endl; + if ( f.strikeOut() != f2.strikeOut() ) + ts << makeIndent( indent ) << "<strikeout>" << TQString::number( (int)f2.strikeOut() ) << "</strikeout>" << endl; + indent--; + ts << makeIndent( indent ) << "</font>" << endl; + } break; + case TQVariant::SizePolicy: { + TQSizePolicy sp( value.toSizePolicy() ); + ts << makeIndent( indent ) << "<sizepolicy>" << endl; + indent++; + ts << makeIndent( indent ) << "<hsizetype>" << (int)sp.horData() << "</hsizetype>" << endl; + ts << makeIndent( indent ) << "<vsizetype>" << (int)sp.verData() << "</vsizetype>" << endl; + ts << makeIndent( indent ) << "<horstretch>" << (int)sp.horStretch() << "</horstretch>" << endl; + ts << makeIndent( indent ) << "<verstretch>" << (int)sp.verStretch() << "</verstretch>" << endl; + indent--; + ts << makeIndent( indent ) << "</sizepolicy>" << endl; + break; + } + case TQVariant::Pixmap: + savePixmap( value.toPixmap(), ts, indent ); + break; + case TQVariant::IconSet: + savePixmap( value.toIconSet().pixmap(), ts, indent, "iconset" ); + break; + case TQVariant::Image: + ts << makeIndent( indent ) << "<image>" << saveInCollection( value.toImage() ) << "</image>" << endl; + break; + case TQVariant::Palette: { + TQPalette p( value.toPalette() ); + ts << makeIndent( indent ) << "<palette>" << endl; + indent++; + + ts << makeIndent( indent ) << "<active>" << endl; + indent++; + saveColorGroup( ts, indent, p.active() ); + indent--; + ts << makeIndent( indent ) << "</active>" << endl; + + ts << makeIndent( indent ) << "<disabled>" << endl; + indent++; + saveColorGroup( ts, indent, p.disabled() ); + indent--; + ts << makeIndent( indent ) << "</disabled>" << endl; + + ts << makeIndent( indent ) << "<inactive>" << endl; + indent++; + saveColorGroup( ts, indent, p.inactive() ); + indent--; + ts << makeIndent( indent ) << "</inactive>" << endl; + + indent--; + ts << makeIndent( indent ) << "</palette>" << endl; + } break; + case TQVariant::Cursor: + ts << makeIndent( indent ) << "<cursor>" << value.toCursor().shape() << "</cursor>" << endl; + break; + case TQVariant::StringList: { + TQStringList lst = value.toStringList(); + uint i = 0; + ts << makeIndent( indent ) << "<stringlist>" << endl; + indent++; + if ( !lst.isEmpty() ) { + for ( i = 0; i < lst.count(); ++i ) + ts << makeIndent( indent ) << "<string>" << entitize( lst[ i ] ) << "</string>" << endl; + } + indent--; + ts << makeIndent( indent ) << "</stringlist>" << endl; + } break; + case TQVariant::Date: { + TQDate d = value.toDate(); + ts << makeIndent( indent ) << "<date>" << endl; + indent++; + ts << makeIndent( indent ) << "<year>" << d.year() << "</year>" << endl; + ts << makeIndent( indent ) << "<month>" << d.month() << "</month>" << endl; + ts << makeIndent( indent ) << "<day>" << d.day() << "</day>" << endl; + indent--; + ts << makeIndent( indent ) << "</date>" << endl; + break; + } + case TQVariant::Time: { + TQTime t = value.toTime(); + ts << makeIndent( indent ) << "<time>" << endl; + indent++; + ts << makeIndent( indent ) << "<hour>" << t.hour() << "</hour>" << endl; + ts << makeIndent( indent ) << "<minute>" << t.minute() << "</minute>" << endl; + ts << makeIndent( indent ) << "<second>" << t.second() << "</second>" << endl; + indent--; + ts << makeIndent( indent ) << "</time>" << endl; + break; + } + case TQVariant::DateTime: { + TQDateTime dt = value.toDateTime(); + ts << makeIndent( indent ) << "<datetime>" << endl; + indent++; + ts << makeIndent( indent ) << "<year>" << dt.date().year() << "</year>" << endl; + ts << makeIndent( indent ) << "<month>" << dt.date().month() << "</month>" << endl; + ts << makeIndent( indent ) << "<day>" << dt.date().day() << "</day>" << endl; + ts << makeIndent( indent ) << "<hour>" << dt.time().hour() << "</hour>" << endl; + ts << makeIndent( indent ) << "<minute>" << dt.time().minute() << "</minute>" << endl; + ts << makeIndent( indent ) << "<second>" << dt.time().second() << "</second>" << endl; + indent--; + ts << makeIndent( indent ) << "</datetime>" << endl; + break; + } + default: + tqWarning( "saving the property %s of type %d not supported yet", name.latin1(), (int)t ); + } +} + +void Resource::saveColorGroup( TQTextStream &ts, int indent, const TQColorGroup &cg ) +{ + for( int r = 0 ; r < TQColorGroup::NColorRoles ; r++ ) { + ts << makeIndent( indent ) << "<color>" << endl; + indent++; + saveColor( ts, indent, cg.color( (TQColorGroup::ColorRole)r ) ); + indent--; + ts << makeIndent( indent ) << "</color>" << endl; + TQPixmap* pm = cg.brush( (TQColorGroup::ColorRole)r ).pixmap(); + if ( pm && !pm->isNull() ) + savePixmap( *pm, ts, indent ); + } +} + +void Resource::saveColor( TQTextStream &ts, int indent, const TQColor &c ) +{ + ts << makeIndent( indent ) << "<red>" << TQString::number( c.red() ) << "</red>" << endl; + ts << makeIndent( indent ) << "<green>" << TQString::number( c.green() ) << "</green>" << endl; + ts << makeIndent( indent ) << "<blue>" << TQString::number( c.blue() ) << "</blue>" << endl; +} + +TQObject *Resource::createObject( const TQDomElement &e, TQWidget *parent, TQLayout* layout ) +{ + lastItem = 0; + TQDomElement n = e.firstChild().toElement(); + TQWidget *w = 0; // the widget that got created + TQObject *obj = 0; // gets the properties + + int row = e.attribute( "row" ).toInt(); + int col = e.attribute( "column" ).toInt(); + int rowspan = e.attribute( "rowspan" ).toInt(); + int colspan = e.attribute( "colspan" ).toInt(); + if ( rowspan < 1 ) + rowspan = 1; + if ( colspan < 1 ) + colspan = 1; + + TQString className = e.attribute( "class", TQWIDGET_OBJECT_NAME_STRING ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + TQString parentClassName = WidgetFactory::classNameOf( parent ); + bool isPlugin = + WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( parentClassName ) ); + if ( isPlugin ) + tqWarning( "####### loading custom container widgets without page support not implemented!" ); + // ### TODO loading for custom container widgets without pages +#endif + if ( !className.isNull() ) { + obj = TQT_TQOBJECT(WidgetFactory::create( WidgetDatabase::idFromClassName( className ), parent, 0, FALSE )); + if ( !obj ) { + TQMessageBox::critical( MainWindow::self, i18n( "Loading File" ), + i18n( "Error loading %1.\n" + "The widget %2 could not be created." ). + arg( currFileName ).arg( className ) ); + return 0; + } + if ( !mainContainerSet ) { + if ( formwindow ) + formwindow->setMainContainer( (TQWidget*)obj ); + mainContainerSet = TRUE; + } + w = (TQWidget*)obj; + if ( ::tqqt_cast<TQMainWindow*>(w) ) + w = ( (TQMainWindow*)w )->centralWidget(); + if ( layout ) { + switch ( WidgetFactory::layoutType( layout ) ) { + case WidgetFactory::HBox: + ( (TQHBoxLayout*)layout )->addWidget( w ); + break; + case WidgetFactory::VBox: + ( (TQVBoxLayout*)layout )->addWidget( w ); + break; + case WidgetFactory::Grid: + ( (QDesignerGridLayout*)layout )->addMultiCellWidget( w, row, row + rowspan - 1, + col, col + colspan - 1 ); + break; + default: + break; + } + } + + if ( !toplevel ) + toplevel = w; + layout = 0; + + if ( w && formwindow ) { + if ( !parent || + ( !::tqqt_cast<TQTabWidget*>(parent) && + !::tqqt_cast<TQWidgetStack*>(parent) && + !::tqqt_cast<TQToolBox*>(parent) && + !::tqqt_cast<TQWizard*>(parent) +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + && !isPlugin +#endif + ) ) + formwindow->insertWidget( w, pasting ); + else if ( parent && + ( ::tqqt_cast<TQTabWidget*>(parent) || + ::tqqt_cast<TQWidgetStack*>(parent) || + ::tqqt_cast<TQToolBox*>(parent) || + ::tqqt_cast<TQWizard*>(parent) +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + || isPlugin +#endif + ) ) + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + } + } + + TQDomElement sizePolicyElement; + TQObject *sizePolicyObject = 0; + + while ( !n.isNull() ) { + if ( n.tagName() == "spacer" ) { + createSpacer( n, w, layout, Qt::Horizontal ); + } else if ( n.tagName() == "widget" ) { + createObject( n, w, layout ); + } else if ( n.tagName() == "hbox" ) { + layout = WidgetFactory::createLayout( w, layout, WidgetFactory::HBox ); + obj = TQT_TQOBJECT(layout); + n = n.firstChild().toElement(); + continue; + } else if ( n.tagName() == "grid" ) { + layout = WidgetFactory::createLayout( w, layout, WidgetFactory::Grid ); + obj = TQT_TQOBJECT(layout); + n = n.firstChild().toElement(); + continue; + } else if ( n.tagName() == "vbox" ) { + layout = WidgetFactory::createLayout( w, layout, WidgetFactory::VBox ); + obj = TQT_TQOBJECT(layout); + n = n.firstChild().toElement(); + continue; + } else if ( n.tagName() == "property" && obj ) { + if ( n.attribute( "name" ) == "sizePolicy" ) { + // ### Evil hack ### Delay setting sizePolicy so it won't be overridden by other properties. + sizePolicyElement = n; + sizePolicyObject = obj; + } else { + setObjectProperty( obj, n.attribute( "name" ), n.firstChild().toElement() ); + } + } else if ( n.tagName() == "attribute" && w ) { + TQString attrib = n.attribute( "name" ); + TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); + if ( ::tqqt_cast<TQTabWidget*>(parent) ) { + if ( attrib == "title" ) + ( (TQTabWidget*)parent )->insertTab( w, v.toString() ); + } else if ( ::tqqt_cast<TQWidgetStack*>(parent) ) { + if ( attrib == "id" ) + ( (QDesignerWidgetStack*)parent )->insertPage( w, v.toInt() ); + } else if ( ::tqqt_cast<TQToolBox*>(parent) ) { + if ( attrib == "label" ) + ( (TQToolBox*)parent )->addItem( w, v.toString() ); + } else if ( ::tqqt_cast<TQWizard*>(parent) ) { + if ( attrib == "title" ) + ( (TQWizard*)parent )->addPage( w, v.toString() ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + } else if ( isPlugin ) { + if ( attrib == "label" ) { + WidgetInterface *iface = 0; + widgetManager()->queryInterface( parentClassName, &iface ); + if ( iface ) { + TQWidgetContainerInterfacePrivate *iface2 = 0; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); + if ( iface2 ) { + iface2->insertPage( parentClassName, + (TQWidget*)parent, v.toString(), -1, w ); + iface2->release(); + } + iface->release(); + } + } +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + } + } else if ( n.tagName() == "item" ) { + createItem( n, w ); + } else if ( n.tagName() == "column" || n.tagName() =="row" ) { + createColumn( n, w ); + } + + n = n.nextSibling().toElement(); + } + + // ### Evil hack ### See description above. + if ( !sizePolicyElement.isNull() ) { + setObjectProperty( sizePolicyObject, + sizePolicyElement.attribute( "name" ), + sizePolicyElement.firstChild().toElement() ); + } + + if ( w->isWidgetType() ) + widgets.insert( w->name(), w ); + + return TQT_TQOBJECT(w); +} + +void Resource::createColumn( const TQDomElement &e, TQWidget *widget ) +{ + if ( !widget ) + return; + + if ( ::tqqt_cast<TQListView*>(widget) && e.tagName() == "column" ) { + TQListView *lv = (TQListView*)widget; + TQDomElement n = e.firstChild().toElement(); + TQPixmap pix; + bool hasPixmap = FALSE; + TQString txt; + bool clickable = TRUE, resizable = TRUE; + while ( !n.isNull() ) { + if ( n.tagName() == "property" ) { + TQString attrib = n.attribute( "name" ); + TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); + if ( attrib == "text" ) + txt = v.toString(); + else if ( attrib == "pixmap" ) { + pix = loadPixmap( n.firstChild().toElement().toElement() ); + hasPixmap = !pix.isNull(); + } else if ( attrib == "clickable" ) + clickable = v.toBool(); + else if ( attrib == "resizable" ) + resizable = v.toBool(); + } + n = n.nextSibling().toElement(); + } + lv->addColumn( txt ); + int i = lv->header()->count() - 1; + if ( hasPixmap ) { + lv->header()->setLabel( i, pix, txt ); + } + if ( !clickable ) + lv->header()->setClickEnabled( clickable, i ); + if ( !resizable ) + lv->header()->setResizeEnabled( resizable, i ); + } +#ifndef TQT_NO_TABLE + else if ( ::tqqt_cast<TQTable*>(widget) ) { + TQTable *table = (TQTable*)widget; + bool isRow; + if ( ( isRow = e.tagName() == "row" ) ) + table->setNumRows( table->numRows() + 1 ); + else + table->setNumCols( table->numCols() + 1 ); + + TQDomElement n = e.firstChild().toElement(); + TQPixmap pix; + bool hasPixmap = FALSE; + TQString txt; + TQString field; + TQMap<TQString, TQString> fieldMap = MetaDataBase::columnFields( TQT_TQOBJECT(table) ); + while ( !n.isNull() ) { + if ( n.tagName() == "property" ) { + TQString attrib = n.attribute( "name" ); + TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); + if ( attrib == "text" ) + txt = v.toString(); + else if ( attrib == "pixmap" ) { + hasPixmap = !n.firstChild().firstChild().toText().data().isEmpty(); + if ( hasPixmap ) + pix = loadPixmap( n.firstChild().toElement() ); + } else if ( attrib == "field" ) + field = v.toString(); + } + n = n.nextSibling().toElement(); + } + + int i = isRow ? table->numRows() - 1 : table->numCols() - 1; + TQHeader *h = !isRow ? table->horizontalHeader() : table->verticalHeader(); + if ( hasPixmap ) + h->setLabel( i, pix, txt ); + else + h->setLabel( i, txt ); + if ( !isRow && !field.isEmpty() ) + fieldMap.insert( txt, field ); + MetaDataBase::setColumnFields( TQT_TQOBJECT(table), fieldMap ); + } +#endif +} + +void Resource::loadItem( const TQDomElement &e, TQPixmap &pix, TQString &txt, bool &hasPixmap ) +{ + TQDomElement n = e; + hasPixmap = FALSE; + while ( !n.isNull() ) { + if ( n.tagName() == "property" ) { + TQString attrib = n.attribute( "name" ); + TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); + if ( attrib == "text" ) + txt = v.toString(); + else if ( attrib == "pixmap" ) { + pix = loadPixmap( n.firstChild().toElement() ); + hasPixmap = !pix.isNull(); + } + } + n = n.nextSibling().toElement(); + } +} + +void Resource::createItem( const TQDomElement &e, TQWidget *widget, TQListViewItem *i ) +{ + if ( !widget || !WidgetFactory::hasItems( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(widget) ) ), TQT_TQOBJECT(widget) ) ) + return; + + if ( ::tqqt_cast<TQListBox*>(widget) || ::tqqt_cast<TQComboBox*>(widget) ) { + TQDomElement n = e.firstChild().toElement(); + TQPixmap pix; + bool hasPixmap = FALSE; + TQString txt; + loadItem( n, pix, txt, hasPixmap ); + TQListBox *lb = 0; + if ( ::tqqt_cast<TQListBox*>(widget) ) + lb = (TQListBox*)widget; + else + lb = ( (TQComboBox*)widget)->listBox(); + if ( hasPixmap ) { + new TQListBoxPixmap( lb, pix, txt ); + } else { + new TQListBoxText( lb, txt ); + } + } else if ( ::tqqt_cast<TQIconView*>(widget) ) { + TQDomElement n = e.firstChild().toElement(); + TQPixmap pix; + bool hasPixmap = FALSE; + TQString txt; + loadItem( n, pix, txt, hasPixmap ); + TQIconView *iv = (TQIconView*)widget; + if ( hasPixmap ) + new TQIconViewItem( iv, txt, pix ); + else + new TQIconViewItem( iv, txt ); + } else if ( ::tqqt_cast<TQListView*>(widget) ) { + TQDomElement n = e.firstChild().toElement(); + TQPixmap pix; + TQValueList<TQPixmap> pixmaps; + TQStringList textes; + TQListViewItem *item = 0; + TQListView *lv = (TQListView*)widget; + if ( i ) + item = new TQListViewItem( i, lastItem ); + else + item = new TQListViewItem( lv, lastItem ); + while ( !n.isNull() ) { + if ( n.tagName() == "property" ) { + TQString attrib = n.attribute( "name" ); + TQVariant v = DomTool::elementToVariant( n.firstChild().toElement(), TQVariant() ); + if ( attrib == "text" ) + textes << v.toString(); + else if ( attrib == "pixmap" ) { + TQString s = v.toString(); + if ( s.isEmpty() ) { + pixmaps << TQPixmap(); + } else { + pix = loadPixmap( n.firstChild().toElement() ); + pixmaps << pix; + } + } + } else if ( n.tagName() == "item" ) { + item->setOpen( TRUE ); + createItem( n, widget, item ); + } + + n = n.nextSibling().toElement(); + } + + for ( int i = 0; i < lv->columns(); ++i ) { + item->setText( i, textes[ i ] ); + item->setPixmap( i, pixmaps[ i ] ); + } + lastItem = item; + } +} + +TQWidget *Resource::createSpacer( const TQDomElement &e, TQWidget *parent, TQLayout *layout, Qt::Orientation o ) +{ + TQDomElement n = e.firstChild().toElement(); + int row = e.attribute( "row" ).toInt(); + int col = e.attribute( "column" ).toInt(); + int rowspan = e.attribute( "rowspan" ).toInt(); + int colspan = e.attribute( "colspan" ).toInt(); + if ( rowspan < 1 ) + rowspan = 1; + if ( colspan < 1 ) + colspan = 1; + + Spacer *spacer = (Spacer*) WidgetFactory::create( WidgetDatabase::idFromClassName("Spacer"), + parent, "spacer", FALSE); + spacer->setOrientation( o ); + spacer->setInteraciveMode( FALSE ); + while ( !n.isNull() ) { + if ( n.tagName() == "property" ) + setObjectProperty( TQT_TQOBJECT(spacer), n.attribute( "name" ), n.firstChild().toElement() ); + n = n.nextSibling().toElement(); + } + spacer->setInteraciveMode( TRUE ); + if ( formwindow ) + formwindow->insertWidget( spacer, pasting ); + if ( layout ) { + if ( ::tqqt_cast<TQBoxLayout*>(layout) ) + ( (TQBoxLayout*)layout )->addWidget( spacer, 0, spacer->alignment() ); + else + ( (QDesignerGridLayout*)layout )->addMultiCellWidget( spacer, row, row + rowspan - 1, col, col + colspan - 1, + spacer->alignment() ); + } + return spacer; +} + +/*! + Attention: this function has to be in sync with Uic::setObjectProperty(). If you change one, change both. +*/ +void Resource::setObjectProperty( TQObject* obj, const TQString &prop, const TQDomElement &e ) +{ + const TQMetaProperty *p = obj->metaObject()->property( obj->metaObject()->findProperty( prop, TRUE ), TRUE ); + + if ( !::tqqt_cast<TQLayout*>(obj) ) {// no layouts in metadatabase... (RS) + if ( obj->inherits( "CustomWidget" ) ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)obj )->customWidget(); + if ( cw && !cw->hasProperty( prop.latin1() ) && !p && prop != "toolTip" && prop != "whatsThis" ) + return; + } + MetaDataBase::setPropertyChanged( obj, prop, TRUE ); + } + + TQVariant defVarient; + if ( e.tagName() == "font" ) { + TQFont f( tqApp->font() ); + if ( obj->isWidgetType() && ( (TQWidget*)obj )->parentWidget() ) + f = ( (TQWidget*)obj )->parentWidget()->font(); + defVarient = TQVariant( f ); + } + + TQString comment; + TQVariant v( DomTool::elementToVariant( e, defVarient, comment ) ); + + if ( !comment.isEmpty() ) { + MetaDataBase::addEntry( obj ); + MetaDataBase::setPropertyComment( obj, prop, comment ); + } + + if ( e.tagName() == "pixmap" ) { + TQPixmap pix = loadPixmap( e ); + if ( pix.isNull() ) + return; + v = TQVariant( pix ); + } else if ( e.tagName() == "iconset" ) { + TQPixmap pix = loadPixmap( e, "iconset" ); + if ( pix.isNull() ) + return; + v = TQVariant( TQIconSet( pix ) ); + } else if ( e.tagName() == "image" ) { + v = TQVariant( loadFromCollection( v.toString() ) ); + } + + if ( !p ) { + MetaDataBase::setFakeProperty( obj, prop, v ); + if ( obj->isWidgetType() ) { + if ( prop == "database" && TQT_TQOBJECT(obj) != TQT_TQOBJECT(toplevel) ) { + TQStringList lst = MetaDataBase::fakeProperty( obj, "database" ).toStringList(); + if ( lst.count() > 2 ) + dbControls.insert( obj->name(), lst[ 2 ] ); + else if ( lst.count() == 2 ) + dbTables.insert( obj->name(), lst ); + } + return; + } + } + + if ( e.tagName() == "palette" ) { + TQDomElement n = e.firstChild().toElement(); + TQPalette p; + while ( !n.isNull() ) { + TQColorGroup cg; + if ( n.tagName() == "active" ) { + cg = loadColorGroup( n ); + p.setActive( cg ); + } else if ( n.tagName() == "inactive" ) { + cg = loadColorGroup( n ); + p.setInactive( cg ); + } else if ( n.tagName() == "disabled" ) { + cg = loadColorGroup( n ); + p.setDisabled( cg ); + } + n = n.nextSibling().toElement(); + } + v = TQPalette( p ); + } else if ( e.tagName() == "enum" && p && p->isEnumType() && prop != "resizeMode" ) { + TQString key( v.toString() ); + int vi = p->keyToValue( key ); + if ( p->valueToKey( vi ) != key ) + return; // ignore invalid properties + v = TQVariant( vi ); + } else if ( e.tagName() == "set" && p && p->isSetType() ) { + TQString keys( v.toString() ); + TQStringList lst = TQStringList::split( '|', keys ); + TQStrList l; + for ( TQStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) + l.append( *it ); + v = TQVariant( p->keysToValue( l ) ); + } + + if ( prop == "caption" ) { + TQCString s1 = v.toCString(); + TQString s2 = v.toString(); + if ( !s2.isEmpty() ) + formwindow->setCaption( s2 ); + else if ( !s1.isEmpty() ) + formwindow->setCaption( s1 ); + } + if ( prop == "icon" ) { + formwindow->setIcon( v.toPixmap() ); + TQString pmk = MetaDataBase::pixmapKey( TQT_TQOBJECT(formwindow), v.toPixmap().serialNumber() ); + MetaDataBase::setPixmapKey( TQT_TQOBJECT(formwindow), + formwindow->icon()->serialNumber(), pmk ); + } + + if ( prop == "geometry" ) { + if ( TQT_BASE_OBJECT(obj) == TQT_BASE_OBJECT(toplevel) ) { + hadGeometry = TRUE; + toplevel->resize( v.toRect().size() ); + return; + } else if ( TQT_BASE_OBJECT(obj) == TQT_BASE_OBJECT(formwindow->mainContainer()) ) { + hadGeometry = TRUE; + formwindow->resize( v.toRect().size() ); + return; + } + } + + if ( ::tqqt_cast<TQLayout*>(obj) ) { + if ( prop == "spacing" ) { + MetaDataBase::setSpacing( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(obj) ) ) ), v.toInt() ); + return; + } else if ( prop == "margin" ) { + MetaDataBase::setMargin( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(obj) ) ) ), v.toInt() ); + return; + } else if ( e.tagName() == "enum" && prop == "resizeMode" ) { + MetaDataBase::setResizeMode( TQT_TQOBJECT( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (TQLayout*)(obj) ) ) ), v.toString() ); + return; + } + } + + if ( prop == "name" ) { + if ( pasting ) { + TQString s = v.toString(); + formwindow->unify( TQT_TQOBJECT(obj), s, TRUE ); + obj->setName( s ); + return; + } else if ( formwindow && TQT_BASE_OBJECT(obj) == TQT_BASE_OBJECT(formwindow->mainContainer()) ) { + formwindow->setName( v.toCString() ); + } + } + + if ( prop == "sizePolicy" ) { + TQSizePolicy sp = v.toSizePolicy(); + sp.setHeightForWidth( ( (TQWidget*)obj )->sizePolicy().hasHeightForWidth() ); + } + + if ( prop == "cursor" ) + MetaDataBase::setCursor( (TQWidget*)obj, v.toCursor() ); + + obj->setProperty( prop, v ); +} + + +TQString Resource::saveInCollection( const TQImage &img ) +{ + TQString imgName = "none"; + TQValueList<Image>::Iterator it = images.begin(); + for ( ; it != images.end(); ++it ) { + if ( img == ( *it ).img ) { + imgName = ( *it ).name; + break; + } + } + + if ( imgName == "none" ) { + Image i; + imgName = "image" + TQString::number( images.count() ); + i.name = imgName; + i.img = img; + images.append( i ); + } + return imgName; +} + +void Resource::saveImageData( const TQImage &img, TQTextStream &ts, int indent ) +{ + TQByteArray ba; + TQBuffer buf( ba ); + buf.open( IO_WriteOnly | IO_Translate ); + TQString format; + bool compress = FALSE; + if (img.hasAlphaBuffer()) { + format = "PNG"; + } else { + format = img.depth() > 1 ? "XPM" : "XBM"; + compress = TRUE; + } + TQImageIO iio( &buf, format ); + iio.setImage( img ); + iio.write(); + buf.close(); + TQByteArray bazip = ba; + int i = 0; + if (compress) { + bazip = tqCompress( ba ); + format += ".GZ"; + // The first 4 bytes in tqCompress() are the length of the unzipped + // format. The XPM.GZ format does not use these. + i = 4; + } + ulong len = bazip.size(); + ts << makeIndent( indent ) << "<data format=\"" + format + "\" length=\"" << ba.size() << "\">"; + static const char hexchars[] = "0123456789abcdef"; + for (; i < (int)len; ++i ) { + uchar s = (uchar) bazip[i]; + ts << hexchars[s >> 4]; + ts << hexchars[s & 0x0f]; + } + ts << "</data>" << endl; +} + +void Resource::saveImageCollection( TQTextStream &ts, int indent ) +{ + ts << makeIndent( indent ) << "<images>" << endl; + indent++; + + TQValueList<Image>::Iterator it = images.begin(); + for ( ; it != images.end(); ++it ) { + ts << makeIndent( indent ) << "<image name=\"" << (*it).name << "\">" << endl; + indent++; + saveImageData( (*it).img, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</image>" << endl; + } + + indent--; + ts << makeIndent( indent ) << "</images>" << endl; +} + +static TQImage loadImageData( TQDomElement &n2 ) +{ + TQImage img; + TQString data = n2.firstChild().toText().data(); + const int lengthOffset = 4; + int baSize = data.length() / 2 + lengthOffset; + uchar *ba = new uchar[ baSize ]; + for ( int i = lengthOffset; i < baSize; ++i ) { + char h = data[ 2 * (i-lengthOffset) ].latin1(); + char l = data[ 2 * (i-lengthOffset) + 1 ].latin1(); + uchar r = 0; + if ( h <= '9' ) + r += h - '0'; + else + r += h - 'a' + 10; + r = r << 4; + if ( l <= '9' ) + r += l - '0'; + else + r += l - 'a' + 10; + ba[ i ] = r; + } + TQString format = n2.attribute( "format", "PNG" ); + if ( format == "XPM.GZ" || format == "XBM.GZ" ) { + ulong len = n2.attribute( "length" ).toULong(); + if ( len < data.length() * 5 ) + len = data.length() * 5; + // tqUncompress() expects the first 4 bytes to be the expected length of + // the uncompressed data + ba[0] = ( len & 0xff000000 ) >> 24; + ba[1] = ( len & 0x00ff0000 ) >> 16; + ba[2] = ( len & 0x0000ff00 ) >> 8; + ba[3] = ( len & 0x000000ff ); + TQByteArray baunzip = tqUncompress( ba, baSize ); + img.loadFromData( (const uchar*)baunzip.data(), baunzip.size(), format.left(format.find('.')) ); + } else { + img.loadFromData( (const uchar*)ba+lengthOffset, baSize-lengthOffset, format ); + } + delete [] ba; + return img; +} + +void Resource::loadImageCollection( const TQDomElement &e ) +{ + TQDomElement n = e.firstChild().toElement(); + while ( !n.isNull() ) { + if ( n.tagName() == "image" ) { + Image img; + img.name = n.attribute( "name" ); + TQDomElement n2 = n.firstChild().toElement(); + while ( !n2.isNull() ) { + if ( n2.tagName() == "data" ) + img.img = loadImageData( n2 ); + n2 = n2.nextSibling().toElement(); + } + images.append( img ); + n = n.nextSibling().toElement(); + } + } +} + +TQImage Resource::loadFromCollection( const TQString &name ) +{ + TQValueList<Image>::Iterator it = images.begin(); + for ( ; it != images.end(); ++it ) { + if ( ( *it ).name == name ) + return ( *it ).img; + } + return TQImage(); +} + +void Resource::saveConnections( TQTextStream &ts, int indent ) +{ + TQValueList<MetaDataBase::Connection> connections = MetaDataBase::connections( TQT_TQOBJECT(formwindow) ); + if ( connections.isEmpty() ) + return; + ts << makeIndent( indent ) << "<connections>" << endl; + indent++; + TQValueList<MetaDataBase::Connection>::Iterator it = connections.begin(); + for ( ; it != connections.end(); ++it ) { + MetaDataBase::Connection conn = *it; + if ( ( knownNames.findIndex( TQString( conn.sender->name() ) ) == -1 && + qstrcmp( conn.sender->name(), "this" ) != 0 ) || + ( knownNames.findIndex( TQString( conn.receiver->name() ) ) == -1 && + qstrcmp( conn.receiver->name(), "this" ) != 0 ) ) + continue; + if ( formwindow->isMainContainer( TQT_TQOBJECT((*it).receiver) ) && + !MetaDataBase::hasSlot( TQT_TQOBJECT(formwindow), MetaDataBase::normalizeFunction( (*it).slot ).latin1() ) ) + continue; + + if ( conn.sender->inherits( "CustomWidget" ) ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)conn.sender )->customWidget(); + if ( cw && !cw->hasSignal( conn.signal ) ) + continue; + } + + if ( conn.receiver->inherits( "CustomWidget" ) && !formwindow->isMainContainer( conn.receiver ) ) { + MetaDataBase::CustomWidget *cw = ( (CustomWidget*)conn.receiver )->customWidget(); + if ( cw && !cw->hasSlot( MetaDataBase::normalizeFunction( conn.slot ).latin1() ) ) + continue; + } + + ts << makeIndent( indent ) << "<connection>" << endl; + indent++; + ts << makeIndent( indent ) << "<sender>" << entitize( conn.sender->name() ) << "</sender>" << endl; + ts << makeIndent( indent ) << "<signal>" << entitize( conn.signal ) << "</signal>" << endl; + ts << makeIndent( indent ) << "<receiver>" << entitize( conn.receiver->name() ) << "</receiver>" << endl; + ts << makeIndent( indent ) << "<slot>" << entitize( MetaDataBase::normalizeFunction( conn.slot ) ) << "</slot>" << endl; + indent--; + ts << makeIndent( indent ) << "</connection>" << endl; + } + + TQString lang = formwindow->project()->language(); + indent--; + ts << makeIndent( indent ) << "</connections>" << endl; +} + +void Resource::loadConnections( const TQDomElement &e ) +{ + TQDomElement n = e.firstChild().toElement(); + while ( !n.isNull() ) { + if ( n.tagName() == "connection" ) { + TQString lang = n.attribute( "language", "C++" ); + TQDomElement n2 = n.firstChild().toElement(); + MetaDataBase::Connection conn; + while ( !n2.isNull() ) { + if ( n2.tagName() == "sender" ) { + conn.sender = 0; + TQString name = n2.firstChild().toText().data(); + if ( name == "this" || qstrcmp( toplevel->name(), name ) == 0 ) { + conn.sender = TQT_TQOBJECT(toplevel); + } else { + if ( name == "this" ) + name = toplevel->name(); + TQObjectList *l = toplevel->queryList( 0, name, FALSE ); + if ( l ) { + if ( l->first() ) + conn.sender = l->first(); + delete l; + l = 0; + } + if ( !conn.sender ) + conn.sender = formwindow->findAction( name ); + } + } else if ( n2.tagName() == "signal" ) { + conn.signal = n2.firstChild().toText().data(); + } else if ( n2.tagName() == "receiver" ) { + conn.receiver = 0; + TQString name = n2.firstChild().toText().data(); + if ( name == "this" || qstrcmp( toplevel->name(), name ) == 0 ) { + conn.receiver = TQT_TQOBJECT(toplevel); + } else { + TQObjectList *l = toplevel->queryList( 0, name, FALSE ); + if ( l ) { + if ( l->first() ) + conn.receiver = l->first(); + delete l; + l = 0; + } + if ( !conn.receiver ) + conn.receiver = formwindow->findAction( name ); + } + } else if ( n2.tagName() == "slot" ) { + conn.slot = n2.firstChild().toText().data(); + } + n2 = n2.nextSibling().toElement(); + } + if ( formwindow ) { + if ( TQT_BASE_OBJECT(conn.sender) == TQT_BASE_OBJECT(formwindow) ) + conn.sender = TQT_TQOBJECT(formwindow->mainContainer()); + if ( TQT_BASE_OBJECT(conn.receiver) == TQT_BASE_OBJECT(formwindow) ) + conn.receiver = TQT_TQOBJECT(formwindow->mainContainer()); + } + if ( conn.sender && conn.receiver ) { + if ( lang == "C++" ) { + MetaDataBase::addConnection( TQT_TQOBJECT(formwindow ? formwindow : toplevel), + conn.sender, conn.signal, conn.receiver, conn.slot ); + } + } + } else if ( n.tagName() == "slot" ) { // compatibility with 2.x + MetaDataBase::Function slot; + slot.specifier = n.attribute( "specifier", "virtual" ); + if ( slot.specifier.isEmpty() ) + slot.specifier = "virtual"; + slot.access = n.attribute( "access", "public" ); + if ( slot.access.isEmpty() ) + slot.access = "public"; + slot.language = n.attribute( "language", "C++" ); + slot.returnType = n.attribute( "returnType", "void" ); + if ( slot.returnType.isEmpty() ) + slot.returnType = "void"; + slot.function = n.firstChild().toText().data(); + if ( !MetaDataBase::hasFunction( TQT_TQOBJECT(formwindow), slot.function, TRUE ) ) + MetaDataBase::addFunction( TQT_TQOBJECT(formwindow), slot.function, slot.specifier, + slot.access, "slot", slot.language, slot.returnType ); + else + MetaDataBase::changeFunctionAttributes( TQT_TQOBJECT(formwindow), slot.function, slot.function, + slot.specifier, slot.access, + "slot", slot.language, slot.returnType ); + } + n = n.nextSibling().toElement(); + } +} + +void Resource::saveCustomWidgets( TQTextStream &ts, int indent ) +{ + ts << makeIndent( indent ) << "<customwidgets>" << endl; + indent++; + + TQPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); + for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { + if ( usedCustomWidgets.findIndex( w->className ) == -1 ) + continue; + ts << makeIndent( indent ) << "<customwidget>" << endl; + indent++; + ts << makeIndent( indent ) << "<class>" << w->className << "</class>" << endl; + ts << makeIndent( indent ) << "<header location=\"" + << ( w->includePolicy == MetaDataBase::CustomWidget::Local ? "local" : "global" ) + << "\">" << w->includeFile << "</header>" << endl; + ts << makeIndent( indent ) << "<sizehint>" << endl; + indent++; + ts << makeIndent( indent ) << "<width>" << w->sizeHint.width() << "</width>" << endl; + ts << makeIndent( indent ) << "<height>" << w->sizeHint.height() << "</height>" << endl; + indent--; + ts << makeIndent( indent ) << "</sizehint>" << endl; + ts << makeIndent( indent ) << "<container>" << (int)w->isContainer << "</container>" << endl; + ts << makeIndent( indent ) << "<sizepolicy>" << endl; + indent++; + ts << makeIndent( indent ) << "<hordata>" << (int)w->sizePolicy.horData() << "</hordata>" << endl; + ts << makeIndent( indent ) << "<verdata>" << (int)w->sizePolicy.verData() << "</verdata>" << endl; + ts << makeIndent( indent ) << "<horstretch>" << (int)w->sizePolicy.horStretch() << "</horstretch>" << endl; + ts << makeIndent( indent ) << "<verstretch>" << (int)w->sizePolicy.verStretch() << "</verstretch>" << endl; + indent--; + ts << makeIndent( indent ) << "</sizepolicy>" << endl; + ts << makeIndent( indent ) << "<pixmap>" << saveInCollection( w->pixmap->convertToImage() ) << "</pixmap>" << endl; + if ( !w->lstSignals.isEmpty() ) { + for ( TQValueList<TQCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) + ts << makeIndent( indent ) << "<signal>" << entitize( *it ) << "</signal>" << endl; + } + if ( !w->lstSlots.isEmpty() ) { + for ( TQValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) + ts << makeIndent( indent ) << "<slot access=\"" << (*it).access << "\" specifier=\"" + << (*it).specifier << "\">" << entitize( (*it).function ) << "</slot>" << endl; + } + if ( !w->lstProperties.isEmpty() ) { + for ( TQValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it ) + ts << makeIndent( indent ) << "<property type=\"" << (*it).type << "\">" << entitize( (*it).property ) << "</property>" << endl; + } + indent--; + ts << makeIndent( indent ) << "</customwidget>" << endl; + } + + + indent--; + ts << makeIndent( indent ) << "</customwidgets>" << endl; +} + +void Resource::loadCustomWidgets( const TQDomElement &e, Resource *r ) +{ + TQDomElement n = e.firstChild().toElement(); + while ( !n.isNull() ) { + if ( n.tagName() == "customwidget" ) { + TQDomElement n2 = n.firstChild().toElement(); + MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget; + while ( !n2.isNull() ) { + if ( n2.tagName() == "class" ) { + w->className = n2.firstChild().toText().data(); + } else if ( n2.tagName() == "header" ) { + w->includeFile = n2.firstChild().toText().data(); + TQString s = n2.attribute( "location" ); + if ( s != "local" ) + w->includePolicy = MetaDataBase::CustomWidget::Global; + else + w->includePolicy = MetaDataBase::CustomWidget::Local; + } else if ( n2.tagName() == "sizehint" ) { + TQDomElement n3 = n2.firstChild().toElement(); + while ( !n3.isNull() ) { + if ( n3.tagName() == "width" ) + w->sizeHint.setWidth( n3.firstChild().toText().data().toInt() ); + else if ( n3.tagName() == "height" ) + w->sizeHint.setHeight( n3.firstChild().toText().data().toInt() ); + n3 = n3.nextSibling().toElement(); + } + } else if ( n2.tagName() == "sizepolicy" ) { + TQDomElement n3 = n2.firstChild().toElement(); + while ( !n3.isNull() ) { + if ( n3.tagName() == "hordata" ) + w->sizePolicy.setHorData( (TQSizePolicy::SizeType)n3.firstChild().toText().data().toInt() ); + else if ( n3.tagName() == "verdata" ) + w->sizePolicy.setVerData( (TQSizePolicy::SizeType)n3.firstChild().toText().data().toInt() ); + else if ( n3.tagName() == "horstretch" ) + w->sizePolicy.setHorStretch( n3.firstChild().toText().data().toInt() ); + else if ( n3.tagName() == "verstretch" ) + w->sizePolicy.setVerStretch( n3.firstChild().toText().data().toInt() ); + n3 = n3.nextSibling().toElement(); + } + } else if ( n2.tagName() == "pixmap" ) { + TQPixmap pix; + if ( r ) { + pix = r->loadPixmap( n2 ); + } else { + TQDomElement n3 = n2.firstChild().toElement(); + TQImage img; + while ( !n3.isNull() ) { + if ( n3.tagName() == "data" ) { + img = loadImageData( n3 ); + } + n3 = n3.nextSibling().toElement(); + } + pix.convertFromImage( img ); + } + w->pixmap = new TQPixmap( pix ); + } else if ( n2.tagName() == "signal" ) { + w->lstSignals.append( n2.firstChild().toText().data().latin1() ); + } else if ( n2.tagName() == "container" ) { + w->isContainer = (bool)n2.firstChild().toText().data().toInt(); + } else if ( n2.tagName() == "slot" ) { + MetaDataBase::Function function; + function.function = n2.firstChild().toText().data().latin1(); + function.access = n2.attribute( "access" ); + function.type = "slot"; + w->lstSlots.append( function ); + } else if ( n2.tagName() == "property" ) { + MetaDataBase::Property property; + property.property = n2.firstChild().toText().data().latin1(); + property.type = n2.attribute( "type" ); + w->lstProperties.append( property ); + } + n2 = n2.nextSibling().toElement(); + } + MetaDataBase::addCustomWidget( w ); + } + n = n.nextSibling().toElement(); + } +} + +void Resource::saveTabOrder( TQTextStream &ts, int indent ) +{ + TQWidgetList l = MetaDataBase::tabOrder( toplevel ); + if ( l.isEmpty() ) + return; + + ts << makeIndent( indent ) << "<tabstops>" << endl; + indent++; + + for ( TQWidget *w = l.first(); w; w = l.next() ) { + if ( w->testWState( TQt::WState_ForceHide ) || knownNames.findIndex( w->name() ) == -1 ) + continue; + ts << makeIndent( indent ) << "<tabstop>" << w->name() << "</tabstop>" << endl; + } + + indent--; + ts << makeIndent( indent ) << "</tabstops>" << endl; +} + +void Resource::loadTabOrder( const TQDomElement &e ) +{ + TQWidget *last = 0; + TQDomElement n = e.firstChild().toElement(); + TQWidgetList widgets; + while ( !n.isNull() ) { + if ( n.tagName() == "tabstop" ) { + TQString name = n.firstChild().toText().data(); + if ( name.isEmpty() ) + continue; + TQObjectList *l = toplevel->queryList( 0, name, FALSE ); + if ( l ) { + if ( l->first() ) { + TQWidget *w = (TQWidget*)l->first(); + widgets.append( w ); + if ( last ) + toplevel->setTabOrder( last, w ); + last = w; + } + delete l; + } + } + n = n.nextSibling().toElement(); + } + + if ( !widgets.isEmpty() ) + MetaDataBase::setTabOrder( toplevel, widgets ); +} + +void Resource::saveMetaInfoBefore( TQTextStream &ts, int indent ) +{ + MetaDataBase::MetaInfo info = MetaDataBase::metaInfo( TQT_TQOBJECT(formwindow) ); + TQString cn; + if ( info.classNameChanged && !info.className.isEmpty() ) + cn = info.className; + else + cn = formwindow->name(); + ts << makeIndent( indent ) << "<class>" << entitize( cn ) << "</class>" << endl; + if ( !info.comment.isEmpty() ) + ts << makeIndent( indent ) << "<comment>" << entitize( info.comment ) << "</comment>" << endl; + if ( !info.author.isEmpty() ) + ts << makeIndent( indent ) << "<author>" << entitize( info.author ) << "</author>" << endl; +} + +void Resource::saveMetaInfoAfter( TQTextStream &ts, int indent ) +{ + MetaDataBase::MetaInfo info = MetaDataBase::metaInfo( TQT_TQOBJECT(formwindow) ); + if ( !langIface || formwindow->project()->isCpp() ) { + TQValueList<MetaDataBase::Include> includes = MetaDataBase::includes( TQT_TQOBJECT(formwindow) ); + TQString extensionInclude; + bool needExtensionInclude = FALSE; + if ( langIface && + formwindow->formFile()->hasFormCode() && + formwindow->formFile()->codeFileState() != FormFile::Deleted ) { + extensionInclude = TQFileInfo( currFileName ).fileName() + langIface->formCodeExtension(); + needExtensionInclude = TRUE; + } + if ( !includes.isEmpty() || needExtensionInclude ) { + ts << makeIndent( indent ) << "<includes>" << endl; + indent++; + + for ( TQValueList<MetaDataBase::Include>::Iterator it = includes.begin(); it != includes.end(); ++it ) { + ts << makeIndent( indent ) << "<include location=\"" << (*it).location + << "\" impldecl=\"" << (*it).implDecl << "\">" << (*it).header << "</include>" << endl; + if ( needExtensionInclude ) + needExtensionInclude = (*it).header != extensionInclude; + } + + if ( needExtensionInclude ) + ts << makeIndent( indent ) << "<include location=\"local\" impldecl=\"in implementation\">" + << extensionInclude << "</include>" << endl; + indent--; + ts << makeIndent( indent ) << "</includes>" << endl; + } + + TQStringList forwards = MetaDataBase::forwards( TQT_TQOBJECT(formwindow) ); + if ( !forwards.isEmpty() ) { + ts << makeIndent( indent ) << "<forwards>" << endl; + indent++; + for ( TQStringList::Iterator it2 = forwards.begin(); it2 != forwards.end(); ++it2 ) + ts << makeIndent( indent ) << "<forward>" << entitize( *it2 ) << "</forward>" << endl; + indent--; + ts << makeIndent( indent ) << "</forwards>" << endl; + } + TQValueList<MetaDataBase::Variable> varLst = MetaDataBase::variables( TQT_TQOBJECT(formwindow) ); + if ( !varLst.isEmpty() ) { + ts << makeIndent( indent ) << "<variables>" << endl; + indent++; + + TQValueList<MetaDataBase::Variable>::Iterator it = varLst.begin(); + for ( ; it != varLst.end(); ++it ) { + ts << makeIndent( indent ) << "<variable"; + if ( (*it).varAccess != "protected" ) + ts << " access=\"" << (*it).varAccess << "\""; + + ts << ">" << entitize( (*it).varName ) << "</variable>" << endl; + } + indent--; + ts << makeIndent( indent ) << "</variables>" << endl; + } + TQStringList sigs = MetaDataBase::signalList( TQT_TQOBJECT(formwindow) ); + if ( !sigs.isEmpty() ) { + ts << makeIndent( indent ) << "<signals>" << endl; + indent++; + for ( TQStringList::Iterator it3 = sigs.begin(); it3 != sigs.end(); ++it3 ) + ts << makeIndent( indent ) << "<signal>" << entitize( *it3 ) << "</signal>" << endl; + indent--; + ts << makeIndent( indent ) << "</signals>" << endl; + } + + TQValueList<MetaDataBase::Function> slotList = MetaDataBase::slotList( TQT_TQOBJECT(formwindow) ); + if ( !slotList.isEmpty() ) { + ts << makeIndent( indent ) << "<slots>" << endl; + indent++; + TQString lang = formwindow->project()->language(); + TQValueList<MetaDataBase::Function>::Iterator it = slotList.begin(); + for ( ; it != slotList.end(); ++it ) { + MetaDataBase::Function function = *it; + ts << makeIndent( indent ) << "<slot"; + if ( function.access != "public" ) + ts << " access=\"" << function.access << "\""; + if ( function.specifier != "virtual" ) + ts << " specifier=\"" << function.specifier << "\""; + if ( function.language != "C++" ) + ts << " language=\"" << function.language<< "\""; + if ( function.returnType != "void" ) + ts << " returnType=\"" << entitize( function.returnType ) << "\""; + ts << ">" << entitize( function.function ) << "</slot>" << endl; + } + indent--; + ts << makeIndent( indent ) << "</slots>" << endl; + } + + TQValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( TQT_TQOBJECT(formwindow), TRUE ); + if ( !functionList.isEmpty() ) { + ts << makeIndent( indent ) << "<functions>" << endl; + indent++; + TQString lang = formwindow->project()->language(); + TQValueList<MetaDataBase::Function>::Iterator it = functionList.begin(); + for ( ; it != functionList.end(); ++it ) { + MetaDataBase::Function function = *it; + ts << makeIndent( indent ) << "<function"; + if ( function.access != "public" ) + ts << " access=\"" << function.access << "\""; + if ( function.specifier != "virtual" ) + ts << " specifier=\"" << function.specifier << "\""; + if ( function.language != "C++" ) + ts << " language=\"" << function.language<< "\""; + if ( function.returnType != "void" ) + ts << " returnType=\"" << entitize( function.returnType ) << "\""; + ts << ">" << entitize( function.function ) << "</function>" << endl; + } + indent--; + ts << makeIndent( indent ) << "</functions>" << endl; + } + } + + if ( formwindow && formwindow->savePixmapInline() ) + ; + else if ( formwindow && formwindow->savePixmapInProject() ) + ts << makeIndent( indent ) << "<pixmapinproject/>" << endl; + else + ts << makeIndent( indent ) << "<pixmapfunction>" << formwindow->pixmapLoaderFunction() << "</pixmapfunction>" << endl; + if ( !( exportMacro = MetaDataBase::exportMacro( TQT_TQOBJECT(formwindow->mainContainer()) ) ).isEmpty() ) + ts << makeIndent( indent ) << "<exportmacro>" << exportMacro << "</exportmacro>" << endl; + if ( formwindow ) { + ts << makeIndent( indent ) << "<layoutdefaults spacing=\"" << formwindow->layoutDefaultSpacing() + << "\" margin=\"" << formwindow->layoutDefaultMargin() << "\"/>" << endl; + if ( formwindow->hasLayoutFunctions() ) { + TQString s = ""; + TQString m = ""; + if ( !formwindow->spacingFunction().isEmpty() ) + s = TQString( " spacing=\"%1\"" ).arg( formwindow->spacingFunction() ); + if ( !formwindow->marginFunction().isEmpty() ) + m = TQString( " margin=\"%1\"" ).arg( formwindow->marginFunction() ); + ts << makeIndent( indent ) << "<layoutfunctions" << s << m << "/>" << endl; + } + } +} + +void Resource::saveIncludeHints( TQTextStream &ts, int indent ) +{ + if ( includeHints.isEmpty() ) + return; + ts << makeIndent( indent ) << "<includehints>" << endl; + indent++; + for ( TQStringList::Iterator it = includeHints.begin(); it != includeHints.end(); ++it ) + ts << makeIndent( indent ) << "<includehint>" << *it << "</includehint>" << endl; + indent--; + ts << makeIndent( indent ) << "</includehints>" << endl; +} + +TQColorGroup Resource::loadColorGroup( const TQDomElement &e ) +{ + TQColorGroup cg; + int r = -1; + TQDomElement n = e.firstChild().toElement(); + TQColor col; + while ( !n.isNull() ) { + if ( n.tagName() == "color" ) { + r++; + cg.setColor( (TQColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) ); + } else if ( n.tagName() == "pixmap" ) { + TQPixmap pix = loadPixmap( n ); + cg.setBrush( (TQColorGroup::ColorRole)r, TQBrush( col, pix ) ); + } + n = n.nextSibling().toElement(); + } + return cg; +} + +void Resource::saveChildActions( TQAction *a, TQTextStream &ts, int indent ) +{ + TQObjectList clo = a->childrenListObject(); + if ( clo.isEmpty() ) + return; + TQObjectListIt it( clo ); + while ( it.current() ) { + TQObject *o = it.current(); + ++it; + if ( !::tqqt_cast<TQAction*>(o) ) + continue; + TQAction *ac = (TQAction*)o; + bool isGroup = ::tqqt_cast<TQActionGroup*>(ac); + if ( isGroup ) + ts << makeIndent( indent ) << "<actiongroup>" << endl; + else + ts << makeIndent( indent ) << "<action>" << endl; + indent++; + saveObjectProperties( ac, ts, indent ); + indent--; + if ( isGroup ) { + indent++; + saveChildActions( ac, ts, indent ); + indent--; + } + if ( isGroup ) + ts << makeIndent( indent ) << "</actiongroup>" << endl; + else + ts << makeIndent( indent ) << "</action>" << endl; + } +} + +void Resource::saveActions( const TQPtrList<TQAction> &actions, TQTextStream &ts, int indent ) +{ + if ( actions.isEmpty() ) + return; + ts << makeIndent( indent ) << "<actions>" << endl; + indent++; + TQPtrListIterator<TQAction> it( actions ); + while ( it.current() ) { + TQAction *a = it.current(); + bool isGroup = ::tqqt_cast<TQActionGroup*>(a); + if ( isGroup ) + ts << makeIndent( indent ) << "<actiongroup>" << endl; + else + ts << makeIndent( indent ) << "<action>" << endl; + indent++; + saveObjectProperties( a, ts, indent ); + indent--; + if ( isGroup ) { + indent++; + saveChildActions( a, ts, indent ); + indent--; + } + if ( isGroup ) + ts << makeIndent( indent ) << "</actiongroup>" << endl; + else + ts << makeIndent( indent ) << "</action>" << endl; + ++it; + } + indent--; + ts << makeIndent( indent ) << "</actions>" << endl; +} + +void Resource::loadChildAction( TQObject *parent, const TQDomElement &e ) +{ + TQDomElement n = e; + TQAction *a = 0; + if ( n.tagName() == "action" ) { + a = new QDesignerAction( parent ); + MetaDataBase::addEntry( a ); + TQDomElement n2 = n.firstChild().toElement(); + bool hasMenuText = FALSE; + while ( !n2.isNull() ) { + if ( n2.tagName() == "property" ) { + TQDomElement n3(n2); // don't modify n2 + TQString prop = n3.attribute( "name" ); + if (prop == "menuText") + hasMenuText = TRUE; + TQDomElement value(n3.firstChild().toElement()); + setObjectProperty( a, prop, value ); + if (!hasMenuText && uiFileVersion < "3.3" && prop == "text") + setObjectProperty( a, "menuText", value ); + } + n2 = n2.nextSibling().toElement(); + } + if ( !::tqqt_cast<TQAction*>(parent) ) + formwindow->actionList().append( a ); + } else if ( n.tagName() == "actiongroup" ) { + a = new QDesignerActionGroup( parent ); + MetaDataBase::addEntry( a ); + TQDomElement n2 = n.firstChild().toElement(); + bool hasMenuText = FALSE; + while ( !n2.isNull() ) { + if ( n2.tagName() == "property" ) { + TQDomElement n3(n2); // don't modify n2 + TQString prop = n3.attribute( "name" ); + if (prop == "menuText") + hasMenuText = TRUE; + TQDomElement value = n3.firstChild().toElement(); + setObjectProperty( a, prop, value ); + if (!hasMenuText && uiFileVersion < "3.3" && prop == "text") + setObjectProperty( a, "menuText", value ); + } else if ( n2.tagName() == "action" || + n2.tagName() == "actiongroup" ) { + loadChildAction( a, n2 ); + } + n2 = n2.nextSibling().toElement(); + } + if ( !::tqqt_cast<TQAction*>(parent) ) + formwindow->actionList().append( a ); + } +} + +void Resource::loadActions( const TQDomElement &e ) +{ + TQDomElement n = e.firstChild().toElement(); + while ( !n.isNull() ) { + if ( n.tagName() == "action" ) { + loadChildAction( TQT_TQOBJECT(formwindow), n ); + } else if ( n.tagName() == "actiongroup" ) { + loadChildAction( TQT_TQOBJECT(formwindow), n ); + } + n = n.nextSibling().toElement(); + } +} + +void Resource::saveToolBars( TQMainWindow *mw, TQTextStream &ts, int indent ) +{ + ts << makeIndent( indent ) << "<toolbars>" << endl; + indent++; + + TQPtrList<TQToolBar> tbList; + for ( int i = 0; i <= (int)TQt::DockMinimized; ++i ) { + tbList = mw->toolBars( (TQt::Dock)i ); + if ( tbList.isEmpty() ) + continue; + for ( TQToolBar *tb = tbList.first(); tb; tb = tbList.next() ) { + if ( tb->isHidden() ) + continue; + ts << makeIndent( indent ) << "<toolbar dock=\"" << i << "\">" << endl; + indent++; + saveObjectProperties( TQT_TQOBJECT(tb), ts, indent ); + TQPtrList<TQAction> actionList = ( (QDesignerToolBar*)tb )->insertedActions(); + for ( TQAction *a = actionList.first(); a; a = actionList.next() ) { + if ( ::tqqt_cast<QSeparatorAction*>(a) ) { + ts << makeIndent( indent ) << "<separator/>" << endl; + } else { + if ( ::tqqt_cast<QDesignerAction*>(a) && !( (QDesignerAction*)a )->supportsMenu() ) { + TQWidget *w = ( (QDesignerAction*)a )->widget(); + ts << makeIndent( indent ) << "<widget class=\"" + << WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) << "\">" << endl; + indent++; + const char *className = WidgetFactory::classNameOf( TQT_TQOBJECT(w) ); + if ( w->isA( "CustomWidget" ) ) + usedCustomWidgets << TQString( className ); + if ( WidgetFactory::hasItems( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ), TQT_TQOBJECT(w) ) ) + saveItems( TQT_TQOBJECT(w), ts, indent ); + saveObjectProperties( TQT_TQOBJECT(w), ts, indent ); + indent--; + ts << makeIndent( indent ) << "</widget>" << endl; + } else { + ts << makeIndent( indent ) << "<action name=\"" << a->name() << "\"/>" << endl; + } + } + } + indent--; + ts << makeIndent( indent ) << "</toolbar>" << endl; + } + } + indent--; + ts << makeIndent( indent ) << "</toolbars>" << endl; +} + +void Resource::saveMenuBar( TQMainWindow *mw, TQTextStream &ts, int indent ) +{ + MenuBarEditor *mb = (MenuBarEditor *)mw->child( 0, "MenuBarEditor" ); + if ( !mb ) + return; + ts << makeIndent( indent ) << "<menubar>" << endl; + indent++; + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(mb), "name", TRUE ); // FIXME: remove + saveObjectProperties( TQT_TQOBJECT(mb), ts, indent ); + + for ( int i = 0; i < (int)mb->count(); ++i ) { + MenuBarEditorItem *m = mb->item( i ); + if ( !m ) + continue; + if ( m->isSeparator() ) { + ts << makeIndent( indent ) << "<separator/>" << endl; + } else { + ts << makeIndent( indent ) << "<item text=\"" << entitize( m->menuText() ) + << "\" name=\"" << entitize( m->menu()->name() ) << "\">" << endl; + indent++; + savePopupMenu( m->menu(), mw, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</item>" << endl; + } + } + indent--; + ts << makeIndent( indent ) << "</menubar>" << endl; +} + +void Resource::savePopupMenu( PopupMenuEditor *pm, TQMainWindow *mw, TQTextStream &ts, int indent ) +{ + for ( PopupMenuEditorItem *i = pm->items()->first(); i; i = pm->items()->next() ) { + TQAction *a = i->action(); + if ( ::tqqt_cast<QSeparatorAction*>(a) ) + ts << makeIndent( indent ) << "<separator/>" << endl; + else if ( ::tqqt_cast<QDesignerAction*>(a) ) + ts << makeIndent( indent ) << "<action name=\"" << a->name() << "\"/>" << endl; + else if ( ::tqqt_cast<QDesignerActionGroup*>(a) ) + ts << makeIndent( indent ) << "<actiongroup name=\"" << a->name() << "\"/>" << endl; + PopupMenuEditor *s = i->subMenu(); + if ( s && s->count() ) { + TQString n = s->name(); + ts << makeIndent( indent ) << "<item text=\"" << entitize( a->menuText() ) + << "\" name=\"" << entitize( n ) + << "\" accel=\"" << entitize( a->accel() ) + << "\">" << endl; + indent++; + savePopupMenu( s, mw, ts, indent ); + indent--; + ts << makeIndent( indent ) << "</item>" << endl; + } + } +} + +void Resource::loadToolBars( const TQDomElement &e ) +{ + TQDomElement n = e.firstChild().toElement(); + TQMainWindow *mw = ( (TQMainWindow*)formwindow->mainContainer() ); + QDesignerToolBar *tb = 0; + while ( !n.isNull() ) { + if ( n.tagName() == "toolbar" ) { + TQt::Dock dock = (TQt::Dock)n.attribute( "dock" ).toInt(); + tb = new QDesignerToolBar( mw, dock ); + TQDomElement n2 = n.firstChild().toElement(); + while ( !n2.isNull() ) { + if ( n2.tagName() == "action" ) { + TQAction *a = formwindow->findAction( n2.attribute( "name" ) ); + if ( a ) { + a->addTo( tb ); + tb->addAction( a ); + } + } else if ( n2.tagName() == "separator" ) { + TQAction *a = new QSeparatorAction( 0 ); + a->addTo( tb ); + tb->addAction( a ); + } else if ( n2.tagName() == "widget" ) { + TQWidget *w = (TQWidget*)createObject( n2, tb ); + QDesignerAction *a = new QDesignerAction( w, TQT_TQOBJECT(tb) ); + a->addTo( tb ); + tb->addAction( a ); + tb->installEventFilters( w ); + } else if ( n2.tagName() == "property" ) { + setObjectProperty( TQT_TQOBJECT(tb), n2.attribute( "name" ), n2.firstChild().toElement() ); + } + n2 = n2.nextSibling().toElement(); + } + } + n = n.nextSibling().toElement(); + } +} + +void Resource::loadMenuBar( const TQDomElement &e ) +{ + TQDomElement n = e.firstChild().toElement(); + TQMainWindow *mw = (TQMainWindow*)formwindow->mainContainer(); + MenuBarEditor *mb = new MenuBarEditor( formwindow, mw ); + MetaDataBase::addEntry( TQT_TQOBJECT(mb) ); + while ( !n.isNull() ) { + if ( n.tagName() == "item" ) { + PopupMenuEditor * popup = new PopupMenuEditor( formwindow, mw ); + loadPopupMenu( popup, n ); + popup->setName( n.attribute( "name" ) ); + mb->insertItem( n.attribute( "text" ), popup ); + MetaDataBase::addEntry( TQT_TQOBJECT(popup) ); + } else if ( n.tagName() == "property" ) { + setObjectProperty( TQT_TQOBJECT(mb), n.attribute( "name" ), n.firstChild().toElement() ); + } else if ( n.tagName() == "separator" ) { + mb->insertSeparator(); + } + n = n.nextSibling().toElement(); + } +} + +void Resource::loadPopupMenu( PopupMenuEditor *p, const TQDomElement &e ) +{ + MetaDataBase::addEntry( TQT_TQOBJECT(p) ); + TQDomElement n = e.firstChild().toElement(); + TQAction *a = 0; + while ( !n.isNull() ) { + if ( n.tagName() == "action" || n.tagName() == "actiongroup") { + a = formwindow->findAction( n.attribute( "name" ) ); + if ( a ) + p->insert( a ); + } + if ( n.tagName() == "item" ) { + PopupMenuEditorItem *i = p->at( p->find( a ) ); + if ( i ) { + TQString name = n.attribute( "name" ); + formwindow->unify( i, name, TRUE ); + i->setName( name ); + MetaDataBase::addEntry( i ); + loadPopupMenu( i->subMenu(), n ); + } + } else if ( n.tagName() == "separator" ) { + a = new QSeparatorAction( 0 ); + p->insert( a ); + } + n = n.nextSibling().toElement(); + } +} + +bool Resource::saveFormCode( FormFile *formfile, LanguageInterface * /*langIface*/ ) +{ + TQString lang = formfile->project()->language(); + if ( formfile->hasTempFileName() || + formfile->code().isEmpty() || + !formfile->hasFormCode() || + !formfile->isModified(FormFile::WFormCode) ) + return TRUE; // There is no code to be saved. + return saveCode( formfile->project()->makeAbsolute(formfile->codeFile()), + formfile->code() ); +} + +void Resource::loadExtraSource( FormFile *formfile, const TQString &currFileName, + LanguageInterface *langIface, bool hasFunctions ) +{ + TQString lang = "TQt Script"; + if ( MainWindow::self ) + lang = MainWindow::self->currProject()->language(); + LanguageInterface *iface = langIface; + if ( hasFunctions || !iface ) + return; + TQValueList<LanguageInterface::Function> functions; + TQStringList forwards; + TQStringList includesImpl; + TQStringList includesDecl; + TQStringList vars; + TQValueList<LanguageInterface::Connection> connections; + + iface->loadFormCode( formfile->formName(), + currFileName + iface->formCodeExtension(), + functions, + vars, + connections ); + + TQFile f( formfile->project()->makeAbsolute( formfile->codeFile() ) ); + TQString code; + if ( f.open( IO_ReadOnly ) ) { + TQTextStream ts( &f ); + code = ts.read(); + } + formfile->setCode( code ); + + if ( !MainWindow::self || !MainWindow::self->currProject()->isCpp() ) + MetaDataBase::setupConnections( formfile, connections ); + + for ( TQValueList<LanguageInterface::Function>::Iterator fit = functions.begin(); + fit != functions.end(); ++fit ) { + + if ( MetaDataBase::hasFunction( formfile->formWindow() ? + (TQObject*)formfile->formWindow() : + (TQObject*)formfile, + (*fit).name.latin1() ) ) { + TQString access = (*fit).access; + if ( !MainWindow::self || !MainWindow::self->currProject()->isCpp() ) + MetaDataBase::changeFunction( formfile->formWindow() ? + (TQObject*)formfile->formWindow() : + (TQObject*)formfile, + (*fit).name, + (*fit).name, + TQString() ); + } else { + TQString access = (*fit).access; + if ( access.isEmpty() ) + access = "protected"; + TQString type = "function"; + if ( (*fit).returnType == "void" ) + type = "slot"; + MetaDataBase::addFunction( formfile->formWindow() ? + (TQObject*)formfile->formWindow() : + (TQObject*)formfile, + (*fit).name.latin1(), "virtual", (*fit).access, + type, lang, (*fit).returnType ); + } + } +} diff --git a/kdevdesigner/designer/resource.h b/kdevdesigner/designer/resource.h new file mode 100644 index 00000000..06598254 --- /dev/null +++ b/kdevdesigner/designer/resource.h @@ -0,0 +1,165 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef RESOURCE_H +#define RESOURCE_H + +#include <tqstring.h> +#include <tqtextstream.h> +#include <tqvariant.h> +#include <tqvaluelist.h> +#include <tqimage.h> +#include "actiondnd.h" + +#include "metadatabase.h" + +class TQWidget; +class TQObject; +class TQLayout; +class TQStyle; +class TQPalette; +class FormWindow; +class MainWindow; +class TQDomElement; +class QDesignerGridLayout; +class TQListViewItem; +class TQMainWindow; +struct LanguageInterface; +class FormFile; +class Project; +class PopupMenuEditor; + +class Resource +{ +public: + struct Image { + TQImage img; + TQString name; + bool operator==( const Image &i ) const { + return ( i.name == name && + i.img == img ); + } + }; + + Resource(); + Resource( MainWindow* mw ); + ~Resource(); + + void setWidget( FormWindow *w ); + TQWidget *widget() const; + + bool load( FormFile *ff, Project *defProject = 0 ); + bool load( FormFile *ff, TQIODevice*, Project *defProject = 0 ); + TQString copy(); + + bool save( const TQString& filename, bool formCodeOnly = FALSE); + bool save( TQIODevice* ); + void paste( const TQString &cb, TQWidget *parent ); + + static void saveImageData( const TQImage &img, TQTextStream &ts, int indent ); + static void loadCustomWidgets( const TQDomElement &e, Resource *r ); + static void loadExtraSource( FormFile *formfile, const TQString &currFileName, + LanguageInterface *langIface, bool hasFunctions ); + static bool saveFormCode( FormFile *formfile, LanguageInterface *langIface ); + +private: + void saveObject( TQObject *obj, QDesignerGridLayout* grid, TQTextStream &ts, int indent ); + void saveChildrenOf( TQObject* obj, TQTextStream &ts, int indent ); + void saveObjectProperties( TQObject *w, TQTextStream &ts, int indent ); + void saveSetProperty( TQObject *w, const TQString &name, TQVariant::Type t, TQTextStream &ts, int indent ); + void saveEnumProperty( TQObject *w, const TQString &name, TQVariant::Type t, TQTextStream &ts, int indent ); + void saveProperty( TQObject *w, const TQString &name, const TQVariant &value, TQVariant::Type t, TQTextStream &ts, int indent ); + void saveProperty( const TQVariant &value, TQTextStream &ts, int indent ); + void saveItems( TQObject *obj, TQTextStream &ts, int indent ); + void saveItem( const TQStringList &text, const TQPtrList<TQPixmap> &pixmaps, TQTextStream &ts, int indent ); + void saveItem( TQListViewItem *i, TQTextStream &ts, int indent ); + void saveConnections( TQTextStream &ts, int indent ); + void saveCustomWidgets( TQTextStream &ts, int indent ); + void saveTabOrder( TQTextStream &ts, int indent ); + void saveColorGroup( TQTextStream &ts, int indent, const TQColorGroup &cg ); + void saveColor( TQTextStream &ts, int indent, const TQColor &c ); + void saveMetaInfoBefore( TQTextStream &ts, int indent ); + void saveMetaInfoAfter( TQTextStream &ts, int indent ); + void saveIncludeHints( TQTextStream &ts, int indent ); + void savePixmap( const TQPixmap &p, TQTextStream &ts, int indent, const TQString &tagname = "pixmap" ); + void saveActions( const TQPtrList<TQAction> &actions, TQTextStream &ts, int indent ); + void saveChildActions( TQAction *a, TQTextStream &ts, int indent ); + void saveToolBars( TQMainWindow *mw, TQTextStream &ts, int indent ); + void saveMenuBar( TQMainWindow *mw, TQTextStream &ts, int indent ); + void savePopupMenu( PopupMenuEditor *pm, TQMainWindow *mw, TQTextStream &ts, int indent ); + + TQObject *createObject( const TQDomElement &e, TQWidget *parent, TQLayout* layout = 0 ); + TQWidget *createSpacer( const TQDomElement &e, TQWidget *parent, TQLayout *layout, Qt::Orientation o ); + void createItem( const TQDomElement &e, TQWidget *widget, TQListViewItem *i = 0 ); + void createColumn( const TQDomElement &e, TQWidget *widget ); + void setObjectProperty( TQObject* widget, const TQString &prop, const TQDomElement &e); + TQString saveInCollection( const TQImage &img ); + TQString saveInCollection( const TQPixmap &pix ) { return saveInCollection( pix.convertToImage() ); } + TQImage loadFromCollection( const TQString &name ); + void saveImageCollection( TQTextStream &ts, int indent ); + void loadImageCollection( const TQDomElement &e ); + void loadConnections( const TQDomElement &e ); + void loadTabOrder( const TQDomElement &e ); + void loadItem( const TQDomElement &n, TQPixmap &pix, TQString &txt, bool &hasPixmap ); + void loadActions( const TQDomElement &n ); + void loadChildAction( TQObject *parent, const TQDomElement &e ); + void loadToolBars( const TQDomElement &n ); + void loadMenuBar( const TQDomElement &n ); + void loadPopupMenu( PopupMenuEditor *pm, const TQDomElement &e ); + TQColorGroup loadColorGroup( const TQDomElement &e ); + TQPixmap loadPixmap( const TQDomElement &e, const TQString &tagname = "pixmap" ); + +private: + MainWindow *mainwindow; + FormWindow *formwindow; + TQWidget* toplevel; + TQValueList<Image> images; + bool copying, pasting; + bool mainContainerSet; + TQStringList knownNames; + TQStringList usedCustomWidgets; + TQListViewItem *lastItem; + + TQValueList<MetaDataBase::Include> metaIncludes; + TQValueList<MetaDataBase::Variable> metaVariables; + TQStringList metaForwards; + TQStringList metaSignals; + MetaDataBase::MetaInfo metaInfo; + TQMap<TQString, TQString> dbControls; + TQMap<TQString, TQStringList> dbTables; + TQMap<TQString, TQWidget*> widgets; + TQString exportMacro; + bool hadGeometry; + TQMap<TQString, TQValueList<MetaDataBase::Connection> > langConnections; + TQString currFileName; + LanguageInterface *langIface; + bool hasFunctions; + TQStringList includeHints; + + TQString uiFileVersion; +}; + +#endif diff --git a/kdevdesigner/designer/richtextfontdialog.ui b/kdevdesigner/designer/richtextfontdialog.ui new file mode 100644 index 00000000..d7d6c5a7 --- /dev/null +++ b/kdevdesigner/designer/richtextfontdialog.ui @@ -0,0 +1,347 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>RichTextFontDialog</class> +<comment>********************************************************************* +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>RichTextFontDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>255</width> + <height>158</height> + </rect> + </property> + <property name="caption"> + <string>Font Properties</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQComboBox" row="0" column="1" rowspan="1" colspan="2"> + <item> + <property name="text"> + <string>default</string> + </property> + </item> + <property name="name"> + <cstring>fontCombo</cstring> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>&Font:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>fontCombo</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Rel. &size:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>fontSizeCombo</cstring> + </property> + </widget> + <spacer row="2" column="2"> + <property name="name"> + <cstring>Spacer13</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>C&olor:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>colorButton</cstring> + </property> + </widget> + <widget class="TQComboBox" row="1" column="1" rowspan="1" colspan="2"> + <item> + <property name="text"> + <string>0</string> + </property> + </item> + <item> + <property name="text"> + <string>-4</string> + </property> + </item> + <item> + <property name="text"> + <string>-3</string> + </property> + </item> + <item> + <property name="text"> + <string>-2</string> + </property> + </item> + <item> + <property name="text"> + <string>-1</string> + </property> + </item> + <item> + <property name="text"> + <string>+1</string> + </property> + </item> + <item> + <property name="text"> + <string>+2</string> + </property> + </item> + <item> + <property name="text"> + <string>+3</string> + </property> + </item> + <item> + <property name="text"> + <string>+4</string> + </property> + </item> + <property name="name"> + <cstring>fontSizeCombo</cstring> + </property> + <property name="editable"> + <bool>true</bool> + </property> + <property name="insertionPolicy"> + <enum>AtTop</enum> + </property> + </widget> + <widget class="TQToolButton" row="2" column="1"> + <property name="name"> + <cstring>colorButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="text"> + <string></string> + </property> + </widget> + </grid> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>Spacer14</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="Line" row="2" column="0"> + <property name="name"> + <cstring>Line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="TQLayoutWidget" row="3" column="0"> + <property name="name"> + <cstring>Layout15</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer> + <property name="name"> + <cstring>Spacer12</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>okButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>cancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + </hbox> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>colorButton</sender> + <signal>clicked()</signal> + <receiver>RichTextFontDialog</receiver> + <slot>selectColor()</slot> + </connection> + <connection> + <sender>okButton</sender> + <signal>clicked()</signal> + <receiver>RichTextFontDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>cancelButton</sender> + <signal>clicked()</signal> + <receiver>RichTextFontDialog</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>fontCombo</tabstop> + <tabstop>fontSizeCombo</tabstop> + <tabstop>colorButton</tabstop> + <tabstop>okButton</tabstop> + <tabstop>cancelButton</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">richtextfontdialog.ui.h</include> +</includes> +<variables> + <variable>QString font</variable> + <variable>QColor color</variable> + <variable>QString size</variable> +</variables> +<Q_SLOTS> + <slot>init()</slot> + <slot>selectColor()</slot> + <slot>accept()</slot> + <slot>reject()</slot> + <slot returnType="TQString">getSize()</slot> + <slot returnType="TQString">getColor()</slot> + <slot returnType="TQString">getFont()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/richtextfontdialog.ui.h b/kdevdesigner/designer/richtextfontdialog.ui.h new file mode 100644 index 00000000..27a11a21 --- /dev/null +++ b/kdevdesigner/designer/richtextfontdialog.ui.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename slots use TQt Designer which will +** update this file, preserving your code. Create an init() slot in place of +** a constructor, and a destroy() slot in place of a destructor. +*****************************************************************************/ +#include <tqcolordialog.h> +#include <tqfontdatabase.h> + +void RichTextFontDialog::init() +{ + TQFontDatabase *db = new TQFontDatabase(); + fontCombo->insertStringList( db->families() ); +} + +void RichTextFontDialog::selectColor() +{ + color = TQColorDialog::getColor( "", this ); + if( color.isValid() ) + colorButton->setPaletteBackgroundColor( color ); +} + +void RichTextFontDialog::accept() +{ + size = fontSizeCombo->currentText(); + font = fontCombo->currentText(); + done( Accepted ); +} + +void RichTextFontDialog::reject() +{ + done( Rejected ); +} + +TQString RichTextFontDialog::getSize() +{ + return size; +} + +TQString RichTextFontDialog::getColor() +{ + return color.name(); +} + +TQString RichTextFontDialog::getFont() +{ + return font; +} diff --git a/kdevdesigner/designer/sizehandle.cpp b/kdevdesigner/designer/sizehandle.cpp new file mode 100644 index 00000000..d60f223b --- /dev/null +++ b/kdevdesigner/designer/sizehandle.cpp @@ -0,0 +1,388 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler needs this here + +#include "sizehandle.h" +#include "formwindow.h" +#include "widgetfactory.h" + +#include <tqwidget.h> +#include <tqapplication.h> +#include <tqlabel.h> +#include <tdelocale.h> + +SizeHandle::SizeHandle( FormWindow *parent, Direction d, WidgetSelection *s ) + : TQWidget( parent ) +{ + active = TRUE; + setBackgroundMode( active ? PaletteText : PaletteDark ); + setFixedSize( 6, 6 ); + widget = 0; + dir =d ; + setMouseTracking( FALSE ); + formWindow = parent; + sel = s; + updateCursor(); +} + +void SizeHandle::updateCursor() +{ + if ( !active ) { + setCursor( arrowCursor ); + return; + } + + switch ( dir ) { + case LeftTop: + setCursor( sizeFDiagCursor ); + break; + case Top: + setCursor( sizeVerCursor ); + break; + case RightTop: + setCursor( sizeBDiagCursor ); + break; + case Right: + setCursor( sizeHorCursor ); + break; + case RightBottom: + setCursor( sizeFDiagCursor ); + break; + case Bottom: + setCursor( sizeVerCursor ); + break; + case LeftBottom: + setCursor( sizeBDiagCursor ); + break; + case Left: + setCursor( sizeHorCursor ); + break; + } +} + +void SizeHandle::setActive( bool a ) +{ + active = a; + setBackgroundMode( active ? PaletteText : PaletteDark ); + updateCursor(); +} + +void SizeHandle::setWidget( TQWidget *w ) +{ + widget = w; +} + +void SizeHandle::paintEvent( TQPaintEvent * ) +{ + if ( ( (FormWindow*)parentWidget() )->currentWidget() != widget ) + return; + TQPainter p( this ); + p.setPen( blue ); + p.drawRect( 0, 0, width(), height() ); +} + +void SizeHandle::mousePressEvent( TQMouseEvent *e ) +{ + if ( !widget || e->button() != Qt::LeftButton || !active ) + return; + oldPressPos = e->pos(); + geom = origGeom = TQRect( widget->pos(), widget->size() ); +} + +void SizeHandle::mouseMoveEvent( TQMouseEvent *e ) +{ + if ( !widget || ( e->state() & Qt::LeftButton ) != Qt::LeftButton || !active ) + return; + TQPoint rp = mapFromGlobal( e->globalPos() ); + TQPoint d = oldPressPos - rp; + oldPressPos = rp; + TQPoint checkPos = widget->parentWidget()->mapFromGlobal( e->globalPos() ); + TQRect pr = widget->parentWidget()->rect(); + + // ##### move code around a bit to reduce duplicated code here + switch ( dir ) { + case LeftTop: { + if ( checkPos.x() > pr.width() - 2 * width() || checkPos.y() > pr.height() - 2 * height() ) + return; + int w = geom.width() + d.x(); + geom.setWidth( w ); + w = ( w / formWindow->grid().x() ) * formWindow->grid().x(); + int h = geom.height() + d.y(); + geom.setHeight( h ); + h = ( h / formWindow->grid().y() ) * formWindow->grid().y(); + int dx = widget->width() - w; + int dy = widget->height() - h; + trySetGeometry( widget, widget->x() + dx, widget->y() + dy, w, h ); + } break; + case Top: { + if ( checkPos.y() > pr.height() - 2 * height() ) + return; + int h = geom.height() + d.y(); + geom.setHeight( h ); + h = ( h / formWindow->grid().y() ) * formWindow->grid().y(); + int dy = widget->height() - h; + trySetGeometry( widget, widget->x(), widget->y() + dy, widget->width(), h ); + } break; + case RightTop: { + if ( checkPos.x() < 2 * width() || checkPos.y() > pr.height() - 2 * height() ) + return; + int h = geom.height() + d.y(); + geom.setHeight( h ); + h = ( h / formWindow->grid().y() ) * formWindow->grid().y(); + int dy = widget->height() - h; + int w = geom.width() - d.x(); + geom.setWidth( w ); + w = ( w / formWindow->grid().x() ) * formWindow->grid().x(); + trySetGeometry( widget, widget->x(), widget->y() + dy, w, h ); + } break; + case Right: { + if ( checkPos.x() < 2 * width() ) + return; + int w = geom.width() - d.x(); + geom.setWidth( w ); + w = ( w / formWindow->grid().x() ) * formWindow->grid().x(); + tryResize( widget, w, widget->height() ); + } break; + case RightBottom: { + if ( checkPos.x() < 2 * width() || checkPos.y() < 2 * height() ) + return; + int w = geom.width() - d.x(); + geom.setWidth( w ); + w = ( w / formWindow->grid().x() ) * formWindow->grid().x(); + int h = geom.height() - d.y(); + geom.setHeight( h ); + h = ( h / formWindow->grid().y() ) * formWindow->grid().y(); + tryResize( widget, w, h ); + } break; + case Bottom: { + if ( checkPos.y() < 2 * height() ) + return; + int h = geom.height() - d.y(); + geom.setHeight( h ); + h = ( h / formWindow->grid().y() ) * formWindow->grid().y(); + tryResize( widget, widget->width(), h ); + } break; + case LeftBottom: { + if ( checkPos.x() > pr.width() - 2 * width() || checkPos.y() < 2 * height() ) + return; + int w = geom.width() + d.x(); + geom.setWidth( w ); + w = ( w / formWindow->grid().x() ) * formWindow->grid().x(); + int dx = widget->width() - w; + int h = geom.height() - d.y(); + geom.setHeight( h ); + h = ( h / formWindow->grid().y() ) * formWindow->grid().y(); + trySetGeometry( widget, widget->x() + dx, widget->y(), w, h ); + } break; + case Left: { + if ( checkPos.x() > pr.width() - 2 * width() ) + return; + int w = geom.width() + d.x(); + geom.setWidth( w ); + w = ( w / formWindow->grid().x() ) * formWindow->grid().x(); + int dx = widget->width() - w; + trySetGeometry( widget, widget->x() + dx, widget->y(), w, widget->height() ); + } break; + } + + TQPoint p = pos(); + sel->updateGeometry(); + oldPressPos += ( p - pos() ); + + formWindow->sizePreview()->setText( i18n( "%1/%2" ).arg( widget->width() ).arg( widget->height() ) ); + formWindow->sizePreview()->adjustSize(); + TQRect lg( formWindow->mapFromGlobal( e->globalPos() ) + TQPoint( 16, 16 ), + formWindow->sizePreview()->size() ); + formWindow->checkPreviewGeometry( lg ); + formWindow->sizePreview()->setGeometry( lg ); + formWindow->sizePreview()->show(); + formWindow->sizePreview()->raise(); + if ( WidgetFactory::layoutType( widget ) != WidgetFactory::NoLayout ) + formWindow->updateChildSelections( widget ); +} + +void SizeHandle::mouseReleaseEvent( TQMouseEvent *e ) +{ + if ( e->button() != Qt::LeftButton || !active ) + return; + + formWindow->sizePreview()->hide(); + if ( geom != widget->geometry() ) + formWindow->commandHistory()->addCommand( new ResizeCommand( i18n( "Resize" ), + formWindow, + widget, origGeom, + widget->geometry() ) ); + formWindow->emitUpdateProperties( TQT_TQOBJECT(widget) ); +} + +void SizeHandle::trySetGeometry( TQWidget *w, int x, int y, int width, int height ) +{ + int minw = TQMAX( w->minimumSizeHint().width(), w->minimumSize().width() ); + minw = TQMAX( minw, 2 * formWindow->grid().x() ); + int minh = TQMAX( w->minimumSizeHint().height(), w->minimumSize().height() ); + minh = TQMAX( minh, 2 * formWindow->grid().y() ); + if ( TQMAX( minw, width ) > w->maximumWidth() || + TQMAX( minh, height ) > w->maximumHeight() ) + return; + if ( width < minw && x != w->x() ) + x -= minw - width; + if ( height < minh && y != w->y() ) + y -= minh - height; + w->setGeometry( x, y, TQMAX( minw, width ), TQMAX( minh, height ) ); +} + +void SizeHandle::tryResize( TQWidget *w, int width, int height ) +{ + int minw = TQMAX( w->minimumSizeHint().width(), w->minimumSize().width() ); + minw = TQMAX( minw, 16 ); + int minh = TQMAX( w->minimumSizeHint().height(), w->minimumSize().height() ); + minh = TQMAX( minh, 16 ); + w->resize( TQMAX( minw, width ), TQMAX( minh, height ) ); +} + +// ------------------------------------------------------------------------ + +WidgetSelection::WidgetSelection( FormWindow *parent, TQPtrDict<WidgetSelection> *selDict ) + : selectionDict( selDict ) +{ + formWindow = parent; + for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) { + handles.insert( i, new SizeHandle( formWindow, (SizeHandle::Direction)i, this ) ); + } + hide(); +} + +void WidgetSelection::setWidget( TQWidget *w, bool updateDict ) +{ + if ( !w ) { + hide(); + if ( updateDict ) + selectionDict->remove( wid ); + wid = 0; + return; + } + + wid = w; + bool active = !wid->parentWidget() || WidgetFactory::layoutType( wid->parentWidget() ) == WidgetFactory::NoLayout; + for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) { + SizeHandle *h = handles[ i ]; + if ( h ) { + h->setWidget( wid ); + h->setActive( active ); + } + } + updateGeometry(); + show(); + if ( updateDict ) + selectionDict->insert( w, this ); +} + +bool WidgetSelection::isUsed() const +{ + return wid != 0; +} + +void WidgetSelection::updateGeometry() +{ + if ( !wid || !wid->parentWidget() ) + return; + + TQPoint p = wid->parentWidget()->mapToGlobal( wid->pos() ); + p = formWindow->mapFromGlobal( p ); + TQRect r( p, wid->size() ); + + int w = 6; + int h = 6; + + for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) { + SizeHandle *hndl = handles[ i ]; + if ( !hndl ) + continue; + switch ( i ) { + case SizeHandle::LeftTop: + hndl->move( r.x() - w / 2, r.y() - h / 2 ); + break; + case SizeHandle::Top: + hndl->move( r.x() + r.width() / 2 - w / 2, r.y() - h / 2 ); + break; + case SizeHandle::RightTop: + hndl->move( r.x() + r.width() - w / 2, r.y() - h / 2 ); + break; + case SizeHandle::Right: + hndl->move( r.x() + r.width() - w / 2, r.y() + r.height() / 2 - h / 2 ); + break; + case SizeHandle::RightBottom: + hndl->move( r.x() + r.width() - w / 2, r.y() + r.height() - h / 2 ); + break; + case SizeHandle::Bottom: + hndl->move( r.x() + r.width() / 2 - w / 2, r.y() + r.height() - h / 2 ); + break; + case SizeHandle::LeftBottom: + hndl->move( r.x() - w / 2, r.y() + r.height() - h / 2 ); + break; + case SizeHandle::Left: + hndl->move( r.x() - w / 2, r.y() + r.height() / 2 - h / 2 ); + break; + default: + break; + } + } +} + +void WidgetSelection::hide() +{ + for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) { + SizeHandle *h = handles[ i ]; + if ( h ) + h->hide(); + } +} + +void WidgetSelection::show() +{ + for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) { + SizeHandle *h = handles[ i ]; + if ( h ) { + h->show(); + h->raise(); + } + } +} + +void WidgetSelection::update() +{ + for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) { + SizeHandle *h = handles[ i ]; + if ( h ) + h->update(); + } +} + +TQWidget *WidgetSelection::widget() const +{ + return wid; +} diff --git a/kdevdesigner/designer/sizehandle.h b/kdevdesigner/designer/sizehandle.h new file mode 100644 index 00000000..44917884 --- /dev/null +++ b/kdevdesigner/designer/sizehandle.h @@ -0,0 +1,98 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef SIZEHANDLE_H +#define SIZEHANDLE_H + +#include <tqwidget.h> +#include <tqintdict.h> +#include <tqptrdict.h> + +class TQMouseEvent; +class FormWindow; +class WidgetSelection; +class TQPaintEvent; + +class SizeHandle : public TQWidget +{ + Q_OBJECT + + +public: + enum Direction { LeftTop, Top, RightTop, Right, RightBottom, Bottom, LeftBottom, Left }; + + SizeHandle( FormWindow *parent, Direction d, WidgetSelection *s ); + void setWidget( TQWidget *w ); + void setActive( bool a ); + void updateCursor(); + + void setEnabled( bool ) {} + +protected: + void paintEvent( TQPaintEvent *e ); + void mousePressEvent( TQMouseEvent *e ); + void mouseMoveEvent( TQMouseEvent *e ); + void mouseReleaseEvent( TQMouseEvent *e ); + +private: + void trySetGeometry( TQWidget *w, int x, int y, int width, int height ); + void tryResize( TQWidget *w, int width, int height ); + +private: + TQWidget *widget; + Direction dir; + TQPoint oldPressPos; + FormWindow *formWindow; + WidgetSelection *sel; + TQRect geom, origGeom; + bool active; + +}; + +class WidgetSelection +{ +public: + WidgetSelection( FormWindow *parent, TQPtrDict<WidgetSelection> *selDict ); + + void setWidget( TQWidget *w, bool updateDict = TRUE ); + bool isUsed() const; + + void updateGeometry(); + void hide(); + void show(); + void update(); + + TQWidget *widget() const; + +protected: + TQIntDict<SizeHandle> handles; + TQWidget *wid; + FormWindow *formWindow; + TQPtrDict<WidgetSelection> *selectionDict; + +}; + +#endif diff --git a/kdevdesigner/designer/sourceeditor.cpp b/kdevdesigner/designer/sourceeditor.cpp new file mode 100644 index 00000000..2850e20e --- /dev/null +++ b/kdevdesigner/designer/sourceeditor.cpp @@ -0,0 +1,320 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include <kiconloader.h> + +#include "sourceeditor.h" + +#include "formwindow.h" +#include "metadatabase.h" +#include "project.h" +#include "mainwindow.h" +#include "../interfaces/languageinterface.h" +#include <tqregexp.h> +#include "project.h" +#include "sourcefile.h" +#include "hierarchyview.h" +#include <tqmessagebox.h> +#include <tqtextstream.h> +#include "kdevdesigner_part.h" + +SourceEditor::SourceEditor( TQWidget *parent, EditorInterface *iface, LanguageInterface *liface ) + : TQVBox( parent, 0, WDestructiveClose ), iFace( iface ), lIface( liface ), obj( 0 ), pro( 0 ) +{ + iFace->addRef(); + lIface->addRef(); + editor = iFace->editor( MainWindow::self->areEditorsReadOnly(), + this, MainWindow::self->designerInterface() ); + iFace->onBreakPointChange( TQT_TQOBJECT(MainWindow::self), TQT_SLOT( breakPointsChanged() ) ); + resize( 600, 400 ); + setIcon( SmallIcon( "designer_filenew.png" , KDevDesignerPartFactory::instance()) ); +} + +SourceEditor::~SourceEditor() +{ + saveBreakPoints(); + editor = 0; + if ( formWindow() ) { + formWindow()->formFile()->setCodeEdited( FALSE ); + formWindow()->formFile()->setEditor( 0 ); + } else if ( sourceFile() ) { + sourceFile()->setEditor( 0 ); + if ( MainWindow::self->objectHierarchy()->sourceEditor() == this ) + MainWindow::self->objectHierarchy()->setFormWindow( 0, 0 ); + } + iFace->release(); + lIface->release(); + MainWindow::self->editorClosed( this ); +} + +void SourceEditor::setObject( TQObject *o, Project *p ) +{ + if ( sourceFile() ) + sourceFile()->setEditor( 0 ); + if ( formWindow() ) { + formWindow()->formFile()->setCodeEdited( FALSE ); + formWindow()->formFile()->setEditor( 0 ); + } + if ( ::tqqt_cast<FormWindow*>(o) ) + ( (FormWindow*)o )->formFile()->setCodeEdited( TRUE ); + save(); + bool changed = FALSE; + if ( &(*obj) != o ) { + saveBreakPoints(); + changed = TRUE; + } + obj = o; + pro = p; + if ( formWindow() ) { + if ( formWindow()->isFake() ) + setCaption( formWindow()->project()->objectForFakeForm( formWindow() )->name() ); + else + setCaption( obj->name() ); + } else { + setCaption( sourceFile()->fileName() ); + } + if ( sourceFile() ) + sourceFile()->setEditor( this ); + else if ( formWindow() ) + formWindow()->formFile()->setEditor( this ); + iFace->setText( sourceOfObject( obj, lang, iFace, lIface ) ); + if ( pro && formWindow() ) { + if ( formWindow()->isFake() ) + iFace->setContext( pro->objectForFakeFormFile( formWindow()->formFile() ) ); + else + iFace->setContext( TQT_TQOBJECT(formWindow()->mainContainer()) ); + } else { + iFace->setContext( 0 ); + } + if ( changed || sourceFile() ) + iFace->setBreakPoints( MetaDataBase::breakPoints( o ) ); + MainWindow::self->objectHierarchy()->showClasses( this ); +} + +TQString SourceEditor::sourceOfObject( TQObject *o, const TQString &, + EditorInterface *, LanguageInterface * ) +{ + TQString txt; + if ( !o ) + return txt; + if ( ::tqqt_cast<FormWindow*>(o) ) + txt = ( (FormWindow*)o )->formFile()->code(); + else if ( ::tqqt_cast<SourceFile*>(o) ) + txt = ( (SourceFile*)o )->text(); + return txt; +} + +void SourceEditor::setFunction( const TQString &func, const TQString &clss ) +{ + iFace->scrollTo( lIface->createFunctionStart( obj->name(), func, "", "" ), clss ); +} + +void SourceEditor::setClass( const TQString &clss ) +{ + iFace->scrollTo( clss, TQString() ); +} + +void SourceEditor::closeEvent( TQCloseEvent *e ) +{ + e->accept(); + if ( !obj ) + return; + if ( formWindow() ) { + save(); + formWindow()->formFile()->cm = formWindow()->formFile()->isModified(); + } else { + if ( !sourceFile()->closeEvent() ) + e->ignore(); + } +} + +void SourceEditor::save() +{ + if ( !obj ) + return; + if ( formWindow() ) + formWindow()->formFile()->syncCode(); + else if ( sourceFile() && sourceFile()->editor() ) + sourceFile()->setText( iFace->text() ); +} + +TQString SourceEditor::language() const +{ + return lang; +} + +void SourceEditor::setLanguage( const TQString &l ) +{ + lang = l; +} + +void SourceEditor::editCut() +{ + iFace->cut(); +} + +void SourceEditor::editCopy() +{ + iFace->copy(); +} + +void SourceEditor::editPaste() +{ + iFace->paste(); +} + +bool SourceEditor::editIsUndoAvailable() +{ + return iFace->isUndoAvailable(); +} + +bool SourceEditor::editIsRedoAvailable() +{ + return iFace->isRedoAvailable(); +} + +void SourceEditor::editUndo() +{ + iFace->undo(); +} + +void SourceEditor::editRedo() +{ + iFace->redo(); +} + +void SourceEditor::editSelectAll() +{ + iFace->selectAll(); +} + +void SourceEditor::configChanged() +{ + iFace->readSettings(); +} + +void SourceEditor::setModified( bool b ) +{ + iFace->setModified( b ); +} + +void SourceEditor::refresh( bool allowSave ) +{ + if ( allowSave ) + save(); + bool oldMod = iFace->isModified(); + iFace->setText( sourceOfObject( obj, lang, iFace, lIface ) ); + iFace->setModified( oldMod ); +} + +void SourceEditor::resetContext() +{ + if ( pro && formWindow() ) { + if ( formWindow()->isFake() ) + iFace->setContext( pro->objectForFakeFormFile( formWindow()->formFile() ) ); + else + iFace->setContext( TQT_TQOBJECT(formWindow()->mainContainer()) ); + } else { + iFace->setContext( 0 ); + } +} + +void SourceEditor::setFocus() +{ + if ( formWindow() ) + formWindow()->formFile()->setCodeEdited( TRUE ); + if ( editor ) + editor->setFocus(); +} + +int SourceEditor::numLines() const +{ + return iFace->numLines(); +} + +void SourceEditor::saveBreakPoints() +{ + if ( !obj ) + return; + TQValueList<uint> l; + iFace->breakPoints( l ); + MetaDataBase::setBreakPoints( obj, l ); +} + +void SourceEditor::clearStep() +{ + iFace->clearStep(); +} + +void SourceEditor::clearStackFrame() +{ + iFace->clearStackFrame(); +} + +void SourceEditor::resetBreakPoints() +{ + iFace->setBreakPoints( MetaDataBase::breakPoints( obj ) ); +} + +TQString SourceEditor::text() const +{ + return iFace->text(); +} + +bool SourceEditor::isModified() const +{ + return iFace->isModified(); +} + +void SourceEditor::checkTimeStamp() +{ + if ( formWindow() ) + formWindow()->formFile()->checkTimeStamp(); + else if ( sourceFile() ) + sourceFile()->checkTimeStamp(); +} + +bool SourceEditor::saveAs() +{ + if ( formWindow() ) + return formWindow()->formFile()->saveAs(); + else if ( sourceFile() ) + return sourceFile()->saveAs(); + return FALSE; +} + +SourceFile *SourceEditor::sourceFile() const +{ + if ( !::tqqt_cast<SourceFile*>((TQObject *)obj) ) + return 0; + return (SourceFile*)(TQObject*)obj; +} + +FormWindow *SourceEditor::formWindow() const +{ + if ( !::tqqt_cast<FormWindow*>((TQObject *)obj) ) + return 0; + return (FormWindow*)(TQObject*)obj; +} diff --git a/kdevdesigner/designer/sourceeditor.h b/kdevdesigner/designer/sourceeditor.h new file mode 100644 index 00000000..3dde636e --- /dev/null +++ b/kdevdesigner/designer/sourceeditor.h @@ -0,0 +1,107 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef SOURCEEDITOR_H +#define SOURCEEDITOR_H + +#include "../interfaces/editorinterface.h" +#include <tqvbox.h> +#include <tqguardedptr.h> + +class FormWindow; +class TQCloseEvent; +struct LanguageInterface; +class Project; +class SourceFile; + +class SourceEditor : public TQVBox +{ + Q_OBJECT + + +public: + SourceEditor( TQWidget *parent, EditorInterface *iface, LanguageInterface *liface ); + ~SourceEditor(); + + void setObject( TQObject *fw, Project *p ); + TQObject *object() const { return obj; } + Project *project() const { return pro; } + void setFunction( const TQString &func, const TQString &clss = TQString() ); + void setClass( const TQString &clss ); + void save(); + bool saveAs(); + void setModified( bool b ); + bool isModified() const; + + static TQString sourceOfObject( TQObject *fw, const TQString &lang, EditorInterface *iface, LanguageInterface *lIface ); + + TQString language() const; + void setLanguage( const TQString &l ); + + void editCut(); + void editCopy(); + void editPaste(); + bool editIsUndoAvailable(); + bool editIsRedoAvailable(); + void editUndo(); + void editRedo(); + void editSelectAll(); + + void configChanged(); + void refresh( bool allowSave ); + void resetContext(); + + EditorInterface *editorInterface() const { return iFace; } + + void setFocus(); + int numLines() const; + void saveBreakPoints(); + void clearStep(); + void clearStackFrame(); + void resetBreakPoints(); + + TQString text() const; + + void checkTimeStamp(); + + SourceFile *sourceFile() const; + FormWindow *formWindow() const; + +protected: + void closeEvent( TQCloseEvent *e ); + + +private: + EditorInterface *iFace; + LanguageInterface *lIface; + TQGuardedPtr<TQObject> obj; + Project *pro; + TQString lang; + TQGuardedPtr<TQWidget> editor; + +}; + +#endif diff --git a/kdevdesigner/designer/sourcefile.cpp b/kdevdesigner/designer/sourcefile.cpp new file mode 100644 index 00000000..3d848bbf --- /dev/null +++ b/kdevdesigner/designer/sourcefile.cpp @@ -0,0 +1,298 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "sourcefile.h" +#include <tqfile.h> +#include <tqtextstream.h> +#include "designerappiface.h" +#include "sourceeditor.h" +#include "metadatabase.h" +#include "../interfaces/languageinterface.h" +#include <tqfiledialog.h> +#include <tqmessagebox.h> +#include "mainwindow.h" +#include "workspace.h" +#include <stdlib.h> + +#include <tdefiledialog.h> +#include <tdelocale.h> + +SourceFile::SourceFile( const TQString &fn, bool temp, Project *p ) + : filename( fn ), ed( 0 ), fileNameTemp( temp ), + timeStamp( 0, p->makeAbsolute( fn ) ), pro( p ), pkg( FALSE ) + , accepted( TRUE ) +{ + iface = 0; + + if ( !temp ) + accepted = checkFileName( TRUE ); + + if (accepted) { + load(); + pro->addSourceFile( this ); + MetaDataBase::addEntry( this ); + } + +} + +SourceFile::~SourceFile() +{ + if (iface) + delete iface; +} + +TQString SourceFile::text() const +{ + return txt; +} + +void SourceFile::setText( const TQString &s ) +{ + txt = s; +} + +bool SourceFile::save( bool ignoreModified ) +{ + if ( fileNameTemp ) + return saveAs(); + if ( !ignoreModified && !isModified() ) + return TRUE; + if ( ed ) + ed->save(); + + if ( TQFile::exists( pro->makeAbsolute( filename ) ) ) { + TQString fn( pro->makeAbsolute( filename ) ); +#if defined(Q_OS_WIN32) + fn += ".bak"; +#else + fn += "~"; +#endif + TQFile f( pro->makeAbsolute( filename ) ); + if ( f.open( IO_ReadOnly ) ) { + TQFile f2( fn ); + if ( f2.open( IO_WriteOnly | IO_Translate ) ) { + TQCString data( f.size() ); + f.readBlock( data.data(), f.size() ); + f2.writeBlock( data ); + } + } + } + + TQFile f( pro->makeAbsolute( filename ) ); + if ( !f.open( IO_WriteOnly | IO_Translate ) ) + return saveAs(); + + TQTextStream ts( &f ); + ts << txt; + timeStamp.update(); + setModified( FALSE ); + return TRUE; +} + +bool SourceFile::saveAs( bool ignoreModified ) +{ + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + TQString filter; + if ( iface ) + filter = iface->fileFilterList().join("\n"); + + TQString old = filename; + TQString initFn = pro->makeAbsolute( filename ); + if ( ignoreModified ) { + TQString dir = TQStringList::split( ':', project()->iFace()->customSetting( "QTSCRIPT_PACKAGES" ) ).first(); + initFn = TQFileInfo( initFn ).fileName(); + initFn.prepend( dir + "/" ); + } + TQString fn = KFileDialog::getSaveFileName( initFn, filter ); + if ( fn.isEmpty() ) + return FALSE; + fileNameTemp = FALSE; + filename = pro->makeRelative( fn ); + if ( !checkFileName( TRUE ) ) { + filename = old; + return FALSE; + } + pro->setModified( TRUE ); + timeStamp.setFileName( pro->makeAbsolute( filename ) ); + if ( ed ) + ed->setCaption( i18n( "Edit %1" ).arg( filename ) ); + setModified( TRUE ); + if ( pro->isDummy() ) { + TQObject *o = ed->parent(); + while ( o && !o->isA( "MainWindow" ) ) + o = o->parent(); + if ( o ) + ((MainWindow *)o)->addRecentlyOpenedFile( fn ); + } + return save( ignoreModified ); +} + +bool SourceFile::load() +{ + TQFile f( pro->makeAbsolute( filename ) ); + if ( !f.open( IO_ReadOnly ) ) + return FALSE; + TQTextStream ts( &f ); + txt = ts.read(); + timeStamp.update(); + return TRUE; +} + +DesignerSourceFile *SourceFile::iFace() +{ + if ( !iface ) + iface = new DesignerSourceFileImpl( this ); + return iface; +} + +void SourceFile::setEditor( SourceEditor *e ) +{ + ed = e; +} + +bool SourceFile::isModified() const +{ + if ( !ed ) + return FALSE; + return ed->isModified(); +} + +static TQMap<TQString, int> *extensionCounter; +TQString SourceFile::createUnnamedFileName( const TQString &extension ) +{ + if ( !extensionCounter ) + extensionCounter = new TQMap<TQString, int>; + int count = -1; + TQMap<TQString, int>::Iterator it; + if ( ( it = extensionCounter->find( extension ) ) != extensionCounter->end() ) { + count = *it; + ++count; + extensionCounter->replace( extension, count ); + } else { + count = 1; + extensionCounter->insert( extension, count ); + } + + return "unnamed" + TQString::number( count ) + "." + extension; +} + +void SourceFile::setModified( bool m ) +{ + if ( !ed ) + return; + ed->setModified( m ); +} + +bool SourceFile::closeEvent() +{ + if ( !isModified() && fileNameTemp ) { + pro->removeSourceFile( this ); + return TRUE; + } + + if ( !isModified() ) + return TRUE; + + if ( ed ) + ed->save(); + + switch ( TQMessageBox::warning( MainWindow::self, i18n( "Save Code" ), + i18n( "Save changes to '%1'?" ).arg( filename ), + i18n( "&Yes" ), i18n( "&No" ), i18n( "&Cancel" ), 0, 2 ) ) { + case 0: // save + if ( !save() ) + return FALSE; + break; + case 1: // don't save + load(); + if ( ed ) + ed->editorInterface()->setText( txt ); + if ( fileNameTemp ) { + pro->removeSourceFile( this ); + return TRUE; + } + if ( MainWindow::self ) + MainWindow::self->workspace()->update(); + break; + case 2: // cancel + return FALSE; + default: + break; + } + setModified( FALSE ); + return TRUE; +} + +bool SourceFile::close() +{ + if ( !ed ) + return TRUE; + return ed->close(); +} + +Project *SourceFile::project() const +{ + return pro; +} + +void SourceFile::checkTimeStamp() +{ + if ( timeStamp.isUpToDate() ) + return; + timeStamp.update(); + if ( TQMessageBox::information( MainWindow::self, i18n( "TQt Designer" ), + i18n( "File '%1' has been changed outside TQt Designer.\n" + "Do you want to reload it?" ).arg( filename ), + i18n( "&Yes" ), i18n( "&No" ) ) == 0 ) { + load(); + if ( ed ) + ed->editorInterface()->setText( txt ); + } +} + +bool SourceFile::checkFileName( bool allowBreak ) +{ + SourceFile *sf = pro->findSourceFile( filename, this ); + if ( sf ) + TQMessageBox::warning( MainWindow::self, i18n( "Invalid Filename" ), + i18n( "The project already contains a source file with \n" + "filename '%1'. Please choose a new filename." ).arg( filename ) ); + while ( sf ) { + LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() ); + TQString filter; + if ( iface ) + filter = iface->fileFilterList().join("\n"); + TQString fn; + while ( fn.isEmpty() ) { + fn = KFileDialog::getSaveFileName( pro->makeAbsolute( filename ), filter ); + if ( allowBreak && fn.isEmpty() ) + return FALSE; + } + filename = pro->makeRelative( fn ); + sf = pro->findSourceFile( filename, this ); + } + return TRUE; +} diff --git a/kdevdesigner/designer/sourcefile.h b/kdevdesigner/designer/sourcefile.h new file mode 100644 index 00000000..ef4d31db --- /dev/null +++ b/kdevdesigner/designer/sourcefile.h @@ -0,0 +1,87 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef SOURCEFILE_H +#define SOURCEFILE_H + +#include <tqobject.h> +#include "timestamp.h" + +struct DesignerSourceFile; +class SourceEditor; +class Project; + +class SourceFile : public TQObject +{ + Q_OBJECT + + +public: + SourceFile( const TQString &fn, bool temp, Project *p ); + ~SourceFile(); + + void setText( const TQString &s ); + void setModified( bool m ); + + bool save( bool ignoreModified = FALSE ); + bool saveAs( bool ignoreModified = FALSE ); + bool load(); + bool close(); + bool closeEvent(); + Project *project() const; + + TQString text() const; + TQString fileName() const { return filename; } + bool isModified() const; + + void checkTimeStamp(); + + DesignerSourceFile *iFace(); + + void setEditor( SourceEditor *e ); + SourceEditor *editor() const { return ed; } + + static TQString createUnnamedFileName( const TQString &extension ); + + bool isAccepted() const { return accepted; } + +private: + bool checkFileName( bool allowBreak ); + +private: + TQString filename; + TQString txt; + DesignerSourceFile *iface; + SourceEditor *ed; + bool fileNameTemp; + TimeStamp timeStamp; + Project *pro; + bool pkg; + bool accepted; + +}; + +#endif diff --git a/kdevdesigner/designer/startdialog.ui b/kdevdesigner/designer/startdialog.ui new file mode 100644 index 00000000..383fdfda --- /dev/null +++ b/kdevdesigner/designer/startdialog.ui @@ -0,0 +1,324 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>StartDialogBase</class> +<comment>********************************************************************* +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>StartDialogBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>576</width> + <height>420</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>Qt Designer - New/Open</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTabWidget"> + <property name="name"> + <cstring>tabWidget</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget8</cstring> + </property> + <attribute name="title"> + <string>&New File/Project</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQIconView" row="1" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>templateView</cstring> + </property> + <property name="gridX"> + <number>120</number> + </property> + <property name="resizeMode"> + <enum>Adjust</enum> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>&Open File/Project</string> + </attribute> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + </hbox> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>Widget9</cstring> + </property> + <attribute name="title"> + <string>&Recently Opened</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQIconView" row="0" column="0"> + <property name="name"> + <cstring>recentView</cstring> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="gridX"> + <number>120</number> + </property> + <property name="resizeMode"> + <enum>Adjust</enum> + </property> + <property name="itemsMovable"> + <bool>false</bool> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>fileInfoLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>2</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string></string> + </property> + </widget> + </grid> + </widget> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>checkShowInFuture</cstring> + </property> + <property name="text"> + <string>&Do not show this dialog in the future</string> + </property> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <number>4144</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="accel"> + <number>0</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="accel"> + <number>0</number> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>StartDialogBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>StartDialogBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>templateView</sender> + <signal>doubleClicked(TQIconViewItem*)</signal> + <receiver>StartDialogBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>templateView</sender> + <signal>returnPressed(TQIconViewItem*)</signal> + <receiver>StartDialogBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>recentView</sender> + <signal>doubleClicked(TQIconViewItem*)</signal> + <receiver>StartDialogBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>recentView</sender> + <signal>onItem(TQIconViewItem*)</signal> + <receiver>StartDialogBase</receiver> + <slot>recentItemChanged(TQIconViewItem*)</slot> + </connection> + <connection> + <sender>recentView</sender> + <signal>onViewport()</signal> + <receiver>StartDialogBase</receiver> + <slot>clearFileInfo()</slot> + </connection> + <connection> + <sender>recentView</sender> + <signal>returnPressed(TQIconViewItem*)</signal> + <receiver>StartDialogBase</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>recentView</sender> + <signal>selectionChanged(TQIconViewItem*)</signal> + <receiver>StartDialogBase</receiver> + <slot>recentItemChanged(TQIconViewItem*)</slot> + </connection> +</connections> +<Q_SLOTS> + <slot>recentItemChanged( TQIconViewItem * )</slot> + <slot>clearFileInfo()</slot> + <slot>accept()</slot> + <slot>reject()</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/startdialogimpl.cpp b/kdevdesigner/designer/startdialogimpl.cpp new file mode 100644 index 00000000..adff44fd --- /dev/null +++ b/kdevdesigner/designer/startdialogimpl.cpp @@ -0,0 +1,182 @@ +#include <kiconloader.h> +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqptrlist.h> +#include <tqiconview.h> +#include <tqcombobox.h> +#include <tqlabel.h> +#include <tqfiledialog.h> +#include <tqtabwidget.h> +#include <tqpoint.h> +#include <tqobjectlist.h> +#include <tqpushbutton.h> +#include <tqlayout.h> +#include <tqfileinfo.h> +#include <tqmap.h> +#include <tqdatetime.h> +#include <tqapplication.h> +#include <tqcheckbox.h> +#include <tqurl.h> + +#include "kdevdesigner_part.h" + +#include "mainwindow.h" +#include "startdialogimpl.h" +#include "designerapp.h" + +#include <tdelocale.h> + +FileDialog::FileDialog( const TQString &dir, TQWidget *parent ) + : TQFileDialog( dir, TQString(), parent ) +{ +} + +void FileDialog::accept() +{ + emit fileSelected(); +} + + +StartDialog::StartDialog( TQWidget *parent, const TQString &templatePath ) + : StartDialogBase( parent, 0 ) +{ + newForm = new NewForm( templateView, templatePath ); + recentFiles.clear(); + initFileOpen(); + showInFuture = TRUE; + + connect( buttonHelp, TQT_SIGNAL( clicked() ), + MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + connect( recentView, TQT_SIGNAL( doubleClicked(TQIconViewItem*) ), + this, TQT_SLOT( accept() ) ); + connect( recentView, TQT_SIGNAL( returnPressed(TQIconViewItem*) ), + this, TQT_SLOT( accept() ) ); + connect( fd, TQT_SIGNAL( fileSelected() ), this, TQT_SLOT( accept() ) ); +} + +void StartDialog::accept() +{ + hide(); + showInFuture = !checkShowInFuture->isChecked(); // means don't show it anymore + + int tabindex = tabWidget->currentPageIndex(); + TQString filename; + if( !tabindex ) { + if ( !templateView->currentItem() ) + return; + Project *pro = MainWindow::self->findProject( i18n( "<No Project>" ) ); + if ( !pro ) + return; + MainWindow::self->setCurrentProject( pro ); + ( (NewItem*)templateView->currentItem() )->insert( pro ); + } else if ( tabindex == 1 ) { + filename = fd->selectedFile(); + } else if ( tabindex == 2 ) { + filename = recentFiles[recentView->currentItem()->index()]; + } + if ( tabindex ) { + if ( !filename.isEmpty() ) { + TQFileInfo fi( filename ); + if ( fi.extension() == "pro" ) + MainWindow::self->openProject( filename ); + else + MainWindow::self->fileOpen( "", "", filename ); + } + } + + done( Accepted ); +} + +void StartDialog::reject() +{ + done( Rejected ); +} + +void StartDialog::recentItemChanged( TQIconViewItem *item ) +{ + TQString msg( recentFiles[item->index()] ); + TQFileInfo f( recentFiles[item->index()] ); + uint s = f.size(); + TQString unit( "B" ); + if( s > 1024 ) { + s /= 1024; + unit = "KB"; + } + if ( s > 1024 ) { + s /= 1024; + unit = "MB"; + } + TQDateTime dt( f.lastModified() ); + TQString date( dt.toString( "MMMM dd hh:mm" )); + msg = TQString( "%1 (%2 %3) %4" ).arg(msg).arg(s).arg(unit).arg(date); + fileInfoLabel->setText( msg ); +} + +void StartDialog::clearFileInfo() +{ + fileInfoLabel->clear(); +} + +void StartDialog::setRecentlyFiles( TQStringList &files ) +{ + insertRecentItems( files, FALSE ); +} + +void StartDialog::setRecentlyProjects( TQStringList &projects ) +{ + insertRecentItems( projects, TRUE ); +} + +void StartDialog::insertRecentItems( TQStringList &files, bool isProject ) +{ + TQString iconName = "designer_newform.png"; + if ( isProject ) + iconName = "designer_project.png"; + TQIconViewItem *item; + TQStringList::iterator it = files.begin(); + for( ; it != files.end(); ++it ) { + TQFileInfo fi( *it ); + item = new TQIconViewItem( recentView, fi.fileName() ); + recentFiles[recentView->index( item )] = *it; + item->setPixmap( BarIcon( iconName, KDevDesignerPartFactory::instance() ) ); + item->setDragEnabled( FALSE ); + } +} + +void StartDialog::initFileOpen() +{ + TQString encode = TQDir::currentDirPath(); + TQUrl::encode( encode ); + fd = new FileDialog( encode, this ); + TQPoint point( 0, 0 ); + fd->reparent( tab, point ); + + TQObjectList *l = fd->queryList( TQPUSHBUTTON_OBJECT_NAME_STRING ); + TQObjectListIt it( *l ); + TQObject *obj; + while ( (obj = it.current()) != 0 ) { + ++it; + ((TQPushButton*)obj)->hide(); + } + delete l; + + fd->setSizeGripEnabled ( FALSE ); + tabLayout->addWidget( fd ); + + TQPluginManager<ImportFilterInterface> manager( IID_ImportFilter, TQApplication::libraryPaths(), + MainWindow::self->pluginDirectory() ); + TQStringList filterlist; + filterlist << i18n( "Designer Files (*.ui *.pro)" ); + filterlist << i18n( "TQt User-Interface Files (*.ui)" ); + filterlist << i18n( "QMAKE Project Files (*.pro)" ); + + TQStringList list = manager.featureList(); + for ( TQStringList::Iterator it2 = list.begin(); it2 != list.end(); ++it2 ) + filterlist << *it2; + + filterlist << i18n( "All Files (*)" ); + TQString filters = filterlist.join( ";;" ); + fd->setFilters( filters ); + + fd->show(); +} diff --git a/kdevdesigner/designer/startdialogimpl.h b/kdevdesigner/designer/startdialogimpl.h new file mode 100644 index 00000000..8fb574d0 --- /dev/null +++ b/kdevdesigner/designer/startdialogimpl.h @@ -0,0 +1,82 @@ +/********************************************************************** +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef STARTDIALOGIMPL_H +#define STARTDIALOGIMPL_H + +#include <tqiconview.h> +#include <tqlistview.h> +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqfiledialog.h> +#include <tqmap.h> + +#include "newformimpl.h" +#include "startdialog.h" + +class FileDialog : public TQFileDialog +{ + Q_OBJECT + + +public: + FileDialog( const TQString &dir, TQWidget *parent ); + +protected slots: + void accept(); + +signals: + void fileSelected(); +}; + + +class StartDialog : public StartDialogBase +{ + Q_OBJECT + + +public: + StartDialog( TQWidget *parent, const TQString &templatePath ); + void setRecentlyFiles( TQStringList& ); + void setRecentlyProjects( TQStringList& ); + bool showDialogInFuture() const { return showInFuture; } + +protected slots: + void recentItemChanged( TQIconViewItem *item ); + void clearFileInfo(); + void accept(); + void reject(); + +private: + void initFileOpen(); + void insertRecentItems( TQStringList &files, bool isProject ); + NewForm *newForm; + FileDialog *fd; + TQMap<int, TQString> recentFiles; + bool showInFuture; +}; + +#endif diff --git a/kdevdesigner/designer/styledbutton.cpp b/kdevdesigner/designer/styledbutton.cpp new file mode 100644 index 00000000..82c9ddb8 --- /dev/null +++ b/kdevdesigner/designer/styledbutton.cpp @@ -0,0 +1,295 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler needs this here +#include "styledbutton.h" +#include "formwindow.h" +#include "pixmapchooser.h" +#include <tqcolordialog.h> +#include <tqpalette.h> +#include <tqlabel.h> +#include <tqpainter.h> +#include <tqimage.h> +#include <tqpixmap.h> +#include <tqapplication.h> +#include <tqdragobject.h> +#include <tqstyle.h> + +StyledButton::StyledButton(TQWidget* parent, const char* name) + : TQButton( parent, name ), pix( 0 ), spix( 0 ), s( 0 ), formWindow( 0 ), mousePressed( FALSE ) +{ + setMinimumSize( minimumSizeHint() ); + setAcceptDrops( TRUE ); + + connect( this, TQT_SIGNAL(clicked()), TQT_SLOT(onEditor())); + + setEditor( ColorEditor ); +} + +StyledButton::StyledButton( const TQBrush& b, TQWidget* parent, const char* name, WFlags f ) + : TQButton( parent, name, f ), spix( 0 ), s( 0 ), formWindow( 0 ) +{ + col = b.color(); + pix = b.pixmap(); + setMinimumSize( minimumSizeHint() ); +} + +StyledButton::~StyledButton() +{ +} + +void StyledButton::setEditor( EditorType e ) +{ + if ( edit == e ) + return; + + edit = e; + update(); +} + +StyledButton::EditorType StyledButton::editor() const +{ + return edit; +} + +void StyledButton::setColor( const TQColor& c ) +{ + col = c; + update(); +} + +void StyledButton::setPixmap( const TQPixmap & pm ) +{ + if ( !pm.isNull() ) { + delete pix; + pix = new TQPixmap( pm ); + } else { + delete pix; + pix = 0; + } + scalePixmap(); +} + +TQColor StyledButton::color() const +{ + return col; +} + +TQPixmap* StyledButton::pixmap() const +{ + return pix; +} + +bool StyledButton::scale() const +{ + return s; +} + +void StyledButton::setScale( bool on ) +{ + if ( s == on ) + return; + + s = on; + scalePixmap(); +} + +TQSize StyledButton::sizeHint() const +{ + return TQSize( 50, 25 ); +} + +TQSize StyledButton::minimumSizeHint() const +{ + return TQSize( 50, 25 ); +} + +void StyledButton::scalePixmap() +{ + delete spix; + + if ( pix ) { + spix = new TQPixmap( 6*width()/8, 6*height()/8 ); + TQImage img = pix->convertToImage(); + + spix->convertFromImage( s? img.smoothScale( 6*width()/8, 6*height()/8 ) : img ); + } else { + spix = 0; + } + + update(); +} + +void StyledButton::resizeEvent( TQResizeEvent* e ) +{ + scalePixmap(); + TQButton::resizeEvent( e ); +} + +void StyledButton::drawButton( TQPainter *paint ) +{ + style().tqdrawPrimitive(TQStyle::PE_ButtonBevel, paint, rect(), colorGroup(), + isDown() ? TQStyle::Style_Sunken : TQStyle::Style_Raised); + drawButtonLabel(paint); + + if (hasFocus()) + style().tqdrawPrimitive(TQStyle::PE_FocusRect, paint, + style().subRect(TQStyle::SR_PushButtonFocusRect, this), + colorGroup(), TQStyle::Style_Default); +} + +void StyledButton::drawButtonLabel( TQPainter *paint ) +{ + TQColor pen = isEnabled() ? + hasFocus() ? palette().active().buttonText() : palette().inactive().buttonText() + : palette().disabled().buttonText(); + paint->setPen( pen ); + + if(!isEnabled()) { + paint->setBrush( TQBrush( colorGroup().button() ) ); + } + else if ( edit == PixmapEditor && spix ) { + paint->setBrush( TQBrush( col, *spix ) ); + paint->setBrushOrigin( width()/8, height()/8 ); + } else + paint->setBrush( TQBrush( col ) ); + + paint->drawRect( width()/8, height()/8, 6*width()/8, 6*height()/8 ); +} + +void StyledButton::onEditor() +{ + switch (edit) { + case ColorEditor: { + TQColor c = TQColorDialog::getColor( palette().active().background(), this ); + if ( c.isValid() ) { + setColor( c ); + emit changed(); + } + } break; + case PixmapEditor: { + TQPixmap p; + if ( pixmap() ) + p = qChoosePixmap( this, formWindow, *pixmap() ); + else + p = qChoosePixmap( this, formWindow, TQPixmap() ); + if ( !p.isNull() ) { + setPixmap( p ); + emit changed(); + } + } break; + default: + break; + } +} + +void StyledButton::mousePressEvent(TQMouseEvent* e) +{ + TQButton::mousePressEvent(e); + mousePressed = TRUE; + pressPos = e->pos(); +} + +void StyledButton::mouseMoveEvent(TQMouseEvent* e) +{ + TQButton::mouseMoveEvent( e ); +#ifndef TQT_NO_DRAGANDDROP + if ( !mousePressed ) + return; + if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) { + if ( edit == ColorEditor ) { + TQColorDrag *drg = new TQColorDrag( col, this ); + TQPixmap pix( 25, 25 ); + pix.fill( col ); + TQPainter p( &pix ); + p.drawRect( 0, 0, pix.width(), pix.height() ); + p.end(); + drg->setPixmap( pix ); + mousePressed = FALSE; + drg->dragCopy(); + } + else if ( edit == PixmapEditor && pix && !pix->isNull() ) { + TQImage img = pix->convertToImage(); + TQImageDrag *drg = new TQImageDrag( img, this ); + if(spix) + drg->setPixmap( *spix ); + mousePressed = FALSE; + drg->dragCopy(); + } + } +#endif +} + +#ifndef TQT_NO_DRAGANDDROP +void StyledButton::dragEnterEvent( TQDragEnterEvent *e ) +{ + setFocus(); + if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) + e->accept(); + else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) + e->accept(); + else + e->ignore(); +} + +void StyledButton::dragLeaveEvent( TQDragLeaveEvent * ) +{ + if ( hasFocus() ) + parentWidget()->setFocus(); +} + +void StyledButton::dragMoveEvent( TQDragMoveEvent *e ) +{ + if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) + e->accept(); + else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) + e->accept(); + else + e->ignore(); +} + +void StyledButton::dropEvent( TQDropEvent *e ) +{ + if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) { + TQColor color; + TQColorDrag::decode( e, color ); + setColor(color); + emit changed(); + e->accept(); + } + else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) { + TQImage img; + TQImageDrag::decode( e, img ); + TQPixmap pm; + pm.convertFromImage(img); + setPixmap(pm); + emit changed(); + e->accept(); + } else { + e->ignore(); + } +} +#endif // TQT_NO_DRAGANDDROP diff --git a/kdevdesigner/designer/styledbutton.h b/kdevdesigner/designer/styledbutton.h new file mode 100644 index 00000000..8065fe84 --- /dev/null +++ b/kdevdesigner/designer/styledbutton.h @@ -0,0 +1,104 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef STYLEDBUTTON_H +#define STYLEDBUTTON_H + +#include <tqbutton.h> +#include <tqpixmap.h> + +class TQColor; +class TQBrush; +class FormWindow; + +class StyledButton : public TQButton +{ + Q_OBJECT + + + TQ_PROPERTY( TQColor color READ color WRITE setColor ) + TQ_PROPERTY( TQPixmap pixmap READ pixmap WRITE setPixmap ) + TQ_PROPERTY( EditorType editor READ editor WRITE setEditor ) + TQ_PROPERTY( bool scale READ scale WRITE setScale ) + + TQ_ENUMS( EditorType ) + +public: + enum EditorType { ColorEditor, PixmapEditor }; + + StyledButton( TQWidget* parent = 0, const char* name = 0 ); + StyledButton( const TQBrush& b, TQWidget* parent = 0, const char* name = 0, WFlags f = 0 ); + ~StyledButton(); + + void setEditor( EditorType ); + EditorType editor() const; + + void setColor( const TQColor& ); + void setPixmap( const TQPixmap& ); + + TQPixmap* pixmap() const; + TQColor color() const; + + void setScale( bool ); + bool scale() const; + + TQSize sizeHint() const; + TQSize minimumSizeHint() const; + + void setFormWindow( FormWindow *fw ) { formWindow = fw; } + +public slots: + virtual void onEditor(); + +signals: + void changed(); + +protected: + void mousePressEvent(TQMouseEvent*); + void mouseMoveEvent(TQMouseEvent*); +#ifndef TQT_NO_DRAGANDDROP + void dragEnterEvent ( TQDragEnterEvent * ); + void dragMoveEvent ( TQDragMoveEvent * ); + void dragLeaveEvent ( TQDragLeaveEvent * ); + void dropEvent ( TQDropEvent * ); +#endif // TQT_NO_DRAGANDDROP + void drawButton( TQPainter* ); + void drawButtonLabel( TQPainter* ); + void resizeEvent( TQResizeEvent* ); + void scalePixmap(); + +private: + TQPixmap* pix; + TQPixmap* spix; // the pixmap scaled down to fit into the button + TQColor col; + EditorType edit; + bool s; + FormWindow *formWindow; + TQPoint pressPos; + bool mousePressed; +}; + +#endif //STYLEDBUTTON_H diff --git a/kdevdesigner/designer/syntaxhighlighter_html.cpp b/kdevdesigner/designer/syntaxhighlighter_html.cpp new file mode 100644 index 00000000..5bb681f9 --- /dev/null +++ b/kdevdesigner/designer/syntaxhighlighter_html.cpp @@ -0,0 +1,160 @@ +/********************************************************************** +** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "syntaxhighlighter_html.h" +#include "tqstring.h" +#include "tqmap.h" +#include "tqapplication.h" + + +SyntaxHighlighter_HTML::SyntaxHighlighter_HTML() + : TQTextPreProcessor(), lastFormat( 0 ), lastFormatId( -1 ) +{ + TQFont f( tqApp->font() ); + + addFormat(Standard, new TQTextFormat(f, tqApp->palette().color(TQPalette::Active, TQColorGroup::Text))); + addFormat(Keyword, new TQTextFormat(f, tqApp->palette().color(TQPalette::Active, TQColorGroup::Dark))); + addFormat(Attribute, new TQTextFormat(f, tqApp->palette().color(TQPalette::Active, TQColorGroup::Link))); + addFormat(AttribValue, new TQTextFormat(f, tqApp->palette().color(TQPalette::Active, TQColorGroup::LinkVisited))); +} + +SyntaxHighlighter_HTML::~SyntaxHighlighter_HTML() +{ +} + +void SyntaxHighlighter_HTML::process( TQTextDocument *doc, TQTextParagraph *string, int, bool invalidate ) +{ + + TQTextFormat *formatStandard = format( Standard ); + TQTextFormat *formatKeyword = format( Keyword ); + TQTextFormat *formatAttribute = format( Attribute ); + TQTextFormat *formatAttribValue = format( AttribValue ); + + const int StateStandard = 0; + const int StateTag = 1; + const int StateAttribute = 2; + const int StateAttribVal = 3; + + TQString buffer = ""; + + int state = StateStandard; + + + if ( string->prev() ) { + if ( string->prev()->endState() == -1 ) + process( doc, string->prev(), 0, FALSE ); + state = string->prev()->endState(); + } + + + int i = 0; + for ( ;; ) { + TQChar c = string->at( i )->c; + + if ( c == '<' ) { + if ( state != StateStandard ) + string->setFormat( i - buffer.length(), buffer.length(), formatStandard, FALSE ); + buffer = c; + state = StateTag; + string->setFormat( i, 1, formatKeyword, FALSE ); + } + else if ( c == '>' && ( state != StateStandard ) ) { + string->setFormat( i, 1, formatKeyword, FALSE ); + buffer = ""; + state = StateStandard; + } + else if ( c == ' ' && state == StateTag ) { + buffer += c; + string->setFormat( i, 1, formatStandard, FALSE ); + state = StateAttribute; + } + else if ( c == '=' && state == StateAttribute ) { + buffer += c; + string->setFormat( i, 1, formatStandard, FALSE ); + state = StateAttribute; + } + else if ( c == '\"' && state == StateAttribute ) { + buffer += c; + string->setFormat( i, 1, formatStandard, FALSE ); + state = StateAttribVal; + } + else if ( c == '\"' && state == StateAttribVal ) { + buffer += c; + string->setFormat( i, 1, formatStandard, FALSE ); + state = StateAttribute; + } + else if ( state == StateAttribute ) { + buffer += c; + string->setFormat( i, 1, formatAttribute, FALSE ); + } + else if ( state == StateAttribVal ) { + buffer += c; + string->setFormat( i, 1, formatAttribValue, FALSE ); + } + else if ( state == StateTag ) { + string->setFormat( i, 1, formatKeyword, FALSE ); + buffer += c; + } + else if ( state == StateStandard ) { + string->setFormat( i, 1, formatStandard, FALSE ); + } + + i++; + if ( i >= string->length() ) + break; + } + + string->setEndState( state ); + string->setFirstPreProcess( FALSE ); + + if ( invalidate && string->next() && + !string->next()->firstPreProcess() && string->next()->endState() != -1 ) { + TQTextParagraph *p = string->next(); + while ( p ) { + if ( p->endState() == -1 ) + return; + p->setEndState( -1 ); + p = p->next(); + } + } +} + +TQTextFormat *SyntaxHighlighter_HTML::format( int id ) +{ + if ( lastFormatId == id && lastFormat ) + return lastFormat; + + TQTextFormat *f = formats[ id ]; + lastFormat = f ? f : formats[ 0 ]; + lastFormatId = id; + return lastFormat; +} + +void SyntaxHighlighter_HTML::addFormat( int id, TQTextFormat *f ) +{ + formats.insert( id, f ); +} diff --git a/kdevdesigner/designer/syntaxhighlighter_html.h b/kdevdesigner/designer/syntaxhighlighter_html.h new file mode 100644 index 00000000..efd1a616 --- /dev/null +++ b/kdevdesigner/designer/syntaxhighlighter_html.h @@ -0,0 +1,57 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef SYNTAXHIGHLIGHTER_HTML_H +#define SYNTAXHIGHLIGHTER_HTML_H + +#include <tqrichtext_p.h> + +class SyntaxHighlighter_HTML : public TQTextPreProcessor +{ +public: + + enum HTML { + Standard = 1, + Keyword, + Attribute, + AttribValue + }; + + SyntaxHighlighter_HTML(); + virtual ~SyntaxHighlighter_HTML(); + void process( TQTextDocument *doc, TQTextParagraph *string, int start, bool invalidate = TRUE ); + TQTextFormat *format( int id ); + +private: + void addFormat( int id, TQTextFormat *f ); + + TQTextFormat *lastFormat; + int lastFormatId; + TQIntDict<TQTextFormat> formats; + +}; + +#endif diff --git a/kdevdesigner/designer/tableeditor.ui b/kdevdesigner/designer/tableeditor.ui new file mode 100644 index 00000000..deacf5d4 --- /dev/null +++ b/kdevdesigner/designer/tableeditor.ui @@ -0,0 +1,828 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>TableEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>TableEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>484</width> + <height>406</height> + </rect> + </property> + <property name="caption"> + <string>Edit Table</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQTable" row="0" column="0"> + <property name="name"> + <cstring>table</cstring> + </property> + <property name="numRows"> + <number>1</number> + </property> + <property name="numCols"> + <number>1</number> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout11</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonApply</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Apply all changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQTabWidget" row="0" column="1"> + <property name="name"> + <cstring>TabWidget</cstring> + </property> + <widget class="TQWidget"> + <property name="name"> + <cstring>columns_tab</cstring> + </property> + <attribute name="title"> + <string>Co&lumns</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer row="4" column="2"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQListBox" row="0" column="0" rowspan="6" colspan="1"> + <property name="name"> + <cstring>listColumns</cstring> + </property> + </widget> + <spacer row="3" column="1"> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>buttonColumnUp</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move up</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item up.</b><p>The top-most column will be the first column of the list.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="5" column="1"> + <property name="name"> + <cstring>buttonColumnDown</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move down</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item down.</b><p>The top-most column will be the first column of the list.</p></string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>buttonDeleteColumn</cstring> + </property> + <property name="text"> + <string>&Delete Column</string> + </property> + </widget> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>buttonNewColumn</cstring> + </property> + <property name="text"> + <string>&New Column</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="2" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout6</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>labelTable</cstring> + </property> + <property name="text"> + <string>Table:</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="3" column="1"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelColumnPixmap</cstring> + </property> + <property name="text"> + <string>Label4</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonDeleteColPixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the selected item's pixmap.</b><p>The pixmap in the current column of the selected item will be deleted.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonChooseColPixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a pixmap file for the item.</b><p>The pixmap will be changed in the current column of the selected item.</p></string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLabel" row="2" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>&Label:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editColumnText</cstring> + </property> + </widget> + <widget class="TQLabel" row="3" column="0"> + <property name="name"> + <cstring>Label2</cstring> + </property> + <property name="text"> + <string>Pixmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemChoosePixmap</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>labelFields</cstring> + </property> + <property name="text"> + <string>&Field:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>comboFields</cstring> + </property> + </widget> + <widget class="KLineEdit" row="2" column="1"> + <property name="name"> + <cstring>editColumnText</cstring> + </property> + </widget> + <widget class="TQComboBox" row="1" column="1"> + <property name="name"> + <cstring>comboFields</cstring> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + <widget class="TQLabel" row="0" column="1"> + <property name="name"> + <cstring>labelTableValue</cstring> + </property> + <property name="text"> + <string><no table></string> + </property> + </widget> + </grid> + </widget> + </grid> + </widget> + <widget class="TQWidget"> + <property name="name"> + <cstring>rows_tab</cstring> + </property> + <attribute name="title"> + <string>&Rows</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <spacer row="4" column="2"> + <property name="name"> + <cstring>Spacer3_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="4" column="1"> + <property name="name"> + <cstring>buttonRowUp</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move up</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item up.</b><p>The top-most column will be the first column of the list.</p></string> + </property> + </widget> + <widget class="TQListBox" row="0" column="0" rowspan="6" colspan="1"> + <property name="name"> + <cstring>listRows</cstring> + </property> + </widget> + <widget class="TQPushButton" row="5" column="1"> + <property name="name"> + <cstring>buttonRowDown</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Move down</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Move the selected item down.</b><p>The top-most column will be the first column of the list.</p></string> + </property> + </widget> + <spacer row="3" column="1"> + <property name="name"> + <cstring>Spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="0" column="1"> + <property name="name"> + <cstring>buttonNewRow</cstring> + </property> + <property name="text"> + <string>&New Row</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="1"> + <property name="name"> + <cstring>buttonDeleteRow</cstring> + </property> + <property name="text"> + <string>&Delete Row</string> + </property> + </widget> + <widget class="TQLayoutWidget" row="2" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Layout7_2</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel2_3</cstring> + </property> + <property name="text"> + <string>&Label:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>editRowText</cstring> + </property> + </widget> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>Label2_2</cstring> + </property> + <property name="text"> + <string>Pixmap:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>itemChoosePixmap</cstring> + </property> + </widget> + <widget class="TQLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>Layout2_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>labelRowPixmap</cstring> + </property> + <property name="text"> + <string>Label4</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonDeleteRowPixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_editcut.png"</pixmap> + </property> + <property name="toolTip" stdset="0"> + <string>Delete Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Delete the selected item's pixmap.</b><p>The pixmap in the current column of the selected item will be deleted.</p></string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonChooseRowPixmap</cstring> + </property> + <property name="maximumSize"> + <size> + <width>30</width> + <height>22</height> + </size> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Pixmap</string> + </property> + <property name="whatsThis" stdset="0"> + <string><b>Select a pixmap file for the item.</b><p>The pixmap will be changed in the current column of the selected item.</p></string> + </property> + </widget> + </hbox> + </widget> + <widget class="KLineEdit" row="0" column="1"> + <property name="name"> + <cstring>editRowText</cstring> + </property> + </widget> + </grid> + </widget> + </grid> + </widget> + </widget> + </grid> +</widget> +<connections> + <connection> + <sender>buttonApply</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>applyClicked()</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>listColumns</sender> + <signal>currentChanged(TQListBoxItem*)</signal> + <receiver>TableEditorBase</receiver> + <slot>currentColumnChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>listColumns</sender> + <signal>selectionChanged(TQListBoxItem*)</signal> + <receiver>TableEditorBase</receiver> + <slot>currentColumnChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>editColumnText</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>TableEditorBase</receiver> + <slot>columnTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>buttonNewColumn</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>newColumnClicked()</slot> + </connection> + <connection> + <sender>buttonDeleteColumn</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>deleteColumnClicked()</slot> + </connection> + <connection> + <sender>buttonColumnUp</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>columnUpClicked()</slot> + </connection> + <connection> + <sender>buttonColumnDown</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>columnDownClicked()</slot> + </connection> + <connection> + <sender>comboFields</sender> + <signal>activated(const TQString&)</signal> + <receiver>TableEditorBase</receiver> + <slot>currentFieldChanged(const TQString&)</slot> + </connection> + <connection> + <sender>listRows</sender> + <signal>selectionChanged(TQListBoxItem*)</signal> + <receiver>TableEditorBase</receiver> + <slot>currentRowChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>listRows</sender> + <signal>currentChanged(TQListBoxItem*)</signal> + <receiver>TableEditorBase</receiver> + <slot>currentRowChanged(TQListBoxItem*)</slot> + </connection> + <connection> + <sender>buttonNewRow</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>newRowClicked()</slot> + </connection> + <connection> + <sender>buttonDeleteRow</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>deleteRowClicked()</slot> + </connection> + <connection> + <sender>buttonRowUp</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>rowUpClicked()</slot> + </connection> + <connection> + <sender>buttonRowDown</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>rowDownClicked()</slot> + </connection> + <connection> + <sender>buttonChooseRowPixmap</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>chooseRowPixmapClicked()</slot> + </connection> + <connection> + <sender>buttonDeleteColPixmap</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>deleteColPixmapClicked()</slot> + </connection> + <connection> + <sender>editRowText</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>TableEditorBase</receiver> + <slot>rowTextChanged(const TQString&)</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>buttonChooseColPixmap</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>chooseColPixmapClicked()</slot> + </connection> + <connection> + <sender>buttonDeleteRowPixmap</sender> + <signal>clicked()</signal> + <receiver>TableEditorBase</receiver> + <slot>deleteRowPixmapClicked()</slot> + </connection> +</connections> +<tabstops> + <tabstop>buttonOk</tabstop> + <tabstop>buttonCancel</tabstop> + <tabstop>table</tabstop> + <tabstop>TabWidget</tabstop> + <tabstop>listColumns</tabstop> + <tabstop>buttonNewColumn</tabstop> + <tabstop>buttonDeleteColumn</tabstop> + <tabstop>comboFields</tabstop> + <tabstop>editColumnText</tabstop> + <tabstop>buttonDeleteColPixmap</tabstop> + <tabstop>buttonChooseColPixmap</tabstop> + <tabstop>buttonColumnUp</tabstop> + <tabstop>buttonColumnDown</tabstop> + <tabstop>buttonApply</tabstop> + <tabstop>listRows</tabstop> + <tabstop>buttonNewRow</tabstop> + <tabstop>buttonDeleteRow</tabstop> + <tabstop>editRowText</tabstop> + <tabstop>buttonDeleteRowPixmap</tabstop> + <tabstop>buttonChooseRowPixmap</tabstop> + <tabstop>buttonRowUp</tabstop> + <tabstop>buttonRowDown</tabstop> + <tabstop>buttonHelp</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in implementation">tqtable.h</include> +</includes> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">applyClicked()</slot> + <slot access="protected">chooseRowPixmapClicked()</slot> + <slot access="protected">columnTextChanged( const TQString & )</slot> + <slot access="protected">columnUpClicked()</slot> + <slot access="protected">currentColumnChanged( TQListBoxItem * )</slot> + <slot access="protected">currentFieldChanged( const TQString & )</slot> + <slot access="protected">currentRowChanged( TQListBoxItem * )</slot> + <slot access="protected">deleteColPixmapClicked()</slot> + <slot access="protected">deleteColumnClicked()</slot> + <slot access="protected">deleteRowClicked()</slot> + <slot access="protected">deleteRowPixmapClicked()</slot> + <slot access="protected">newColumnClicked()</slot> + <slot access="protected">newRowClicked()</slot> + <slot access="protected">chooseColPixmapClicked()</slot> + <slot access="protected">okClicked()</slot> + <slot access="protected">rowDownClicked()</slot> + <slot access="protected">rowTextChanged( const TQString & )</slot> + <slot access="protected">rowUpClicked()</slot> + <slot access="protected">columnDownClicked()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/tableeditorimpl.cpp b/kdevdesigner/designer/tableeditorimpl.cpp new file mode 100644 index 00000000..060611f6 --- /dev/null +++ b/kdevdesigner/designer/tableeditorimpl.cpp @@ -0,0 +1,494 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "tableeditorimpl.h" +#ifndef TQT_NO_TABLE +#include <tqtable.h> +#endif +#include "formwindow.h" +#include <tqlabel.h> +#include <tqcombobox.h> +#include <tqheader.h> +#include <tqlistbox.h> +#include <klineedit.h> +#include <tqpushbutton.h> +#include "pixmapchooser.h" +#include "command.h" +#include <tqvaluelist.h> +#include <tqtabwidget.h> +#include <tqdatatable.h> +#include "project.h" +#include "metadatabase.h" +#include "mainwindow.h" + +#include <tdelocale.h> + +TableEditor::TableEditor( TQWidget* parent, TQWidget *editWidget, FormWindow *fw, const char* name, bool modal, WFlags fl ) + : TableEditorBase( parent, name, modal, fl ), +#ifndef TQT_NO_TABLE + editTable( (TQTable*)editWidget ), +#endif + formWindow( fw ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); +#ifndef TQT_NO_TABLE + labelColumnPixmap->setText( "" ); + labelRowPixmap->setText( "" ); + +#ifndef TQT_NO_SQL + if ( !::tqqt_cast<TQDataTable*>(editTable) ) +#endif + { + labelFields->hide(); + comboFields->hide(); + labelTable->hide(); + labelTableValue->hide(); + } +#ifndef TQT_NO_SQL + if ( ::tqqt_cast<TQDataTable*>(editTable) ) { + // ## why does this behave weird? + // TabWidget->removePage( rows_tab ); + // rows_tab->hide(); + // ## do this in the meantime... + TabWidget->setTabEnabled( rows_tab, FALSE ); + } + + if ( formWindow->project() && ::tqqt_cast<TQDataTable*>(editTable) ) { + TQStringList lst = MetaDataBase::fakeProperty( TQT_TQOBJECT(editTable), "database" ).toStringList(); + if ( lst.count() == 2 && !lst[ 0 ].isEmpty() && !lst[ 1 ].isEmpty() ) { + TQStringList fields; + fields << "<no field>"; + fields += formWindow->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] ); + comboFields->insertStringList( fields ); + } + if ( !lst[ 1 ].isEmpty() ) + labelTableValue->setText( lst[ 1 ] ); + } +#endif + + readFromTable(); +#endif +} + +TableEditor::~TableEditor() +{ +} + +void TableEditor::columnDownClicked() +{ + if ( listColumns->currentItem() == -1 || + listColumns->currentItem() == (int)listColumns->count() - 1 || + listColumns->count() < 2 ) + return; + saveFieldMap(); + int index = listColumns->currentItem() + 1; + TQListBoxItem *i = listColumns->item( listColumns->currentItem() ); + listColumns->takeItem( i ); + listColumns->insertItem( i, index ); + listColumns->setCurrentItem( i ); + readColumns(); + restoreFieldMap(); + currentColumnChanged( i ); +} + +void TableEditor::columnTextChanged( const TQString &s ) +{ + if ( listColumns->currentItem() == -1 ) + return; + listColumns->blockSignals( TRUE ); + listColumns->changeItem( s, listColumns->currentItem() ); + listColumns->blockSignals( FALSE ); +#ifndef TQT_NO_TABLE + if ( table->horizontalHeader()->iconSet( listColumns->currentItem() ) ) + table->horizontalHeader()->setLabel( listColumns->currentItem(), + *table->horizontalHeader()->iconSet( listColumns->currentItem() ), s ); + else + table->horizontalHeader()->setLabel( listColumns->currentItem(), s ); +#endif +} + +void TableEditor::columnUpClicked() +{ + if ( listColumns->currentItem() <= 0 || + listColumns->count() < 2 ) + return; + saveFieldMap(); + int index = listColumns->currentItem() - 1; + TQListBoxItem *i = listColumns->item( listColumns->currentItem() ); + listColumns->takeItem( i ); + listColumns->insertItem( i, index ); + listColumns->setCurrentItem( i ); + readColumns(); + restoreFieldMap(); + currentColumnChanged( i ); +} + +void TableEditor::currentColumnChanged( TQListBoxItem *i ) +{ + if ( !i ) + return; + editColumnText->blockSignals( TRUE ); + editColumnText->setText( i->text() ); + if ( i->pixmap() ) + labelColumnPixmap->setPixmap( *i->pixmap() ); + else + labelColumnPixmap->setText( "" ); + editColumnText->blockSignals( FALSE ); + +#ifndef TQT_NO_SQL + if ( ::tqqt_cast<TQDataTable*>(editTable) ) { + TQString s = *fieldMap.find( listColumns->index( i ) ); + if ( s.isEmpty() ) + comboFields->setCurrentItem( 0 ); + else if ( comboFields->listBox()->findItem( s ) ) + comboFields->setCurrentItem( comboFields->listBox()->index( comboFields->listBox()->findItem( s ) ) ); + else + comboFields->lineEdit()->setText( s ); + } +#endif +} + +void TableEditor::currentFieldChanged( const TQString &s ) +{ + if ( listColumns->currentItem() == -1 ) + return; + fieldMap.remove( listColumns->currentItem() ); + fieldMap.insert( listColumns->currentItem(), s ); + editColumnText->blockSignals( TRUE ); //## necessary + TQString newColText = s.mid(0,1).upper() + s.mid(1); + editColumnText->setText( newColText ); + columnTextChanged( newColText ); + editColumnText->blockSignals( FALSE ); +} + +void TableEditor::currentRowChanged( TQListBoxItem *i ) +{ + if ( !i ) + return; + editRowText->blockSignals( TRUE ); + editRowText->setText( i->text() ); + if ( i->pixmap() ) + labelRowPixmap->setPixmap( *i->pixmap() ); + else + labelRowPixmap->setText( "" ); + editRowText->blockSignals( FALSE ); +} + +void TableEditor::deleteColumnClicked() +{ + if ( listColumns->currentItem() == -1 ) + return; +#ifndef TQT_NO_TABLE + table->setNumCols( table->numCols() - 1 ); + delete listColumns->item( listColumns->currentItem() ); + readColumns(); + if ( listColumns->firstItem() ) { + listColumns->setCurrentItem( listColumns->firstItem() ); + listColumns->setSelected( listColumns->firstItem(), TRUE ); + } +#endif +} + +void TableEditor::deleteRowClicked() +{ + if ( listRows->currentItem() == -1 ) + return; +#ifndef TQT_NO_TABLE + table->setNumRows( table->numRows() - 1 ); + delete listRows->item( listRows->currentItem() ); + readRows(); + if ( listRows->firstItem() ) { + listRows->setCurrentItem( listRows->firstItem() ); + listRows->setSelected( listRows->firstItem(), TRUE ); + } +#endif +} + +void TableEditor::newColumnClicked() +{ +#ifndef TQT_NO_TABLE + table->setNumCols( table->numCols() + 1 ); + TQMap<TQString, bool> m; + for ( int i = 0; i < table->numCols() - 1; ++i ) + m.insert( table->horizontalHeader()->label( i ), TRUE ); + int n = table->numCols() - 1; + TQString t = TQString::number( n ); + while ( m.find( t ) != m.end() ) + t = TQString::number( ++n ); + table->horizontalHeader()->setLabel( table->numCols() - 1, t ); + listColumns->insertItem( t ); + TQListBoxItem *item = listColumns->item( listColumns->count() - 1 ); + listColumns->setCurrentItem( item ); + listColumns->setSelected( item, TRUE ); +#ifndef TQT_NO_SQL + if ( ::tqqt_cast<TQDataTable*>(editTable) ) { + comboFields->setFocus(); + } else +#endif + { + editColumnText->setFocus(); + editColumnText->selectAll(); + } +#endif +} + +void TableEditor::newRowClicked() +{ +#ifndef TQT_NO_TABLE + table->setNumRows( table->numRows() + 1 ); + TQMap<TQString, bool> m; + for ( int i = 0; i < table->numRows() - 1; ++i ) + m.insert( table->verticalHeader()->label( i ), TRUE ); + int n = table->numRows() - 1; + TQString t = TQString::number( n ); + while ( m.find( t ) != m.end() ) + t = TQString::number( ++n ); + table->verticalHeader()->setLabel( table->numRows() - 1, t ); + listRows->insertItem( t ); + TQListBoxItem *item = listRows->item( listRows->count() - 1 ); + listRows->setCurrentItem( item ); + listRows->setSelected( item, TRUE ); +#endif +} + +void TableEditor::okClicked() +{ + applyClicked(); + accept(); +} + +void TableEditor::rowDownClicked() +{ + if ( listRows->currentItem() == -1 || + listRows->currentItem() == (int)listRows->count() - 1 || + listRows->count() < 2 ) + return; + int index = listRows->currentItem() + 1; + TQListBoxItem *i = listRows->item( listRows->currentItem() ); + listRows->takeItem( i ); + listRows->insertItem( i, index ); + listRows->setCurrentItem( i ); + readRows(); +} + +void TableEditor::rowTextChanged( const TQString &s ) +{ + if ( listRows->currentItem() == -1 ) + return; +#ifndef TQT_NO_TABLE + listRows->changeItem( s, listRows->currentItem() ); + if ( table->verticalHeader()->iconSet( listRows->currentItem() ) ) + table->verticalHeader()->setLabel( listRows->currentItem(), + *table->verticalHeader()->iconSet( listRows->currentItem() ), s ); + else + table->verticalHeader()->setLabel( listRows->currentItem(), s ); +#endif +} + +void TableEditor::rowUpClicked() +{ + if ( listRows->currentItem() <= 0 || + listRows->count() < 2 ) + return; + int index = listRows->currentItem() - 1; + TQListBoxItem *i = listRows->item( listRows->currentItem() ); + listRows->takeItem( i ); + listRows->insertItem( i, index ); + listRows->setCurrentItem( i ); + readRows(); +} + +void TableEditor::applyClicked() +{ + TQValueList<PopulateTableCommand::Row> rows; + TQValueList<PopulateTableCommand::Column> cols; + + int i = 0; +#ifndef TQT_NO_TABLE + for ( i = 0; i < table->horizontalHeader()->count(); ++i ) { + PopulateTableCommand::Column col; + col.text = table->horizontalHeader()->label( i ); + if ( table->horizontalHeader()->iconSet( i ) ) + col.pix = table->horizontalHeader()->iconSet( i )->pixmap(); + col.field = *fieldMap.find( i ); + cols.append( col ); + } + for ( i = 0; i < table->verticalHeader()->count(); ++i ) { + PopulateTableCommand::Row row; + row.text = table->verticalHeader()->label( i ); + if ( table->verticalHeader()->iconSet( i ) ) + row.pix = table->verticalHeader()->iconSet( i )->pixmap(); + rows.append( row ); + } + PopulateTableCommand *cmd = new PopulateTableCommand( i18n( "Edit the Rows and Columns of '%1' " ).arg( editTable->name() ), + formWindow, editTable, rows, cols ); + cmd->execute(); + formWindow->commandHistory()->addCommand( cmd ); +#endif +} + +void TableEditor::chooseRowPixmapClicked() +{ + if ( listRows->currentItem() == -1 ) + return; + TQPixmap pix; + if ( listRows->item( listRows->currentItem() )->pixmap() ) + pix = qChoosePixmap( this, formWindow, *listRows->item( listRows->currentItem() )->pixmap() ); + else + pix = qChoosePixmap( this, formWindow, TQPixmap() ); + + if ( pix.isNull() ) + return; + +#ifndef TQT_NO_TABLE + table->verticalHeader()->setLabel( listRows->currentItem(), pix, table->verticalHeader()->label( listRows->currentItem() ) ); + listRows->changeItem( pix, listRows->currentText(), listRows->currentItem() ); +#endif +} + +void TableEditor::deleteRowPixmapClicked() +{ + if ( listRows->currentItem() == -1 ) + return; +#ifndef TQT_NO_TABLE + table->verticalHeader()->setLabel( listRows->currentItem(), TQPixmap(), table->verticalHeader()->label( listRows->currentItem() ) ); + listRows->changeItem( listRows->currentText(), listRows->currentItem() ); +#endif +} + +void TableEditor::chooseColPixmapClicked() +{ + if ( listColumns->currentItem() == -1 ) + return; + TQPixmap pix; + if ( listColumns->item( listColumns->currentItem() )->pixmap() ) + pix = qChoosePixmap( this, formWindow, *listColumns->item( listColumns->currentItem() )->pixmap() ); + else + pix = qChoosePixmap( this, formWindow, TQPixmap() ); + + if ( pix.isNull() ) + return; +#ifndef TQT_NO_TABLE + table->horizontalHeader()->setLabel( listColumns->currentItem(), pix, table->horizontalHeader()->label( listColumns->currentItem() ) ); + listColumns->changeItem( pix, listColumns->currentText(), listColumns->currentItem() ); +#endif +} + +void TableEditor::deleteColPixmapClicked() +{ + if ( listColumns->currentItem() == -1 ) + return; +#ifndef TQT_NO_TABLE + table->horizontalHeader()->setLabel( listColumns->currentItem(), TQPixmap(), table->horizontalHeader()->label( listColumns->currentItem() ) ); + listColumns->changeItem( listColumns->currentText(), listColumns->currentItem() ); +#endif +} + +void TableEditor::readFromTable() +{ +#ifndef TQT_NO_TABLE + TQHeader *cols = editTable->horizontalHeader(); + table->setNumCols( cols->count() ); + TQMap<TQString, TQString> columnFields = MetaDataBase::columnFields( TQT_TQOBJECT(editTable) ); + for ( int i = 0; i < cols->count(); ++i ) { + if ( editTable->horizontalHeader()->iconSet( i ) ) { + table->horizontalHeader()->setLabel( i, *editTable->horizontalHeader()->iconSet( i ), + editTable->horizontalHeader()->label( i ) ); + listColumns->insertItem( editTable->horizontalHeader()->iconSet( i )->pixmap(), + editTable->horizontalHeader()->label( i ) ); + } else { + table->horizontalHeader()->setLabel( i, editTable->horizontalHeader()->label( i ) ); + listColumns->insertItem( editTable->horizontalHeader()->label( i ) ); + } + TQString cf = *columnFields.find( editTable->horizontalHeader()->label( i ) ); + fieldMap.insert( i, cf ); + } + + if ( listColumns->firstItem() ) { + listColumns->setCurrentItem( listColumns->firstItem() ); + listColumns->setSelected( listColumns->firstItem(), TRUE ); + } + + TQHeader *rows = editTable->verticalHeader(); + table->setNumRows( rows->count() ); + for ( int j = 0; j < rows->count(); ++j ) { + if ( editTable->verticalHeader()->iconSet( j ) ) { + table->verticalHeader()->setLabel( j, *editTable->verticalHeader()->iconSet( j ), + editTable->verticalHeader()->label( j ) ); + listRows->insertItem( editTable->verticalHeader()->iconSet( j )->pixmap(), + editTable->verticalHeader()->label( j ) ); + } else { + table->verticalHeader()->setLabel( j, editTable->verticalHeader()->label( j ) ); + listRows->insertItem( editTable->verticalHeader()->label( j ) ); + } + } + + if ( listRows->firstItem() ) { + listRows->setCurrentItem( listRows->firstItem() ); + listRows->setSelected( listRows->firstItem(), TRUE ); + } +#endif +} + +void TableEditor::readColumns() +{ + int j = 0; +#ifndef TQT_NO_TABLE + for ( TQListBoxItem *i = listColumns->firstItem(); i; i = i->next(), ++j ) { + if ( i->pixmap() ) + table->horizontalHeader()->setLabel( j, *i->pixmap(), i->text() ); + else + table->horizontalHeader()->setLabel( j, i->text() ); + } +#endif +} + +void TableEditor::readRows() +{ + int j = 0; +#ifndef TQT_NO_TABLE + for ( TQListBoxItem *i = listRows->firstItem(); i; i = i->next(), ++j ) { + if ( i->pixmap() ) + table->verticalHeader()->setLabel( j, *i->pixmap(), i->text() ); + else + table->verticalHeader()->setLabel( j, i->text() ); + } +#endif +} + +void TableEditor::saveFieldMap() +{ + tmpFieldMap.clear(); + for ( TQMap<int, TQString>::Iterator it = fieldMap.begin(); it != fieldMap.end(); ++it ) + tmpFieldMap.insert( listColumns->item( it.key() ), *it ); +} + +void TableEditor::restoreFieldMap() +{ + fieldMap.clear(); + for ( TQMap<TQListBoxItem*, TQString>::Iterator it = tmpFieldMap.begin(); it != tmpFieldMap.end(); ++it ) + fieldMap.insert( listColumns->index( it.key() ), *it ); +} diff --git a/kdevdesigner/designer/tableeditorimpl.h b/kdevdesigner/designer/tableeditorimpl.h new file mode 100644 index 00000000..7729f33e --- /dev/null +++ b/kdevdesigner/designer/tableeditorimpl.h @@ -0,0 +1,83 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef TABLEEDITORIMPL_H +#define TABLEEDITORIMPL_H + +#include "tableeditor.h" +#include <tqmap.h> + +class TQListBoxItem; +class TQTable; +class FormWindow; + +class TableEditor : public TableEditorBase +{ + Q_OBJECT + + +public: + TableEditor( TQWidget* parent = 0, TQWidget *editWidget = 0, FormWindow *fw = 0, + const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~TableEditor(); + +protected slots: + void columnDownClicked(); + void columnTextChanged( const TQString & ); + void columnUpClicked(); + void currentColumnChanged( TQListBoxItem * ); + void currentFieldChanged( const TQString & ); + void currentRowChanged( TQListBoxItem * ); + void deleteColumnClicked(); + void deleteRowClicked(); + void newColumnClicked(); + void newRowClicked(); + void okClicked(); + void rowDownClicked(); + void rowTextChanged( const TQString & ); + void rowUpClicked(); + void applyClicked(); + void chooseRowPixmapClicked(); + void deleteRowPixmapClicked(); + void chooseColPixmapClicked(); + void deleteColPixmapClicked(); + +private: + void readFromTable(); + void readColumns(); + void readRows(); + void saveFieldMap(); + void restoreFieldMap(); + +private: + TQTable *editTable; + FormWindow *formWindow; + TQMap<int, TQString> fieldMap; + TQMap<TQListBoxItem*, TQString> tmpFieldMap; + +}; + +#endif // TABLEEDITOR_H diff --git a/kdevdesigner/designer/timestamp.cpp b/kdevdesigner/designer/timestamp.cpp new file mode 100644 index 00000000..553d9e3f --- /dev/null +++ b/kdevdesigner/designer/timestamp.cpp @@ -0,0 +1,86 @@ + /********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "timestamp.h" +#include <tqfile.h> +#include <tqfileinfo.h> + +class TQTimer; + +TimeStamp::TimeStamp( TQObject *parent, const TQString &f ) + : TQObject( parent ), filename( f ), autoCheck( FALSE ) +{ + timer = new TQTimer( this ); + connect( timer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( autoCheckTimeStamp() ) ); + update(); +} + +void TimeStamp::setFileName( const TQString &f ) +{ + filename = f; + update(); +} + +TQString TimeStamp::fileName() const +{ + return filename; +} + +void TimeStamp::setAutoCheckEnabled( bool a ) +{ + autoCheck = a; + if ( autoCheck ) + timer->start( 5000 ); + else + timer->stop(); +} + +void TimeStamp::update() +{ + TQFile f( filename ); + if ( !f.exists() ) + return; + lastTimeStamp = TQFileInfo( f ).lastModified(); +} + +bool TimeStamp::isUpToDate() const +{ + TQFile f( filename ); + if ( !f.exists() ) + return TRUE; + return lastTimeStamp == TQFileInfo( f ).lastModified(); +} + +bool TimeStamp::isAutoCheckEnabled() const +{ + return autoCheck; +} + +void TimeStamp::autoCheckTimeStamp() +{ + if ( !isUpToDate() ) + emit timeStampChanged(); +} diff --git a/kdevdesigner/designer/timestamp.h b/kdevdesigner/designer/timestamp.h new file mode 100644 index 00000000..078a925d --- /dev/null +++ b/kdevdesigner/designer/timestamp.h @@ -0,0 +1,64 @@ + /********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef TIMESTAMP_H +#define TIMESTAMP_H + +#include <tqobject.h> +#include <tqdatetime.h> +#include <tqtimer.h> + +class TimeStamp : public TQObject +{ + Q_OBJECT + + +public: + TimeStamp( TQObject *parent, const TQString &f ); + + void setFileName( const TQString &f ); + TQString fileName() const; + void setAutoCheckEnabled( bool a ); + void update(); + + bool isUpToDate() const; + bool isAutoCheckEnabled() const; + +signals: + void timeStampChanged(); + +private slots: + void autoCheckTimeStamp(); + +private: + TQDateTime lastTimeStamp; + TQString filename; + bool autoCheck; + TQTimer *timer; + +}; + +#endif diff --git a/kdevdesigner/designer/variabledialog.ui b/kdevdesigner/designer/variabledialog.ui new file mode 100644 index 00000000..b5971ce9 --- /dev/null +++ b/kdevdesigner/designer/variabledialog.ui @@ -0,0 +1,294 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>VariableDialogBase</class> +<comment>********************************************************************* +** Copyright (C) 2002 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>VariableDialogBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>276</width> + <height>320</height> + </rect> + </property> + <property name="caption"> + <string>Edit Variables</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQListView" row="0" column="0" rowspan="1" colspan="4"> + <column> + <property name="text"> + <string>Variable</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Access</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>varView</cstring> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>LastColumn</enum> + </property> + </widget> + <widget class="TQPushButton" row="1" column="3"> + <property name="name"> + <cstring>deleteButton</cstring> + </property> + <property name="text"> + <string>&Delete</string> + </property> + </widget> + <widget class="TQGroupBox" row="2" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>propBox</cstring> + </property> + <property name="title"> + <string>Variable Properties</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLabel" row="1" column="0"> + <property name="name"> + <cstring>TextLabel2</cstring> + </property> + <property name="text"> + <string>Acc&ess:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>accessCombo</cstring> + </property> + </widget> + <widget class="TQLabel" row="0" column="0"> + <property name="name"> + <cstring>TextLabel1</cstring> + </property> + <property name="text"> + <string>&Variable:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>varName</cstring> + </property> + </widget> + <widget class="KLineEdit" row="0" column="1"> + <property name="name"> + <cstring>varName</cstring> + </property> + </widget> + <widget class="TQComboBox" row="1" column="1"> + <item> + <property name="text"> + <string>public</string> + </property> + </item> + <item> + <property name="text"> + <string>protected</string> + </property> + </item> + <item> + <property name="text"> + <string>private</string> + </property> + </item> + <property name="name"> + <cstring>accessCombo</cstring> + </property> + </widget> + </grid> + </widget> + <widget class="TQPushButton" row="1" column="2"> + <property name="name"> + <cstring>addButton</cstring> + </property> + <property name="text"> + <string>&Add</string> + </property> + </widget> + <spacer row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="TQPushButton" row="3" column="3"> + <property name="name"> + <cstring>cancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="TQPushButton" row="3" column="1" rowspan="1" colspan="2"> + <property name="name"> + <cstring>okButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + </widget> + <spacer row="3" column="0"> + <property name="name"> + <cstring>Spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>21</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>cancelButton</sender> + <signal>clicked()</signal> + <receiver>VariableDialogBase</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>addButton</sender> + <signal>clicked()</signal> + <receiver>VariableDialogBase</receiver> + <slot>addVariable()</slot> + </connection> + <connection> + <sender>okButton</sender> + <signal>clicked()</signal> + <receiver>VariableDialogBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>varName</sender> + <signal>textChanged(const TQString&)</signal> + <receiver>VariableDialogBase</receiver> + <slot>nameChanged()</slot> + </connection> + <connection> + <sender>deleteButton</sender> + <signal>clicked()</signal> + <receiver>VariableDialogBase</receiver> + <slot>deleteVariable()</slot> + </connection> + <connection> + <sender>accessCombo</sender> + <signal>activated(int)</signal> + <receiver>VariableDialogBase</receiver> + <slot>accessChanged()</slot> + </connection> + <connection> + <sender>varView</sender> + <signal>currentChanged(TQListViewItem*)</signal> + <receiver>VariableDialogBase</receiver> + <slot>currentItemChanged(TQListViewItem*)</slot> + </connection> + <connection> + <sender>varView</sender> + <signal>selectionChanged(TQListViewItem*)</signal> + <receiver>VariableDialogBase</receiver> + <slot>currentItemChanged(TQListViewItem*)</slot> + </connection> +</connections> +<tabstops> + <tabstop>varView</tabstop> + <tabstop>addButton</tabstop> + <tabstop>deleteButton</tabstop> + <tabstop>varName</tabstop> + <tabstop>accessCombo</tabstop> + <tabstop>okButton</tabstop> + <tabstop>cancelButton</tabstop> +</tabstops> +<Q_SLOTS> + <slot>addVariable()</slot> + <slot>deleteVariable()</slot> + <slot>accessChanged()</slot> + <slot>nameChanged()</slot> + <slot>okClicked()</slot> + <slot>currentItemChanged( TQListViewItem * i )</slot> +</Q_SLOTS> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/variabledialogimpl.cpp b/kdevdesigner/designer/variabledialogimpl.cpp new file mode 100644 index 00000000..d2d7ef67 --- /dev/null +++ b/kdevdesigner/designer/variabledialogimpl.cpp @@ -0,0 +1,180 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqlistview.h> +#include <tqgroupbox.h> +#include <klineedit.h> +#include <tqcombobox.h> +#include <tqmessagebox.h> + +#include "metadatabase.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "hierarchyview.h" +#include "command.h" +#include "variabledialogimpl.h" + +#include <tdelocale.h> + + +VariableDialog::VariableDialog( FormWindow *fw, TQWidget *parent ) + : VariableDialogBase( parent ), formWindow( fw ) +{ + varView->setSorting( -1 ); + TQValueList<MetaDataBase::Variable> varLst = MetaDataBase::variables( TQT_TQOBJECT(formWindow) ); + TQValueList<MetaDataBase::Variable>::Iterator it = varLst.begin(); + for ( ; it != varLst.end(); ++it ) { + TQListViewItem *i = new TQListViewItem( varView ); + i->setText( 0, (*it).varName ); + i->setText( 1, (*it).varAccess ); + } + + if ( varView->firstChild() ) + varView->setCurrentItem( varView->firstChild() ); + else + propBox->setEnabled( FALSE ); +} + +VariableDialog::~VariableDialog() +{ +} + +void VariableDialog::setCurrentItem( TQString text ) +{ + TQListViewItem *i = varView->findItem( text, 0 ); + if ( i ) + varView->setCurrentItem( i ); +} + +void VariableDialog::okClicked() +{ + TQValueList<MetaDataBase::Variable> lst; + + TQListViewItemIterator it( varView ); + while ( it.current() != 0 ) { + MetaDataBase::Variable v; + v.varName = it.current()->text( 0 ).simplifyWhiteSpace(); + if ( v.varName[ (int)v.varName.length() - 1 ] != ';' ) + v.varName += ";"; + v.varAccess = it.current()->text( 1 ); + lst << v; + ++it; + } + + if ( !lst.isEmpty() ) { + TQValueList<MetaDataBase::Variable> invalidLst; + TQValueList<MetaDataBase::Variable>::Iterator it1 = lst.begin(); + TQValueList<MetaDataBase::Variable>::Iterator it2; + for ( ; it1 != lst.end(); ++it1 ) { + it2 = it1; + ++it2; + for ( ; it2 != lst.end(); ++it2 ) { + if ( MetaDataBase::extractVariableName( (*it1).varName ) == + MetaDataBase::extractVariableName( (*it2).varName ) ) { + invalidLst << (*it1); + break; + } + } + } + if ( !invalidLst.isEmpty() ) { + if ( TQMessageBox::information( this, i18n( "Edit Variables" ), + i18n( "One variable has been declared twice.\n" + "Remove this variable?" ), i18n( "&Yes" ), i18n( "&No" ) ) == 0 ) { + for ( it2 = invalidLst.begin(); it2 != invalidLst.end(); ++it2 ) { + it = varView->firstChild(); + while ( it.current() != 0 ) { + if ( MetaDataBase::extractVariableName( (*it)->text( 0 ).simplifyWhiteSpace() ) == + MetaDataBase::extractVariableName( (*it2).varName ) ) { + delete (*it); + break; + } + ++it; + } + } + } + formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView(); + return; + } + } + Command *cmd = new SetVariablesCommand( i18n( "Edit Variables" ), formWindow, lst ); + formWindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + accept(); +} + +void VariableDialog::addVariable() +{ + TQListViewItem *i = new TQListViewItem( varView, varView->lastItem() ); + i->setText( 0, "int newVariable" ); + i->setText( 1, "protected" ); + varView->setCurrentItem( i ); + varView->setSelected( i, TRUE ); + varName->setFocus(); + varName->selectAll(); +} + +void VariableDialog::deleteVariable() +{ + TQListViewItem *i = varView->selectedItem(); + if ( !i ) + return; + delete i; + i = 0; + if ( varView->firstChild() ) + varView->setSelected( varView->firstChild(), TRUE ); +} + +void VariableDialog::currentItemChanged( TQListViewItem *i ) +{ + if ( !i ) { + varName->clear(); + accessCombo->setCurrentItem( 1 ); + propBox->setEnabled( FALSE ); + return; + } + varName->setText( i->text( 0 ) ); + if ( i->text( 1 ) == "public" ) + accessCombo->setCurrentItem( 0 ); + else if ( i->text( 1 ) == "protected" ) + accessCombo->setCurrentItem( 1 ); + else + accessCombo->setCurrentItem( 2 ); + propBox->setEnabled( TRUE ); +} + +void VariableDialog::nameChanged() +{ + if ( !varView->currentItem() ) + return; + varView->currentItem()->setText( 0, varName->text() ); +} + +void VariableDialog::accessChanged() +{ + if ( !varView->currentItem() ) + return; + varView->currentItem()->setText( 1, accessCombo->currentText() ); +} diff --git a/kdevdesigner/designer/variabledialogimpl.h b/kdevdesigner/designer/variabledialogimpl.h new file mode 100644 index 00000000..65295073 --- /dev/null +++ b/kdevdesigner/designer/variabledialogimpl.h @@ -0,0 +1,57 @@ +/********************************************************************** +** Copyright (C) 2000-2001 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef VARIABLEDIALOGIMPL_H +#define VARIABLEDIALOGIMPL_H + +#include "variabledialog.h" + +class FormWindow; +class TQListView; + +class VariableDialog : public VariableDialogBase +{ + Q_OBJECT + +public: + VariableDialog( FormWindow *fw, TQWidget* parent = 0 ); + ~VariableDialog(); + + void setCurrentItem( TQString text ); + +protected slots: + void okClicked(); + void addVariable(); + void deleteVariable(); + void nameChanged(); + void accessChanged(); + void currentItemChanged( TQListViewItem *i ); + +private: + FormWindow *formWindow; +}; + +#endif diff --git a/kdevdesigner/designer/widgetaction.cpp b/kdevdesigner/designer/widgetaction.cpp new file mode 100644 index 00000000..c2ce0721 --- /dev/null +++ b/kdevdesigner/designer/widgetaction.cpp @@ -0,0 +1,58 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "widgetaction.h" +#include <tqwidget.h> +#include <tqtoolbutton.h> +#include "mainwindow.h" +#include <tqstylefactory.h> +#include <tqstyle.h> + +static TQStyle *windowsStyle = 0; + +void WidgetAction::addedTo( TQWidget *w, TQWidget *container ) +{ + if ( ::tqqt_cast<TQToolButton*>(w) && ::tqqt_cast<TQScrollView*>(container->parent()->parent()) ) { + if ( !windowsStyle ) + windowsStyle = TQStyleFactory::create( "windows" ); + w->setStyle( windowsStyle ); + ( (TQToolButton*)w )->setUsesTextLabel( TRUE ); + ( (TQToolButton*)w )->setTextPosition( TQToolButton::Right ); + w->setBackgroundMode( container->backgroundMode() ); + } +} + +WidgetAction::~WidgetAction() +{ + if ( MainWindow::self ) + MainWindow::self->toolActions.removeRef( this ); +} + +void WidgetAction::init( const TQString &g ) +{ + MainWindow::self->toolActions.append( this ); + grp = g; +} diff --git a/kdevdesigner/designer/widgetaction.h b/kdevdesigner/designer/widgetaction.h new file mode 100644 index 00000000..161bc8a0 --- /dev/null +++ b/kdevdesigner/designer/widgetaction.h @@ -0,0 +1,66 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WIDGETACTION_H +#define WIDGETACTION_H + +#include <tqaction.h> + +class WidgetAction : public TQAction +{ + Q_OBJECT + + +public: + WidgetAction( const TQString &grp, TQObject* parent, + const char* name = 0, bool toggle = FALSE ) + : TQAction( parent, name, toggle ) { init( grp ); } + WidgetAction( const TQString &grp, const TQString& text, + const TQIconSet& icon, const TQString& menuText, TQKeySequence accel, + TQObject* parent, const char* name = 0, bool toggle = FALSE ) + : TQAction( text, icon, menuText, accel, parent, name, toggle ) { init( grp ); } + WidgetAction( const TQString &grp, const TQString& text, + const TQString& menuText, TQKeySequence accel, TQObject* parent, + const char* name = 0, bool toggle = FALSE ) + : TQAction( text, menuText, accel, parent, name, toggle ) { init( grp ); } + ~WidgetAction(); + +#if !defined(TQ_NO_USING_KEYWORD) + using TQAction::addedTo; +#endif + void addedTo( TQWidget *, TQWidget * ); + + TQString group() const { return grp; } + +private: + void init( const TQString &g ); + +private: + TQString grp; + +}; + +#endif diff --git a/kdevdesigner/designer/widgetfactory.cpp b/kdevdesigner/designer/widgetfactory.cpp new file mode 100644 index 00000000..9d04535a --- /dev/null +++ b/kdevdesigner/designer/widgetfactory.cpp @@ -0,0 +1,1805 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler need this here +#include "widgetfactory.h" +#include <widgetdatabase.h> +#include "metadatabase.h" +#include "mainwindow.h" +#include "formwindow.h" +#include "propertyeditor.h" +#include "tqlayout.h" +#include "listboxeditorimpl.h" +#include "listvieweditorimpl.h" +#include "iconvieweditorimpl.h" +#include "formwindow.h" +#include "multilineeditorimpl.h" +#include "../interfaces/widgetinterface.h" +#ifndef TQT_NO_TABLE +#include "tableeditorimpl.h" +#endif +#include "project.h" +#include "menubareditor.h" +#include "popupmenueditor.h" + +#include "kdevdesigner_part.h" + +#include <kiconloader.h> + +#include <tqfeatures.h> + +#include <tqpixmap.h> +#include <tqgroupbox.h> +#include <tqiconview.h> +#ifndef TQT_NO_TABLE +#include <tqtable.h> +#endif +#ifndef TQT_NO_SQL +#include <tqdatatable.h> +#endif +#include <tqdatetimeedit.h> +#include <tqlineedit.h> +#include <tqspinbox.h> +#include <tqmultilineedit.h> +#include <tqtextedit.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqwidgetstack.h> +#include <tqcombobox.h> +#include <tqtabbar.h> +#include <tqlistbox.h> +#include <tqlistview.h> +#include <tqobjectlist.h> +#include <tqlcdnumber.h> +#include <tqslider.h> +#include <tqdial.h> +#include <tqprogressbar.h> +#include <tqtextview.h> +#include <tqtextbrowser.h> +#include <tqframe.h> +#include <tqmetaobject.h> +#include <tqwidgetstack.h> +#include <tqwizard.h> +#include <tqvaluelist.h> +#include <tqtimer.h> +#include <tqscrollbar.h> +#include <tqmainwindow.h> +#include <tqmenubar.h> +#include <tqapplication.h> +#include <tqsplitter.h> +#include <tqtoolbox.h> +#include <tqsizegrip.h> +#ifndef TQT_NO_SQL +#include "database.h" +#endif + +#define NO_STATIC_COLORS +#include <globaldefs.h> +#include <tqobject.h> + +#include <tdelocale.h> + +FormWindow *find_formwindow( TQWidget *w ) +{ + if ( !w ) + return 0; + for (;;) { + if ( ::tqqt_cast<FormWindow*>(w) ) + return (FormWindow*)w; + if ( !w->parentWidget() ) + return 0; + w = w->parentWidget(); + } +} + +void TQLayoutWidget::paintEvent( TQPaintEvent* ) +{ + TQPainter p ( this ); + p.setPen( red ); + p.drawRect( rect() ); +} + + +QDesignerTabWidget::QDesignerTabWidget( TQWidget *parent, const char *name ) + : TQTabWidget( parent, name ), dropIndicator( 0 ), dragPage( 0 ), mousePressed( FALSE ) +{ + tabBar()->setAcceptDrops( TRUE ); + tabBar()->installEventFilter( this ); +} + +int QDesignerTabWidget::currentPage() const +{ + return tabBar()->currentTab(); +} + +void QDesignerTabWidget::setCurrentPage( int i ) +{ + tabBar()->setCurrentTab( i ); +} + +TQString QDesignerTabWidget::pageTitle() const +{ + return ((TQTabWidget*)this)->tabLabel( TQTabWidget::currentPage() ); +} + +void QDesignerTabWidget::setPageTitle( const TQString& title ) +{ + changeTab( TQTabWidget::currentPage(), title ); +} + +void QDesignerTabWidget::setPageName( const TQCString& name ) +{ + if ( TQTabWidget::currentPage() ) + TQTabWidget::currentPage()->setName( name ); +} + +TQCString QDesignerTabWidget::pageName() const +{ + if ( !TQTabWidget::currentPage() ) + return 0; + return TQTabWidget::currentPage()->name(); +} + +int QDesignerTabWidget::count() const +{ + return tabBar()->count(); +} + +bool QDesignerTabWidget::eventFilter( TQObject *o, TQEvent *e ) +{ + if ( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(tabBar()) ) return FALSE; + + switch ( e->type() ) { + case TQEvent::MouseButtonPress: { + mousePressed = TRUE; + TQMouseEvent *me = (TQMouseEvent*)e; + pressPoint = me->pos(); + } + break; + case TQEvent::MouseMove: { + TQMouseEvent *me = (TQMouseEvent*)e; + if ( mousePressed && ( pressPoint - me->pos()).manhattanLength() > TQApplication::startDragDistance() ) { + TQTextDrag *drg = new TQTextDrag( TQString::number( (long) this ) , this ); + mousePressed = FALSE; + dragPage = TQTabWidget::currentPage(); + dragLabel = TQTabWidget::tabLabel( dragPage ); + + int index = indexOf( dragPage ); + + removePage( dragPage ); + if ( !drg->dragMove() ) { + insertTab( dragPage, dragLabel, index ); + showPage( dragPage ); + } + if ( dropIndicator ) + dropIndicator->hide(); + } + } + break; + case TQEvent::DragLeave: { + if ( dropIndicator ) + dropIndicator->hide(); + } + break; + case TQEvent::DragMove: { + TQDragEnterEvent *de = (TQDragEnterEvent*) e; + if ( TQTextDrag::canDecode( de ) ) { + TQString text; + TQTextDrag::decode( de, text ); + if ( text == TQString::number( (long)this ) ) + de->accept(); + else + return FALSE; + } + + int index = 0; + TQRect rect; + for ( ; index < tabBar()->count(); index++ ) { + if ( tabBar()->tabAt( index )->rect().contains( de->pos() ) ) { + rect = tabBar()->tabAt( index )->rect(); + break; + } + } + + if ( index == tabBar()->count() -1 ) { + TQRect rect2 = rect; + rect2.setLeft( rect2.left() + rect2.width() / 2 ); + if ( rect2.contains( de->pos() ) ) + index++; + } + + if ( ! dropIndicator ) { + dropIndicator = new TQWidget( this ); + dropIndicator->setBackgroundColor( red ); + } + + TQPoint pos; + if ( index == tabBar()->count() ) + pos = tabBar()->mapToParent( TQPoint( rect.x() + rect.width(), rect.y() ) ); + else + pos = tabBar()->mapToParent( TQPoint( rect.x(), rect.y() ) ); + + dropIndicator->setGeometry( pos.x(), pos.y() , 3, rect.height() ); + dropIndicator->show(); + } + break; + case TQEvent::Drop: { + TQDragEnterEvent *de = (TQDragEnterEvent*) e; + if ( TQTextDrag::canDecode( de ) ) { + TQString text; + TQTextDrag::decode( de, text ); + if ( text == TQString::number( (long)this ) ) { + + int newIndex = 0; + for ( ; newIndex < tabBar()->count(); newIndex++ ) { + if ( tabBar()->tabAt( newIndex )->rect().contains( de->pos() ) ) + break; + } + + if ( newIndex == tabBar()->count() -1 ) { + TQRect rect2 = tabBar()->tabAt( newIndex )->rect(); + rect2.setLeft( rect2.left() + rect2.width() / 2 ); + if ( rect2.contains( de->pos() ) ) + newIndex++; + } + + int oldIndex = 0; + for ( ; oldIndex < tabBar()->count(); oldIndex++ ) { + if ( tabBar()->tabAt( oldIndex )->rect().contains( pressPoint ) ) + break; + } + + FormWindow *fw = find_formwindow( this ); + MoveTabPageCommand *cmd = + new MoveTabPageCommand( i18n( "Move Tab Page" ), fw, this, + dragPage, dragLabel, newIndex, oldIndex ); + fw->commandHistory()->addCommand( cmd ); + cmd->execute(); + de->accept(); + } + } + } + break; + default: + break; + } + return FALSE; +} + + +QDesignerWidgetStack::QDesignerWidgetStack( TQWidget *parent, const char *name ) + : TQWidgetStack( parent, name ) +{ + prev = new TQToolButton( TQt::LeftArrow, this, "designer_wizardstack_button" ); + prev->setAutoRaise( TRUE ); + prev->setAutoRepeat( TRUE ); + prev->setSizePolicy( TQSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::Ignored ) ); + next = new TQToolButton( TQt::RightArrow, this, "designer_wizardstack_button" ); + next->setAutoRaise( TRUE ); + next->setAutoRepeat( TRUE ); + next->setSizePolicy( TQSizePolicy( TQSizePolicy::Ignored, TQSizePolicy::Ignored ) ); + connect( prev, TQT_SIGNAL( clicked() ), this, TQT_SLOT( prevPage() ) ); + connect( next, TQT_SIGNAL( clicked() ), this, TQT_SLOT( nextPage() ) ); + updateButtons(); +} + +void QDesignerWidgetStack::updateButtons() +{ + prev->setGeometry( width() - 31, 1, 15, 15 ); + next->setGeometry( width() - 16, 1, 15, 15 ); + prev->show(); + next->show(); + prev->raise(); + next->raise(); +} + +void QDesignerWidgetStack::prevPage() +{ + setCurrentPage( currentPage() - 1 ); +} + +void QDesignerWidgetStack::nextPage() +{ + setCurrentPage( currentPage() + 1 ); +} + +int QDesignerWidgetStack::currentPage() const +{ + QDesignerWidgetStack* that = (QDesignerWidgetStack*) this; + return that->pages.find( visibleWidget() ); +} + +void QDesignerWidgetStack::setCurrentPage( int i ) +{ + // help next/prev page commands + if ( i < 0 ) + i += count(); + if ( i >= count() ) + i -= count(); + + if ( i < 0 || i >= count() ) + return; + raiseWidget( pages.at( i ) ); + updateButtons(); +} + +TQCString QDesignerWidgetStack::pageName() const +{ + if ( !visibleWidget() ) + return 0; + return visibleWidget()->name(); +} + +void QDesignerWidgetStack::setPageName( const TQCString& name ) +{ + if ( visibleWidget() ) + visibleWidget()->setName( name ); +} + +int QDesignerWidgetStack::count() const +{ + return pages.count(); +} + +TQWidget* QDesignerWidgetStack::page( int i ) const +{ + if ( i < 0 || i >= count() ) + return 0; + QDesignerWidgetStack* that = (QDesignerWidgetStack*) this; + return that->pages.at( i ); +} + + +int QDesignerWidgetStack::insertPage( TQWidget *p, int i ) +{ + if ( i < 0 ) + pages.append( p ); + else + pages.insert( (uint) i, p ); + addWidget( p ); + p->show(); + raiseWidget( p ); + TQApplication::sendPostedEvents(); + updateButtons(); + return pages.find( p ); +} + +int QDesignerWidgetStack::removePage( TQWidget *p ) +{ + int i = pages.find( p ); + pages.remove( p ); + removeWidget( p ); + setCurrentPage( 0 ); + updateButtons(); + return i; +} + + +int QDesignerWizard::currentPageNum() const +{ + for ( int i = 0; i < pageCount(); ++i ) { + if ( page( i ) == currentPage() ) + return i; + } + return 0; +} + + + + + +void QDesignerWizard::setCurrentPage( int i ) +{ + if ( i < currentPageNum() ) { + while ( i < currentPageNum() ) { + if ( currentPageNum() == 0 ) + break; + back(); + } + + } else { + while ( i > currentPageNum() ) { + if ( currentPageNum() == pageCount() - 1 ) + break; + next(); + } + } +} + +TQString QDesignerWizard::pageTitle() const +{ + return title( currentPage() ); +} + +void QDesignerWizard::setPageTitle( const TQString& title ) +{ + setTitle( currentPage(), title ); +} + +void QDesignerWizard::setPageName( const TQCString& name ) +{ + if ( TQWizard::currentPage() ) + TQWizard::currentPage()->setName( name ); +} + +TQCString QDesignerWizard::pageName() const +{ + if ( !TQWizard::currentPage() ) + return 0; + return TQWizard::currentPage()->name(); +} + +int QDesignerWizard::pageNum( TQWidget *p ) +{ + for ( int i = 0; i < pageCount(); ++i ) { + if ( page( i ) == p ) + return i; + } + return -1; +} + +void QDesignerWizard::addPage( TQWidget *p, const TQString &t ) +{ + TQWizard::addPage( p, t ); + if ( removedPages.find( p ) ) + removedPages.remove( p ); +} + +void QDesignerWizard::removePage( TQWidget *p ) +{ + TQWizard::removePage( p ); + removedPages.insert( p, p ); +} + +void QDesignerWizard::insertPage( TQWidget *p, const TQString &t, int index ) +{ + TQWizard::insertPage( p, t, index ); + if ( removedPages.find( p ) ) + removedPages.remove( p ); +} + +TQMap< int, TQMap< TQString, TQVariant> > *defaultProperties = 0; +TQMap< int, TQStringList > *changedProperties = 0; + +/*! + \class WidgetFactory widgetfactory.h + \brief Set of static functions for creating widgets, layouts and do other stuff + + The widget factory offers functions to create widgets, create and + delete layouts find out other details - all based on the + WidgetDatabase's data. So the functions that use ids use the same + ids as in the WidgetDatabase. +*/ + + +void WidgetFactory::saveDefaultProperties( TQObject *w, int id ) +{ + TQMap< TQString, TQVariant> propMap; + TQStrList lst = w->metaObject()->propertyNames( TRUE ); + for ( uint i = 0; i < lst.count(); ++i ) { + TQVariant var = w->property( lst.at( i ) ); + if ( !var.isValid() && qstrcmp( "pixmap", lst.at( i ) ) == 0 ) + var = TQVariant( TQPixmap() ); + else if ( !var.isValid() && qstrcmp( "iconSet", lst.at( i ) ) == 0 ) + var = TQVariant( TQIconSet() ); + propMap.replace( lst.at( i ), var ); + } + defaultProperties->replace( id, propMap ); +} + +void WidgetFactory::saveChangedProperties( TQObject *w, int id ) +{ + TQStringList l = MetaDataBase::changedProperties( w ); + changedProperties->insert( id, l ); +} + +/*! Creates a widget of the type which is registered as \a id as + child of \a parent. The \a name is optional. If \a init is TRUE, the + widget is initialized with some defaults, else the plain widget is + created. +*/ + +TQWidget *WidgetFactory::create( int id, TQWidget *parent, const char *name, bool init, const TQRect *r, Qt::Orientation orient ) +{ + TQString n = WidgetDatabase::className( id ); + if ( n.isEmpty() ) + return 0; + + if ( !defaultProperties ) { + defaultProperties = new TQMap< int, TQMap< TQString, TQVariant> >(); + changedProperties = new TQMap< int, TQStringList >(); + } + + TQWidget *w = 0; + TQString str = WidgetDatabase::createWidgetName( id ); + const char *s = str.latin1(); + w = createWidget( n, parent, name ? name : s, init, r, orient ); + if ( ::tqqt_cast<TQScrollView*>(w) ) + ( (TQScrollView*)w )->disableSizeHintCaching(); + if ( !w && WidgetDatabase::isCustomWidget( id ) ) + w = createCustomWidget( parent, name ? name : s, MetaDataBase::customWidget( id ) ); + if ( !w ) + return 0; + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + + if ( !defaultProperties->contains( id ) ) + saveDefaultProperties( TQT_TQOBJECT(w), id ); + if ( !changedProperties->contains( id ) ) + saveChangedProperties( TQT_TQOBJECT(w), id ); + + return w; +} + +/*! Creates a layout on the widget \a widget of the type \a type + which can be \c HBox, \c VBox or \c Grid. +*/ + +TQLayout *WidgetFactory::createLayout( TQWidget *widget, TQLayout *layout, LayoutType type ) +{ + int spacing = MainWindow::self->currentLayoutDefaultSpacing(); + int margin = 0; + + int metaspacing = MetaDataBase::spacing( TQT_TQOBJECT(widget) ); + int metamargin = MetaDataBase::margin( TQT_TQOBJECT(widget) ); + + if ( ::tqqt_cast<TQLayoutWidget*>(widget) && + ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(widget) ) ) ) || + widget && ::tqqt_cast<FormWindow*>(widget->parentWidget()) ) ) + margin = MainWindow::self->currentLayoutDefaultMargin(); + + if ( !layout && ::tqqt_cast<TQTabWidget*>(widget) ) + widget = ((TQTabWidget*)widget)->currentPage(); + + if ( !layout && ::tqqt_cast<TQWizard*>(widget) ) + widget = ((TQWizard*)widget)->currentPage(); + + if ( !layout && ::tqqt_cast<TQMainWindow*>(widget) ) + widget = ((TQMainWindow*)widget)->centralWidget(); + + if ( !layout && ::tqqt_cast<TQWidgetStack*>(widget) ) + widget = ((TQWidgetStack*)widget)->visibleWidget(); + + if ( !layout && ::tqqt_cast<TQToolBox*>(widget) ) + widget = ((TQToolBox*)widget)->currentItem(); + + MetaDataBase::addEntry( TQT_TQOBJECT(widget) ); + + TQLayout *l = 0; + int align = 0; + if ( !layout && ::tqqt_cast<TQGroupBox*>(widget) ) { + TQGroupBox *gb = (TQGroupBox*)widget; + gb->setColumnLayout( 0, Qt::Vertical ); + layout = gb->layout(); + layout->setMargin( 0 ); + layout->setSpacing( 0 ); + switch ( type ) { + case HBox: + l = new TQHBoxLayout( layout ); + break; + case VBox: + l = new TQVBoxLayout( layout ); + break; + case Grid: + l = new QDesignerGridLayout( layout ); + break; + default: + return 0; + } + align = TQt::AlignTop; + MetaDataBase::setMargin( TQT_TQOBJECT(gb), metamargin ); + MetaDataBase::setSpacing( TQT_TQOBJECT(gb), metaspacing ); + } else { + if ( layout ) { + switch ( type ) { + case HBox: + l = new TQHBoxLayout( layout ); + break; + case VBox: + l = new TQVBoxLayout( layout ); + break; + case Grid: + l = new QDesignerGridLayout( layout ); + break; + default: + return 0; + } + MetaDataBase::addEntry( TQT_TQOBJECT(l) ); + l->setSpacing( spacing ); + l->setMargin( margin ); + } else { + switch ( type ) { + case HBox: + l = new TQHBoxLayout( widget ); + break; + case VBox: + l = new TQVBoxLayout( widget ); + break; + case Grid: + l = new QDesignerGridLayout( widget ); + break; + default: + return 0; + } + MetaDataBase::addEntry( TQT_TQOBJECT(l) ); + if ( widget ) { + MetaDataBase::setMargin( TQT_TQOBJECT(widget), metamargin ); + MetaDataBase::setSpacing( TQT_TQOBJECT(widget), metaspacing ); + } else { + l->setMargin( margin ); + l->setSpacing( spacing ); + } + } + } + l->setAlignment( align ); + MetaDataBase::addEntry( TQT_TQOBJECT(l) ); + return l; +} + +void WidgetFactory::deleteLayout( TQWidget *widget ) +{ + if ( !widget ) + return; + + if ( ::tqqt_cast<TQTabWidget*>(widget) ) + widget = ((TQTabWidget*)widget)->currentPage(); + if ( ::tqqt_cast<TQWizard*>(widget) ) + widget = ((TQWizard*)widget)->currentPage(); + if ( ::tqqt_cast<TQMainWindow*>(widget) ) + widget = ((TQMainWindow*)widget)->centralWidget(); + if ( ::tqqt_cast<TQWidgetStack*>(widget) ) + widget = ((TQWidgetStack*)widget)->visibleWidget(); + if ( ::tqqt_cast<TQToolBox*>(widget) ) + widget = ((TQToolBox*)widget)->currentItem(); + delete widget->layout(); +} + +/*! Factory functions for creating a widget of the type \a className + as child of \a parent with the name \a name. + + If \a init is TRUE, some initial default properties are set. This + has to be in sync with the initChangedProperties() function! +*/ + +TQWidget *WidgetFactory::createWidget( const TQString &className, TQWidget *parent, const char *name, bool init, + const TQRect *r, Qt::Orientation orient ) +{ + if ( className == TQPUSHBUTTON_OBJECT_NAME_STRING ) { + TQPushButton *b = 0; + if ( init ) { + b = new QDesignerPushButton( parent, name ); + b->setText( TQString::fromLatin1( name ) ); + } else { + b = new QDesignerPushButton( parent, name ); + } + TQWidget *w = find_formwindow( b ); + b->setAutoDefault( w && ::tqqt_cast<TQDialog*>(((FormWindow*)w)->mainContainer()) ); + return b; + } else if ( className == TQTOOLBUTTON_OBJECT_NAME_STRING ) { + if ( init ) { + QDesignerToolButton *tb = new QDesignerToolButton( parent, name ); + if ( ::tqqt_cast<TQToolBox*>(widgetOfContainer(parent))) { + tb->setUsesTextLabel(TRUE); + tb->setTextLabel("..."); + tb->setAutoRaise(TRUE); + tb->setTextPosition(TQToolButton::BesideIcon); + } else { + tb->setText( "..." ); + } + return tb; + } + return new QDesignerToolButton( parent, name ); + } else if ( className == TQCHECKBOX_OBJECT_NAME_STRING ) { + if ( init ) { + QDesignerCheckBox *cb = new QDesignerCheckBox( parent, name ); + cb->setText( TQString::fromLatin1( name ) ); + return cb; + } + return new QDesignerCheckBox( parent, name ); + } else if ( className == TQRADIOBUTTON_OBJECT_NAME_STRING ) { + if ( init ) { + QDesignerRadioButton *rb = new QDesignerRadioButton( parent, name ); + rb->setText( TQString::fromLatin1( name ) ); + return rb; + } + return new QDesignerRadioButton( parent, name ); + } else if ( className == TQGROUPBOX_OBJECT_NAME_STRING ) { + if ( init ) + return new TQGroupBox( TQString::fromLatin1( name ), parent, name ); + return new TQGroupBox( parent, name ); + } else if ( className == TQBUTTONGROUP_OBJECT_NAME_STRING ) { + if ( init ) + return new TQButtonGroup( TQString::fromLatin1( name ), parent, name ); + return new TQButtonGroup( parent, name ); + } else if ( className == TQICONVIEW_OBJECT_NAME_STRING ) { +#if !defined(TQT_NO_ICONVIEW) + TQIconView* iv = new TQIconView( parent, name ); + if ( init ) + (void) new TQIconViewItem( iv, i18n( "New Item" ) ); + return iv; +#else + return 0; +#endif + } else if ( className == TQTABLE_OBJECT_NAME_STRING ) { +#if !defined(TQT_NO_TABLE) + if ( init ) + return new TQTable( 3, 3, parent, name ); + return new TQTable( parent, name ); +#else + return 0; +#endif +#ifndef TQT_NO_SQL + } else if ( className == TQDATATABLE_OBJECT_NAME_STRING ) { + return new TQDataTable( parent, name ); +#endif //TQT_NO_SQL + } else if ( className == TQDATEEDIT_OBJECT_NAME_STRING ) { + return new TQDateEdit( parent, name ); + } else if ( className == TQTIMEEDIT_OBJECT_NAME_STRING ) { + return new TQTimeEdit( parent, name ); + } else if ( className == TQDATETIMEEDIT_OBJECT_NAME_STRING ) { + return new TQDateTimeEdit( parent, name ); + } + else if ( className == TQLISTBOX_OBJECT_NAME_STRING ) { + TQListBox* lb = new TQListBox( parent, name ); + if ( init ) { + lb->insertItem( i18n( "New Item" ) ); + lb->setCurrentItem( 0 ); + } + return lb; + } else if ( className == TQLISTVIEW_OBJECT_NAME_STRING ) { + TQListView *lv = new TQListView( parent, name ); + lv->setSorting( -1 ); + if ( init ) { + lv->addColumn( i18n( "Column 1" ) ); + lv->setCurrentItem( new TQListViewItem( lv, i18n( "New Item" ) ) ); + } + return lv; + } else if ( className == TQLINEEDIT_OBJECT_NAME_STRING ) + return new TQLineEdit( parent, name ); + else if ( className == TQSPINBOX_OBJECT_NAME_STRING ) + return new TQSpinBox( parent, name ); + else if ( className == TQSPLITTER_OBJECT_NAME_STRING ) + return new TQSplitter( parent, name ); + else if ( className == TQMULTILINEEDIT_OBJECT_NAME_STRING ) + return new TQMultiLineEdit( parent, name ); + else if ( className == TQTEXTEDIT_OBJECT_NAME_STRING ) + return new TQTextEdit( parent, name ); + else if ( className == TQLABEL_OBJECT_NAME_STRING || className == "TextLabel" ) { + QDesignerLabel *l = new QDesignerLabel( parent, name ); + if ( init ) { + l->setText( TQString::fromLatin1( name ) ); + MetaDataBase::addEntry( TQT_TQOBJECT(l) ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "text", TRUE ); + } + return l; + } else if ( className == "PixmapLabel" ) { + QDesignerLabel *l = new QDesignerLabel( parent, name ); + if ( init ) { + l->setPixmap( BarIcon( "designer_qtlogo.png", KDevDesignerPartFactory::instance() ) ); + l->setScaledContents( TRUE ); + MetaDataBase::addEntry( TQT_TQOBJECT(l) ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "pixmap", TRUE ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "scaledContents", TRUE ); + } + return l; + } else if ( className == TQLAYOUTWIDGET_OBJECT_NAME_STRING ) + return new TQLayoutWidget( parent, name ); + else if ( className == TQTABWIDGET_OBJECT_NAME_STRING ) { + TQTabWidget *tw = new QDesignerTabWidget( parent, name ); + if ( init ) { + FormWindow *fw = find_formwindow( parent ); + TQWidget *w = fw ? new QDesignerWidget( fw, tw, "tab" ) : new TQWidget( tw, "tab" ); + tw->addTab( w, i18n("Tab 1") ); + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + w = fw ? new QDesignerWidget( fw, tw, "tab" ) : new TQWidget( tw, "tab" ); + tw->addTab( w, i18n("Tab 2") ); + MetaDataBase::addEntry( TQT_TQOBJECT(tw) ); + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + } + return tw; + } else if ( className == TQWIDGETSTACK_OBJECT_NAME_STRING ) { + QDesignerWidgetStack *ws = new QDesignerWidgetStack( parent, name ); + if ( init ) { + FormWindow *fw = find_formwindow( parent ); + TQWidget *w = fw ? new QDesignerWidget( fw, ws, "WStackPage" ) : new TQWidget( ws, "WStackPage" ); + ws->insertPage( w ); + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + MetaDataBase::addEntry( TQT_TQOBJECT(ws) ); + } + return ws; + } else if ( className == TQCOMBOBOX_OBJECT_NAME_STRING ) { + return new TQComboBox( FALSE, parent, name ); + } else if ( className == TQWIDGET_OBJECT_NAME_STRING ) { + if ( parent && + ( ::tqqt_cast<FormWindow*>(parent) || + ::tqqt_cast<TQWizard*>(parent) || + ::tqqt_cast<TQTabWidget*>(parent) || + ::tqqt_cast<TQWidgetStack*>(parent) || + ::tqqt_cast<TQToolBox*>(parent) || + ::tqqt_cast<TQMainWindow*>(parent) ) ) { + FormWindow *fw = find_formwindow( parent ); + if ( fw ) { + QDesignerWidget *dw = new QDesignerWidget( fw, parent, name ); + MetaDataBase::addEntry( TQT_TQOBJECT(dw) ); + return dw; + } + } + return new TQWidget( parent, name ); + } else if ( className == TQDIALOG_OBJECT_NAME_STRING ) { + TQDialog *dia = 0; + if ( ::tqqt_cast<FormWindow*>(parent) ) + dia = new QDesignerDialog( (FormWindow*)parent, parent, name ); + else + dia = new TQDialog( parent, name ); +#if defined(TQT_NON_COMMERCIAL) + if ( ::tqqt_cast<MainWindow*>(parent) ) +#else + if ( parent ) +#endif + dia->reparent( parent, TQPoint( 0, 0 ), TRUE ); + return dia; + } else if ( className == TQWIZARD_OBJECT_NAME_STRING ) { + TQWizard *wiz = new QDesignerWizard( parent, name ); +#if defined(TQT_NON_COMMERCIAL) + if ( ::tqqt_cast<MainWindow*>(parent) ) +#else + if ( parent ) +#endif + wiz->reparent( parent, TQPoint( 0, 0 ), TRUE ); + if ( init && ::tqqt_cast<FormWindow*>(parent) ) { + QDesignerWidget *dw = new QDesignerWidget( (FormWindow*)parent, wiz, "WizardPage" ); + MetaDataBase::addEntry( TQT_TQOBJECT(dw) ); + wiz->addPage( dw, i18n( "Page" ) ); + TQTimer::singleShot( 0, wiz, TQT_SLOT( next() ) ); + } + return wiz; + } else if ( className == "Spacer" ) { + Spacer *s = new Spacer( parent, name ); + MetaDataBase::addEntry( TQT_TQOBJECT(s) ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "orientation", TRUE ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "sizeType", TRUE ); + if ( !r ) + return s; + if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) + s->setOrientation( orient ); + else if ( r->width() < r->height() ) + s->setOrientation( Qt::Vertical ); + else + s->setOrientation( Qt::Horizontal ); + return s; + } else if ( className == TQLCDNUMBER_OBJECT_NAME_STRING ) + return new TQLCDNumber( parent, name ); + else if ( className == TQPROGRESSBAR_OBJECT_NAME_STRING ) + return new TQProgressBar( parent, name ); + else if ( className == TQTEXTVIEW_OBJECT_NAME_STRING ) + return new TQTextView( parent, name ); + else if ( className == TQTEXTBROWSER_OBJECT_NAME_STRING ) + return new TQTextBrowser( parent, name ); + else if ( className == TQDIAL_OBJECT_NAME_STRING ) + return new TQDial( parent, name ); + else if ( className == TQSLIDER_OBJECT_NAME_STRING ) { + TQSlider *s = new TQSlider( parent, name ); + if ( !r ) + return s; + if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) + s->setOrientation( orient ); + else if ( r->width() > r->height() ) + s->setOrientation( Qt::Horizontal ); + MetaDataBase::addEntry( TQT_TQOBJECT(s) ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "orientation", TRUE ); + return s; + } else if ( className == TQSCROLLBAR_OBJECT_NAME_STRING ) { + TQScrollBar *s = new TQScrollBar( parent, name ); + if ( !r ) + return s; + if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) + s->setOrientation( orient ); + else if ( r->width() > r->height() ) + s->setOrientation( Qt::Horizontal ); + MetaDataBase::addEntry( TQT_TQOBJECT(s) ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(s), "orientation", TRUE ); + return s; + } else if ( className == TQFRAME_OBJECT_NAME_STRING ) { + if ( !init ) + return new TQFrame( parent, name ); + TQFrame *f = new TQFrame( parent, name ); + f->setFrameStyle( TQFrame::StyledPanel | TQFrame::Raised ); + return f; + } else if ( className == "Line" ) { + Line *l = new Line( parent, name ); + MetaDataBase::addEntry( TQT_TQOBJECT(l) ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "orientation", TRUE ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "frameShadow", TRUE ); + MetaDataBase::setPropertyChanged( TQT_TQOBJECT(l), "frameShape", TRUE ); + if ( !r ) + return l; + if ( !r->isValid() || r->width() < 2 && r->height() < 2 ) + l->setOrientation( orient ); + else if ( r->width() < r->height() ) + l->setOrientation( Qt::Vertical ); + return l; + } else if ( className == TQMAINWINDOW_OBJECT_NAME_STRING ) { + TQMainWindow *mw = new TQMainWindow( parent, name, 0 ); + mw->setDockEnabled( TQt::DockMinimized, FALSE ); + QDesignerWidget *dw = new QDesignerWidget( (FormWindow*)parent, mw, "central widget" ); + mw->setDockMenuEnabled( FALSE ); + MetaDataBase::addEntry( TQT_TQOBJECT(dw) ); + mw->setCentralWidget( dw ); + (void)mw->statusBar(); + dw->show(); + return mw; + } else if ( className == TQTOOLBOX_OBJECT_NAME_STRING ) { + if ( !init ) + return new QDesignerToolBox( parent, name ); + TQToolBox *tb = new QDesignerToolBox( parent, name ); + FormWindow *fw = find_formwindow( parent ); + TQWidget *w = fw ? new QDesignerWidget( fw, tb, "page1" ) : + new TQWidget( tb, "page1" ); + tb->addItem( w, i18n("Page 1") ); + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + w = fw ? new QDesignerWidget( fw, tb, "page2" ) : new TQWidget( tb, "page2" ); + tb->addItem( w, i18n("Page 2") ); + MetaDataBase::addEntry( TQT_TQOBJECT(tb) ); + MetaDataBase::addEntry( TQT_TQOBJECT(w) ); + return tb; + } +#ifndef TQT_NO_SQL + else if ( className == TQDATABROWSER_OBJECT_NAME_STRING ) { + TQWidget *w = new QDesignerDataBrowser( parent, name ); + if ( parent ) + w->reparent( parent, TQPoint( 0, 0 ), TRUE ); + return w; + } else if ( className == TQDATAVIEW_OBJECT_NAME_STRING ) { + TQWidget *w = new QDesignerDataView( parent, name ); + if ( parent ) + w->reparent( parent, TQPoint( 0, 0 ), TRUE ); + return w; + } +#endif + + WidgetInterface *iface = 0; + widgetManager()->queryInterface( className, &iface ); + if ( !iface ) + return 0; + + TQWidget *w = iface->create( className, parent, name ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + if ( init && WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( className ) ) ) { + TQWidgetContainerInterfacePrivate *iface2 = 0; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); + if ( iface2 ) { + iface2->addPage( className, w, "Page", -1 ); + iface2->release(); + } + } +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + iface->release(); + return w; +} + + + +/*! Find out which type the layout of the widget is. Returns \c HBox, + \c VBox, \c Grid or \c NoLayout. \a layout points to this + TQWidget::layout() of \a w or to 0 after the function call. +*/ + +WidgetFactory::LayoutType WidgetFactory::layoutType( TQWidget *w, TQLayout *&layout ) +{ + layout = 0; + + if ( ::tqqt_cast<TQTabWidget*>(w) ) + w = ((TQTabWidget*)w)->currentPage(); + if ( ::tqqt_cast<TQWizard*>(w) ) + w = ((TQWizard*)w)->currentPage(); + if ( ::tqqt_cast<TQMainWindow*>(w) ) + w = ((TQMainWindow*)w)->centralWidget(); + if ( ::tqqt_cast<TQWidgetStack*>(w) ) + w = ((TQWidgetStack*)w)->visibleWidget(); + if ( ::tqqt_cast<TQToolBox*>(w) ) + w = ((TQToolBox*)w)->currentItem(); + + if ( ::tqqt_cast<TQSplitter*>(w) ) + return ( (TQSplitter*)w )->orientation() ==Qt::Horizontal ? HBox : VBox; + + if ( !w || !w->layout() ) + return NoLayout; + TQLayout *lay = w->layout(); + + if ( ::tqqt_cast<TQGroupBox*>(w) ) { + TQObjectList *l = TQT_TQOBJECT(lay)->queryList( TQLAYOUT_OBJECT_NAME_STRING ); + if ( l && l->first() ) + lay = (TQLayout*)l->first(); + delete l; + } + layout = lay; + + if ( ::tqqt_cast<TQHBoxLayout*>(lay) ) + return HBox; + else if ( ::tqqt_cast<TQVBoxLayout*>(lay) ) + return VBox; + else if ( ::tqqt_cast<TQGridLayout*>(lay) ) + return Grid; + return NoLayout; +} + +/*! + \overload +*/ +WidgetFactory::LayoutType WidgetFactory::layoutType( TQLayout *layout ) +{ + if ( ::tqqt_cast<TQHBoxLayout*>(layout) ) + return HBox; + else if ( ::tqqt_cast<TQVBoxLayout*>(layout) ) + return VBox; + else if ( ::tqqt_cast<TQGridLayout*>(layout) ) + return Grid; + return NoLayout; +} + +/*! + \overload +*/ +WidgetFactory::LayoutType WidgetFactory::layoutType( TQWidget *w ) +{ + TQLayout *l = 0; + return layoutType( w, l ); +} + + +TQWidget *WidgetFactory::layoutParent( TQLayout *layout ) +{ + TQObject *o = TQT_TQOBJECT(layout); + while ( o ) { + if ( o->isWidgetType() ) + return (TQWidget*)o; + o = o->parent(); + } + return 0; +} + +/*! Returns the widget into which children should be inserted when \a + w is a container known to the designer. + + Usually that is \a w itself, sometimes it is different (e.g. a + tabwidget is known to the designer as a container but the child + widgets should be inserted into the current page of the + tabwidget. So in this case this function returns the current page of + the tabwidget.) + */ +TQWidget* WidgetFactory::containerOfWidget( TQWidget *w ) +{ + if ( !w ) + return w; + if ( ::tqqt_cast<TQTabWidget*>(w) ) + return ((TQTabWidget*)w)->currentPage(); + if ( ::tqqt_cast<TQWizard*>(w) ) + return ((TQWizard*)w)->currentPage(); + if ( ::tqqt_cast<TQWidgetStack*>(w) ) + return ((TQWidgetStack*)w)->visibleWidget(); + if ( ::tqqt_cast<TQToolBox*>(w) ) + return ((TQToolBox*)w)->currentItem(); + if ( ::tqqt_cast<TQMainWindow*>(w) ) + return ((TQMainWindow*)w)->centralWidget(); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + if ( !WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( classNameOf( w ) ) ) ) + return w; + WidgetInterface *iface = 0; + widgetManager()->queryInterface( classNameOf( w ), &iface ); + if ( !iface ) + return w; + TQWidgetContainerInterfacePrivate *iface2 = 0; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); + if ( !iface2 ) + return w; + TQWidget *c = iface2->containerOfWidget( w->className(), w ); + iface2->release(); + iface->release(); + if ( c ) + return c; +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + return w; +} + +/*! Returns the actual designer widget of the container \a w. This is + normally \a w itself, but might be a parent or grand parent of \a w + (e.g. when working with a tabwidget and \a w is the container which + contains and layouts childs, but the actual widget known to the + designer is the tabwidget which is the parent of \a w. So this + function returns the tabwidget then.) +*/ + +TQWidget* WidgetFactory::widgetOfContainer( TQWidget *w ) +{ + if ( w && ::tqqt_cast<TQWidgetStack*>(w->parentWidget()) ) + w = w->parentWidget(); + if ( w->parentWidget() && w->parentWidget()->parentWidget() && + w->parentWidget()->parentWidget()->parentWidget() && + ::tqqt_cast<TQToolBox*>(w->parentWidget()->parentWidget()->parentWidget()) ) + return w->parentWidget()->parentWidget()->parentWidget(); + while ( w ) { + int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( TQT_TQOBJECT(w) ) ); + if ( WidgetDatabase::isContainer( id ) || + w && ::tqqt_cast<FormWindow*>(w->parentWidget()) ) + return w; + w = w->parentWidget(); + } + return w; +} + +/*! + Returns whether \a o is a passive interactor or not. + */ + +bool WidgetFactory::lastWasAPassiveInteractor = FALSE; +TQGuardedPtr<TQObject> *WidgetFactory::lastPassiveInteractor = new TQGuardedPtr<TQObject>(); + +bool WidgetFactory::isPassiveInteractor( TQObject* o ) +{ + if ( lastPassiveInteractor && *lastPassiveInteractor && (TQObject*)(*lastPassiveInteractor) == o ) + return lastWasAPassiveInteractor; + lastWasAPassiveInteractor = FALSE; + (*lastPassiveInteractor) = o; + if ( TQApplication::activePopupWidget() ) // if a popup is open, we have to make sure that this one is closed, else X might do funny things + return ( lastWasAPassiveInteractor = TRUE ); + + if ( ::tqqt_cast<TQTabBar*>(o) ) + return ( lastWasAPassiveInteractor = TRUE ); + else if ( ::tqqt_cast<TQSizeGrip*>(o) ) + return ( lastWasAPassiveInteractor = TRUE ); + else if ( ::tqqt_cast<TQButton*>(o) && + ( ::tqqt_cast<TQTabBar*>(o->parent()) || ::tqqt_cast<TQToolBox*>(o->parent()) ) ) + return ( lastWasAPassiveInteractor = TRUE ); + else if ( ::tqqt_cast<TQPushButton*>(o) && ::tqqt_cast<TQWizard*>(o->parent()) ) + return ( lastWasAPassiveInteractor = TRUE ); + else if ( ::tqqt_cast<TQMenuBar*>(o) && ::tqqt_cast<TQMainWindow*>(o->parent()) ) + return ( lastWasAPassiveInteractor = TRUE ); +// else if ( ::tqqt_cast<TQDockWindowHandle*>(o) ) + else if ( o->inherits( TQDOCKWINDOWHANDLE_OBJECT_NAME_STRING ) ) + return ( lastWasAPassiveInteractor = TRUE ); +// else if ( ::tqqt_cast<TQHideDock*>(o) ) + else if ( o->inherits( TQHIDEDOCK_OBJECT_NAME_STRING ) ) + return ( lastWasAPassiveInteractor = TRUE ); + else if ( qstrcmp( o->name(), "designer_wizardstack_button" ) == 0 ) + return ( lastWasAPassiveInteractor = TRUE ); +#ifdef TQT_CONTAINER_CUSTOM_WIDGETS + if ( !o->isWidgetType() ) + return ( lastWasAPassiveInteractor = FALSE ); + WidgetInterface *iface = 0; + TQWidget *w = (TQWidget*)o; + while ( !iface && w && !::tqqt_cast<FormWindow*>(w) ) { + widgetManager()->queryInterface( classNameOf( w ), &iface ); + w = w->parentWidget(); + } + if ( !iface ) + return ( lastWasAPassiveInteractor = FALSE ); + TQWidgetContainerInterfacePrivate *iface2 = 0; + iface->queryInterface( IID_TQWidgetContainer, (TQUnknownInterface**)&iface2 ); + if ( !iface2 ) + return ( lastWasAPassiveInteractor = FALSE ); + TQWidget *fw = MainWindow::self->isAFormWindowChild( (TQWidget*)o ); + if ( !fw ) + return ( lastWasAPassiveInteractor = FALSE ); + TQWidget *dw = ( (FormWindow*)fw )->designerWidget( (TQWidget*)o ); + if ( !dw ) + return ( lastWasAPassiveInteractor = FALSE ); + lastWasAPassiveInteractor = iface2->isPassiveInteractor( dw->className(), (TQWidget*)o ); + iface2->release(); + iface->release(); +#endif // TQT_CONTAINER_CUSTOM_WIDGETS + return lastWasAPassiveInteractor; +} + + +/*! + Returns the class name of object \a o that should be used for externally (i.e. for saving) + */ +const char* WidgetFactory::classNameOf( TQObject* o ) +{ + if ( o->isA( "PropertyObject" ) ) + return o->className(); + if (WidgetDatabase::isCustomPluginWidget(WidgetDatabase::idFromClassName(o->className()))) + return o->className(); + else if ( ::tqqt_cast<QDesignerTabWidget*>(o) ) + return TQTABWIDGET_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerWidgetStack*>(o) ) + return TQWIDGETSTACK_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<TQWidgetStack*>(o) ) + return "TQWeDoNotWantToBreakTabWidget"; + else if ( ::tqqt_cast<QDesignerDialog*>(o) ) + return TQDIALOG_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerWidget*>(o) ) + return TQWIDGET_OBJECT_NAME_STRING; + else if ( o->inherits( "CustomWidget" ) ) + return ( (CustomWidget*)o )->realClassName().latin1(); + else if ( ::tqqt_cast<QDesignerLabel*>(o) ) + return TQLABEL_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerWizard*>(o) ) + return TQWIZARD_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerPushButton*>(o) ) + return TQPUSHBUTTON_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerToolButton*>(o) ) + return TQTOOLBUTTON_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerRadioButton*>(o) ) + return TQRADIOBUTTON_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerCheckBox*>(o) ) + return TQCHECKBOX_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<MenuBarEditor*>(o) ) + return TQMENUBAR_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerToolBar*>(o) ) + return TQTOOLBAR_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerAction*>(o) ) + return TQACTION_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerActionGroup*>(o) ) + return TQACTIONGROUP_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<PopupMenuEditor*>(o) ) + return TQPOPUPMENU_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerToolBox*>(o) ) + return TQTOOLBOX_OBJECT_NAME_STRING; +#ifndef TQT_NO_SQL + else if ( ::tqqt_cast<QDesignerDataBrowser*>(o) ) + return TQDATABROWSER_OBJECT_NAME_STRING; + else if ( ::tqqt_cast<QDesignerDataView*>(o) ) + return TQDATAVIEW_OBJECT_NAME_STRING; +#endif + return o->className(); +} + +TQString WidgetFactory::defaultSignal( TQObject *w ) +{ + if ( ::tqqt_cast<TQRadioButton*>(w) || ::tqqt_cast<TQCheckBox*>(w) ) + return "toggled"; + else if ( ::tqqt_cast<TQButton*>(w) || ::tqqt_cast<TQButtonGroup*>(w) ) + return "clicked"; + else if ( ::tqqt_cast<TQTextBrowser*>(w) ) + return "linkClicked"; + else if ( ::tqqt_cast<TQLineEdit*>(w) || ::tqqt_cast<TQTextEdit*>(w) ) + return "textChanged"; + else if ( ::tqqt_cast<TQListView*>(w) || ::tqqt_cast<TQIconView*>(w) || + ::tqqt_cast<TQListBox*>(w) || ::tqqt_cast<TQTable*>(w) ) + return "selectionChanged"; + else if ( ::tqqt_cast<TQTabWidget*>(w) ) + return "selected"; + else if ( ::tqqt_cast<TQToolBox*>(w) ) + return "currentChanged"; + else if ( ::tqqt_cast<TQWidgetStack*>(w) ) + return "aboutToShow"; + else if ( ::tqqt_cast<TQSpinBox*>(w) || ::tqqt_cast<TQSlider*>(w) || + ::tqqt_cast<TQScrollBar*>(w) || ::tqqt_cast<TQDateEdit*>(w) || + ::tqqt_cast<TQTimeEdit*>(w) || ::tqqt_cast<TQDateTimeEdit*>(w) || + ::tqqt_cast<TQDial*>(w) ) + return "valueChanged"; + else if ( ::tqqt_cast<TQComboBox*>(w) ) + return "activated"; + return TQString(); +} + +/*! As some properties are set by default when creating a widget this + functions markes this properties as changed. Has to be in sync with + createWidget()! +*/ + +void WidgetFactory::initChangedProperties( TQObject *o ) +{ + if ( MainWindow::self && MainWindow::self->currProject() && + MainWindow::self->currProject()->fakeFormFileFor( o ) ) + return; + MetaDataBase::setPropertyChanged( o, "name", TRUE ); + if ( !::tqqt_cast<QDesignerToolBar*>(o) && !::tqqt_cast<MenuBarEditor*>(o) ) + MetaDataBase::setPropertyChanged( o, "geometry", TRUE ); + + if ( ::tqqt_cast<TQPushButton*>(o) || + ::tqqt_cast<TQRadioButton*>(o) || + ::tqqt_cast<TQCheckBox*>(o) || + ::tqqt_cast<TQToolButton*>(o) ) { + if (::tqqt_cast<TQToolButton*>(o) && ::tqqt_cast<TQToolBox*>(widgetOfContainer((TQWidget*)o->parent()))) { + MetaDataBase::setPropertyChanged( o, "usesTextLabel", TRUE ); + MetaDataBase::setPropertyChanged( o, "textLabel", TRUE ); + MetaDataBase::setPropertyChanged( o, "autoRaise", TRUE ); + MetaDataBase::setPropertyChanged( o, "textPosition", TRUE ); + } else { + MetaDataBase::setPropertyChanged( o, "text", TRUE ); + } + } + else if ( ::tqqt_cast<TQGroupBox*>(o) ) + MetaDataBase::setPropertyChanged( o, "title", TRUE ); + else if ( o->isA( TQFRAME_OBJECT_NAME_STRING ) ) { + MetaDataBase::setPropertyChanged( o, "frameShadow", TRUE ); + MetaDataBase::setPropertyChanged( o, "frameShape", TRUE ); + } else if ( ::tqqt_cast<TQTabWidget*>(o) || ::tqqt_cast<TQWizard*>(o) ) { + MetaDataBase::setPropertyChanged( o, "pageTitle", TRUE ); + MetaDataBase::setPropertyChanged( o, "pageName", TRUE ); + MetaDataBase::setPropertyChanged( o, "currentPage", TRUE ); + } else if ( ::tqqt_cast<TQWidgetStack*>(o) ) { + MetaDataBase::setPropertyChanged( o, "currentPage", TRUE ); + MetaDataBase::setPropertyChanged( o, "pageName", TRUE ); + } else if ( ::tqqt_cast<TQToolBox*>(o) ) { + MetaDataBase::setPropertyChanged( o, "currentIndex", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemName", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemLabel", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemIconSet", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemToolTip", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemBackgroundMode", TRUE ); +#ifndef TQT_NO_TABLE + } else if ( ::tqqt_cast<TQTable*>(o) ) { +# ifndef TQT_NO_SQL + if (!::tqqt_cast<TQDataTable*>(o) ) +# endif + { + MetaDataBase::setPropertyChanged( o, "numRows", TRUE ); + MetaDataBase::setPropertyChanged( o, "numCols", TRUE ); + TQTable *t = (TQTable*)o; + for ( int i = 0; i < 3; ++i ) { + t->horizontalHeader()->setLabel( i, TQString::number( i + 1 ) ); + t->verticalHeader()->setLabel( i, TQString::number( i + 1 ) ); + } + } +#endif + } else if ( ::tqqt_cast<TQSplitter*>(o) ) { + MetaDataBase::setPropertyChanged( o, "orientation", TRUE ); + } else if ( ::tqqt_cast<QDesignerToolBar*>(o) ) { + MetaDataBase::setPropertyChanged( o, "label", TRUE ); + } else if ( ::tqqt_cast<MenuBarEditor*>(o) ) { + MetaDataBase::setPropertyChanged( o, "itemName", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemNumber", TRUE ); + MetaDataBase::setPropertyChanged( o, "itemText", TRUE ); + } +} + +bool WidgetFactory::hasSpecialEditor( int id, TQObject *editorWidget ) +{ + TQString className = WidgetDatabase::className( id ); + + if ( className.contains( "ListBox" ) ) + return TRUE; + if ( className.contains( "ComboBox" ) ) + return TRUE; + if ( className.contains( "ListView" ) ) + return TRUE; + if ( className.contains( "IconView" ) ) + return TRUE; + if ( className == TQTEXTEDIT_OBJECT_NAME_STRING || className == TQMULTILINEEDIT_OBJECT_NAME_STRING ) + return TRUE; + if ( ::tqqt_cast<TQTable*>(editorWidget) != 0 ) + return TRUE; + + return FALSE; +} + +bool WidgetFactory::hasItems( int id, TQObject *editorWidget ) +{ + TQString className = WidgetDatabase::className( id ); + + if ( className.contains( "ListBox" ) || className.contains( "ListView" ) || + className.contains( "IconView" ) || className.contains( "ComboBox" ) || + ::tqqt_cast<TQTable*>(editorWidget) != 0 ) + return TRUE; + + return FALSE; +} + +void WidgetFactory::editWidget( int id, TQWidget *parent, TQWidget *editWidget, FormWindow *fw ) +{ + TQString className = WidgetDatabase::className( id ); + + if ( className.contains( "ListBox" ) ) { + if ( !::tqqt_cast<TQListBox*>(editWidget) ) + return; + ListBoxEditor *e = new ListBoxEditor( parent, editWidget, fw ); + e->exec(); + delete e; + return; + } + + if ( className.contains( "ComboBox" ) ) { + if ( !::tqqt_cast<TQComboBox*>(editWidget) ) + return; + TQComboBox *cb = (TQComboBox*)editWidget; + ListBoxEditor *e = new ListBoxEditor( parent, cb->listBox(), fw ); + e->exec(); + delete e; + cb->update(); + return; + } + + if ( className.contains( "ListView" ) ) { + if ( !::tqqt_cast<TQListView*>(editWidget) ) + return; + TQListView *lv = (TQListView*)editWidget; + ListViewEditor *e = new ListViewEditor( parent, lv, fw ); + e->exec(); + delete e; + return; + } + + if ( className.contains( "IconView" ) ) { + if ( !::tqqt_cast<TQIconView*>(editWidget) ) + return; + IconViewEditor *e = new IconViewEditor( parent, editWidget, fw ); + e->exec(); + delete e; + return; + } + + if ( className == TQMULTILINEEDIT_OBJECT_NAME_STRING || className == TQTEXTEDIT_OBJECT_NAME_STRING ) { + MultiLineEditor *e = new MultiLineEditor( FALSE, TRUE, parent, editWidget, fw ); + e->exec(); + delete e; + return; + } +#ifndef TQT_NO_TABLE + if (::tqqt_cast<TQTable*>(editWidget) != 0) { + TableEditor *e = new TableEditor( parent, editWidget, fw ); + e->exec(); + delete e; + return; + } +#endif +} + +bool WidgetFactory::canResetProperty( TQObject *w, const TQString &propName ) +{ + if ( propName == "name" || propName == "geometry" ) + return FALSE; + TQStringList l = *changedProperties->find( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ) ); + return l.findIndex( propName ) == -1; +} + +bool WidgetFactory::resetProperty( TQObject *w, const TQString &propName ) +{ + const TQMetaProperty *p = w->metaObject()->property( w->metaObject()-> + findProperty( propName, TRUE ), TRUE ); + if (!p ) + return FALSE; + return p->reset( w ); +} + +TQVariant WidgetFactory::defaultValue( TQObject *w, const TQString &propName ) +{ + if ( propName == "wordwrap" ) { + int v = defaultValue( w, "alignment" ).toInt(); + return TQVariant( ( v & WordBreak ) == WordBreak, 0 ); + } else if ( propName == "toolTip" || propName == "whatsThis" ) { + return TQVariant( TQString::fromLatin1( "" ) ); + } else if ( w->inherits( "CustomWidget" ) ) { + return TQVariant(); + } else if ( propName == "frameworkCode" ) { + return TQVariant( TRUE, 0 ); + } else if ( propName == "layoutMargin" || propName == "layoutSpacing" ) { + return TQVariant( -1 ); + } + + return *( *defaultProperties->find( WidgetDatabase::idFromClassName( classNameOf( w ) ) ) ).find( propName ); +} + +TQString WidgetFactory::defaultCurrentItem( TQObject *w, const TQString &propName ) +{ + const TQMetaProperty *p = w->metaObject()-> + property( w->metaObject()->findProperty( propName, TRUE ), TRUE ); + if ( !p ) { + int v = defaultValue( w, "alignment" ).toInt(); + if ( propName == "hAlign" ) { + if ( ( v & AlignAuto ) == AlignAuto ) + return "AlignAuto"; + if ( ( v & AlignLeft ) == AlignLeft ) + return "AlignLeft"; + if ( ( v & AlignCenter ) == AlignCenter || ( v & AlignHCenter ) == AlignHCenter ) + return "AlignHCenter"; + if ( ( v & AlignRight ) == AlignRight ) + return "AlignRight"; + if ( ( v & AlignJustify ) == AlignJustify ) + return "AlignJustify"; + } else if ( propName == "vAlign" ) { + if ( ( v & AlignTop ) == AlignTop ) + return "AlignTop"; + if ( ( v & AlignCenter ) == AlignCenter || ( v & AlignVCenter ) == AlignVCenter ) + return "AlignVCenter"; + if ( ( v & AlignBottom ) == AlignBottom ) + return "AlignBottom"; + } else if ( propName == "resizeMode" ) { + return "Auto"; + } + return TQString(); + + } + return p->valueToKey( defaultValue( w, propName ).toInt() ); +} + +TQWidget *WidgetFactory::createCustomWidget( TQWidget *parent, const char *name, MetaDataBase::CustomWidget *w ) +{ + if ( !w ) + return 0; + return new CustomWidget( parent, name, w ); +} + +TQVariant WidgetFactory::property( TQObject *w, const char *name ) +{ + int id = w->metaObject()->findProperty( name, TRUE ); + const TQMetaProperty* p = w->metaObject()->property( id, TRUE ); + if ( !p || !p->isValid() ) + return MetaDataBase::fakeProperty( w, name ); + return w->property( name ); +} + +void QDesignerLabel::updateBuddy() +{ + + if ( myBuddy.isEmpty() ) + return; + + TQObjectList *l = topLevelWidget()->queryList( TQWIDGET_OBJECT_NAME_STRING, myBuddy, FALSE, TRUE ); + if ( !l || !l->first() ) { + delete l; + return; + } + + TQLabel::setBuddy( (TQWidget*)l->first() ); + delete l; +} + + +void QDesignerWidget::resizeEvent( TQResizeEvent* e) +{ + if ( need_frame ) { + TQPainter p(this); + p.setPen( backgroundColor() ); + p.drawRect( TQRect( TQPoint(0,0), e->oldSize() ) ); + } +} + +void QDesignerWidget::paintEvent( TQPaintEvent *e ) +{ + if ( need_frame ) { + TQPainter p(this); + p.setPen( backgroundColor().dark() ); + p.drawRect( rect() ); + } + formwindow->paintGrid( this, e ); +} + +void QDesignerDialog::paintEvent( TQPaintEvent *e ) +{ + formwindow->paintGrid( this, e ); +} + +TQSizePolicy TQLayoutWidget::sizePolicy() const +{ + return sp; +} + +bool TQLayoutWidget::event( TQEvent *e ) +{ + if ( e && ( e->type() == TQEvent::ChildInserted || + e->type() == TQEvent::ChildRemoved || + e->type() == TQEvent::LayoutHint || + e->type() == TQEvent::Reparent ) ) + updateSizePolicy(); + return TQWidget::event( e ); +} + +/* + This function must be called on TQLayoutWidget creation and whenever + the TQLayoutWidget's parent layout changes (e.g., from a TQHBoxLayout + to a TQVBoxLayout), because of the (illogical) way layouting works. +*/ +void TQLayoutWidget::updateSizePolicy() +{ + if ( childrenListObject().isEmpty() || childrenListObject().count() == 0 ) { + sp = TQWidget::sizePolicy(); + return; + } + + /* + TQSizePolicy::MayShrink & friends are private. Here we assume the + following: + + Fixed = 0 + Maximum = MayShrink + Minimum = MayGrow + Preferred = MayShrink | MayGrow + */ + + int ht = (int) TQSizePolicy::Preferred; + int vt = (int) TQSizePolicy::Preferred; + + if ( layout() ) { + /* + parentLayout is set to the parent layout if there is one and if it is + top level, in which case layouting is illogical. + */ + TQLayout *parentLayout = 0; + if ( parent() && parent()->isWidgetType() ) { + parentLayout = ((TQWidget *)parent())->layout(); + if ( parentLayout && + ::tqqt_cast<TQLayoutWidget*>(parentLayout->mainWidget()) ) + parentLayout = 0; + } + + TQObjectListIt it( childrenListObject() ); + TQObject *o; + + if ( ::tqqt_cast<TQVBoxLayout*>(layout()) ) { + if ( ::tqqt_cast<TQHBoxLayout*>(parentLayout) ) + vt = TQSizePolicy::Minimum; + else + vt = TQSizePolicy::Fixed; + + while ( ( o = it.current() ) ) { + ++it; + if ( !o->isWidgetType() || ( (TQWidget*)o )->testWState( WState_ForceHide ) ) + continue; + TQWidget *w = (TQWidget*)o; + + if ( !w->sizePolicy().mayGrowHorizontally() ) + ht &= ~TQSizePolicy::Minimum; + if ( !w->sizePolicy().mayShrinkHorizontally() ) + ht &= ~TQSizePolicy::Maximum; + if ( w->sizePolicy().mayGrowVertically() ) + vt |= TQSizePolicy::Minimum; + if ( w->sizePolicy().mayShrinkVertically() ) + vt |= TQSizePolicy::Maximum; + } + } else if ( ::tqqt_cast<TQHBoxLayout*>(layout()) ) { + if ( ::tqqt_cast<TQVBoxLayout*>(parentLayout) ) + ht = TQSizePolicy::Minimum; + else + ht = TQSizePolicy::Fixed; + + while ( ( o = it.current() ) ) { + ++it; + if ( !o->isWidgetType() || ( (TQWidget*)o )->testWState( WState_ForceHide ) ) + continue; + TQWidget *w = (TQWidget*)o; + + if ( w->sizePolicy().mayGrowHorizontally() ) + ht |= TQSizePolicy::Minimum; + if ( w->sizePolicy().mayShrinkHorizontally() ) + ht |= TQSizePolicy::Maximum; + if ( !w->sizePolicy().mayGrowVertically() ) + vt &= ~TQSizePolicy::Minimum; + if ( !w->sizePolicy().mayShrinkVertically() ) + vt &= ~TQSizePolicy::Maximum; + } + } else if ( ::tqqt_cast<TQGridLayout*>(layout()) ) { + ht = TQSizePolicy::Fixed; + vt = TQSizePolicy::Fixed; + if ( parentLayout ) { + if ( ::tqqt_cast<TQVBoxLayout*>(parentLayout) ) + ht = TQSizePolicy::Minimum; + else if ( ::tqqt_cast<TQHBoxLayout*>(parentLayout) ) + vt = TQSizePolicy::Minimum; + } + + while ( ( o = it.current() ) ) { + ++it; + if ( !o->isWidgetType() || ( (TQWidget*)o )->testWState( WState_ForceHide ) ) + continue; + TQWidget *w = (TQWidget*)o; + + if ( w->sizePolicy().mayGrowHorizontally() ) + ht |= TQSizePolicy::Minimum; + if ( w->sizePolicy().mayShrinkHorizontally() ) + ht |= TQSizePolicy::Maximum; + if ( w->sizePolicy().mayGrowVertically() ) + vt |= TQSizePolicy::Minimum; + if ( w->sizePolicy().mayShrinkVertically() ) + vt |= TQSizePolicy::Maximum; + } + } +#ifdef USE_QT4 + if ( layout()->expanding() & TQSizePolicy::Horizontally ) +#else // USE_QT4 + if ( layout()->expanding() & TQSizePolicy::Horizontally ) +#endif // USE_QT4 + ht = TQSizePolicy::Expanding; +#ifdef USE_QT4 + if ( layout()->expanding() & TQSizePolicy::Vertically ) +#else // USE_QT4 + if ( layout()->expanding() & TQSizePolicy::Vertically ) +#endif // USE_QT4 + vt = TQSizePolicy::Expanding; + + layout()->invalidate(); + } + + sp = TQSizePolicy( (TQSizePolicy::SizeType) ht, (TQSizePolicy::SizeType) vt ); + updateGeometry(); +} + +void CustomWidget::paintEvent( TQPaintEvent *e ) +{ + if ( ::tqqt_cast<FormWindow*>(parentWidget()) ) { + ( (FormWindow*)parentWidget() )->paintGrid( this, e ); + } else { + TQPainter p( this ); + p.fillRect( rect(), colorGroup().dark() ); + p.setPen( colorGroup().light() ); + p.drawText( 2, 2, width() - 4, height() - 4, TQt::AlignAuto | TQt::AlignTop, cusw->className ); + p.drawPixmap( ( width() - cusw->pixmap->width() ) / 2, + ( height() - cusw->pixmap->height() ) / 2, + *cusw->pixmap ); + } +} + + +CustomWidgetFactory::CustomWidgetFactory() +{ +} + +TQWidget *CustomWidgetFactory::createWidget( const TQString &className, TQWidget *parent, const char *name ) const +{ + MetaDataBase::CustomWidget *w = MetaDataBase::customWidget( WidgetDatabase::idFromClassName( className ) ); + if ( !w ) + return 0; + return WidgetFactory::createCustomWidget( parent, name, w ); +} + + +QDesignerToolBox::QDesignerToolBox( TQWidget *parent, const char *name ) + : TQToolBox( parent, name ) +{ +} + +TQString QDesignerToolBox::itemLabel() const +{ + return TQToolBox::itemLabel( currentIndex() ); +} + +void QDesignerToolBox::setItemLabel( const TQString &l ) +{ + TQToolBox::setItemLabel( currentIndex(), l ); +} + +TQCString QDesignerToolBox::itemName() const +{ + return currentItem() ? currentItem()->name() : 0; +} + +void QDesignerToolBox::setItemName( const TQCString &n ) +{ + if (currentItem()) + currentItem()->setName( n ); +} + + +TQt::BackgroundMode QDesignerToolBox::itemBackgroundMode() const +{ + return (item(0) ? item(0)->backgroundMode() : PaletteBackground); +} + +void QDesignerToolBox::setItemBackgroundMode( BackgroundMode bmode ) +{ + for (int i = 0; i < count(); ++i) { + TQWidget *w = item(i); + w->setBackgroundMode( bmode ); + w->update(); + } +} + +void QDesignerToolBox::itemInserted( int index ) +{ + if (count() > 1) + item(index)->setBackgroundMode(item(index>0?0:1)->backgroundMode()); +} diff --git a/kdevdesigner/designer/widgetfactory.h b/kdevdesigner/designer/widgetfactory.h new file mode 100644 index 00000000..feebe9c7 --- /dev/null +++ b/kdevdesigner/designer/widgetfactory.h @@ -0,0 +1,515 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WIDGETFACTORY_H +#define WIDGETFACTORY_H + +#include <tqvariant.h> +#include <tqiconset.h> +#include <tqstring.h> +#include <tqintdict.h> +#include <tqtabwidget.h> +#include <tqpixmap.h> +#include <tqsize.h> +#include <tqpainter.h> +#include <tqevent.h> +#include <tqobjectlist.h> +#include <tqlabel.h> +#include <tqwizard.h> +#include <tqptrdict.h> +#include <tqpushbutton.h> +#include <tqtoolbutton.h> +#include <tqcheckbox.h> +#include <tqradiobutton.h> +#include <tqbuttongroup.h> +#include <tqwidgetstack.h> +#include <tqguardedptr.h> +#include <tqtoolbox.h> + +#include "metadatabase.h" +#include "tqwidgetfactory.h" + +class TQWidget; +class TQLayout; +class FormWindow; + +class CustomWidgetFactory : public TQWidgetFactory +{ +public: + CustomWidgetFactory(); + TQWidget *createWidget( const TQString &className, TQWidget *parent, const char *name ) const; + +}; + +class WidgetFactory : public TQt +{ + friend class CustomWidgetFactory; + +public: + enum LayoutType { + HBox, + VBox, + Grid, + NoLayout + }; + + static TQWidget *create( int id, TQWidget *parent, const char *name = 0, bool init = TRUE, + const TQRect *rect = 0, Orientation orient = TQt::Horizontal ); + static TQLayout *createLayout( TQWidget *widget, TQLayout* layout, LayoutType type ); + static void deleteLayout( TQWidget *widget ); + + static LayoutType layoutType( TQWidget *w ); + static LayoutType layoutType( TQWidget *w, TQLayout *&layout ); + static LayoutType layoutType( TQLayout *layout ); + static TQWidget *layoutParent( TQLayout *layout ); + + static TQWidget* containerOfWidget( TQWidget *w ); + static TQWidget* widgetOfContainer( TQWidget *w ); + + static bool isPassiveInteractor( TQObject* o ); + static const char* classNameOf( TQObject* o ); + + static void initChangedProperties( TQObject *o ); + + static bool hasSpecialEditor( int id, TQObject *editorWidget ); + static bool hasItems( int id, TQObject *editorWidget ); + static void editWidget( int id, TQWidget *parent, TQWidget *editWidget, FormWindow *fw ); + + static bool canResetProperty( TQObject *w, const TQString &propName ); + static bool resetProperty( TQObject *w, const TQString &propName ); + static TQVariant defaultValue( TQObject *w, const TQString &propName ); + static TQString defaultCurrentItem( TQObject *w, const TQString &propName ); + + static TQVariant property( TQObject *w, const char *name ); + static void saveDefaultProperties( TQObject *w, int id ); + static void saveChangedProperties( TQObject *w, int id ); + + static TQString defaultSignal( TQObject *w ); + +private: + static TQWidget *createWidget( const TQString &className, TQWidget *parent, const char *name, bool init, + const TQRect *r = 0, Orientation orient = TQt::Horizontal ); + static TQWidget *createCustomWidget( TQWidget *parent, const char *name, MetaDataBase::CustomWidget *w ); + + static TQGuardedPtr<TQObject> *lastPassiveInteractor; + static bool lastWasAPassiveInteractor; +}; + + +class QDesignerTabWidget : public TQTabWidget +{ + Q_OBJECT + + TQ_PROPERTY( int currentPage READ currentPage WRITE setCurrentPage STORED false DESIGNABLE true ) + TQ_PROPERTY( TQString pageTitle READ pageTitle WRITE setPageTitle STORED false DESIGNABLE true ) + TQ_PROPERTY( TQCString pageName READ pageName WRITE setPageName STORED false DESIGNABLE true ) +public: + QDesignerTabWidget( TQWidget *parent, const char *name ); + + int currentPage() const; + void setCurrentPage( int i ); + TQString pageTitle() const; + void setPageTitle( const TQString& title ); + TQCString pageName() const; + void setPageName( const TQCString& name ); + + int count() const; + TQTabBar *tabBar() const { return TQTabWidget::tabBar(); } + + bool eventFilter( TQObject*, TQEvent* ); + +private: + TQPoint pressPoint; + TQWidget *dropIndicator; + TQWidget *dragPage; + TQString dragLabel; + bool mousePressed; +}; + +class QDesignerWidgetStack : public TQWidgetStack +{ + Q_OBJECT + + TQ_PROPERTY( int currentPage READ currentPage WRITE setCurrentPage STORED false DESIGNABLE true ) + TQ_PROPERTY( TQCString pageName READ pageName WRITE setPageName STORED false DESIGNABLE true ) +public: + QDesignerWidgetStack( TQWidget *parent, const char *name ); + + int currentPage() const; + void setCurrentPage( int i ); + TQCString pageName() const; + void setPageName( const TQCString& name ); + + int count() const; + TQWidget* page( int i ) const; + + int insertPage( TQWidget *p, int i = -1 ); + int removePage( TQWidget *p ); + +public slots: + void updateButtons(); + +protected: + void resizeEvent( TQResizeEvent *e ) { + TQWidgetStack::resizeEvent( e ); + updateButtons(); + } + + void showEvent( TQShowEvent *e ) { + TQWidgetStack::showEvent( e ); + updateButtons(); + } + +private slots: + void prevPage(); + void nextPage(); + +private: + TQPtrList<TQWidget> pages; + TQToolButton *prev, *next; + +}; + +class QDesignerWizard : public TQWizard +{ + Q_OBJECT + + TQ_PROPERTY( int currentPage READ currentPageNum WRITE setCurrentPage STORED false DESIGNABLE true ) + TQ_PROPERTY( TQString pageTitle READ pageTitle WRITE setPageTitle STORED false DESIGNABLE true ) + TQ_PROPERTY( TQCString pageName READ pageName WRITE setPageName STORED false DESIGNABLE true ) + TQ_OVERRIDE( bool modal READ isModal WRITE setModal ) + +public: + QDesignerWizard( TQWidget *parent, const char *name ) + : TQWizard( parent, name ), modal(FALSE) {} + + int currentPageNum() const; + void setCurrentPage( int i ); + TQString pageTitle() const; + void setPageTitle( const TQString& title ); + TQCString pageName() const; + void setPageName( const TQCString& name ); + int pageNum( TQWidget *page ); + void addPage( TQWidget *p, const TQString & ); + void removePage( TQWidget *p ); + void insertPage( TQWidget *p, const TQString &t, int index ); + bool isPageRemoved( TQWidget *p ) { return (removedPages.find( p ) != 0); } + + bool isModal() const { return modal; } + void setModal(bool b) { modal = b; } + + void reject() {} + +private: + struct Page + { + Page( TQWidget *a, const TQString &b ) : p( a ), t( b ) {} + Page() : p( 0 ), t( TQString() ) {} + TQWidget *p; + TQString t; + }; + TQPtrDict<TQWidget> removedPages; + bool modal; + +}; + +class TQLayoutWidget : public TQWidget +{ + Q_OBJECT + + +public: + TQLayoutWidget( TQWidget *parent, const char *name ) : TQWidget( parent, name ), sp( sizePolicy() ) {} + + TQSizePolicy sizePolicy() const; + void updateSizePolicy(); + +protected: + void paintEvent( TQPaintEvent * ); + bool event( TQEvent * ); + TQSizePolicy sp; + +}; + + +class CustomWidget : public TQWidget +{ + Q_OBJECT + + +public: + CustomWidget( TQWidget *parent, const char *name, MetaDataBase::CustomWidget *cw ) + : TQWidget( parent, name ), cusw( cw ) { + alwaysExpand = parentWidget() && parentWidget()->inherits( "FormWindow" ); + setSizePolicy( cw->sizePolicy ); + if ( !alwaysExpand ) + setBackgroundMode( PaletteDark ); + } + + TQSize sizeHint() const { + TQSize sh = cusw->sizeHint; + if ( sh.isValid() ) + return sh; + return TQWidget::sizeHint(); + } + + TQString realClassName() { return cusw->className; } + MetaDataBase::CustomWidget *customWidget() const { return cusw; } + +protected: + void paintEvent( TQPaintEvent *e ); + + MetaDataBase::CustomWidget *cusw; + bool alwaysExpand; + +}; + + +class Line : public TQFrame +{ + Q_OBJECT + + + TQ_PROPERTY( Orientation orientation READ orientation WRITE setOrientation ) + TQ_OVERRIDE( int frameWidth DESIGNABLE false ) + TQ_OVERRIDE( Shape frameShape DESIGNABLE false ) + TQ_OVERRIDE( TQRect frameRect DESIGNABLE false ) + TQ_OVERRIDE( TQRect contentsRect DESIGNABLE false ) +public: + Line( TQWidget *parent, const char *name ) + : TQFrame( parent, name, WMouseNoMask ) { + setFrameStyle( HLine | Sunken ); + } + + void setOrientation( Orientation orient ) { + if ( orient ==TQt::Horizontal ) + setFrameShape( HLine ); + else + setFrameShape( VLine ); + } + Orientation orientation() const { + return frameShape() == HLine ?TQt::Horizontal :TQt::Vertical; + } +}; + +class QDesignerLabel : public TQLabel +{ + Q_OBJECT + + + TQ_PROPERTY( TQCString buddy READ buddyWidget WRITE setBuddyWidget ) + +public: + QDesignerLabel( TQWidget *parent = 0, const char *name = 0 ) + : TQLabel( parent, name ) { myBuddy = 0; } + + void setBuddyWidget( const TQCString &b ) { + myBuddy = b; + updateBuddy(); + } + TQCString buddyWidget() const { + return myBuddy; + }; + +protected: + void showEvent( TQShowEvent *e ) { + TQLabel::showEvent( e ); + updateBuddy(); + } + + +private: + void updateBuddy(); + + TQCString myBuddy; + +}; + +class QDesignerWidget : public TQWidget +{ + Q_OBJECT + + +public: + QDesignerWidget( FormWindow *fw, TQWidget *parent, const char *name ) + : TQWidget( parent, name, WResizeNoErase ), formwindow( fw ) { + need_frame = parent && parent->inherits("QDesignerWidgetStack" ); + } + +protected: + void resizeEvent( TQResizeEvent* e); + void paintEvent( TQPaintEvent *e ); + +private: + FormWindow *formwindow; + uint need_frame : 1; + +}; + +class QDesignerDialog : public TQDialog +{ + Q_OBJECT + + TQ_OVERRIDE( bool modal READ isModal WRITE setModal ) + +public: + QDesignerDialog( FormWindow *fw, TQWidget *parent, const char *name ) + : TQDialog( parent, name, FALSE, WResizeNoErase ), formwindow( fw ), modal(FALSE) {} + + bool isModal() const { return modal; } + void setModal(bool b) { modal = b; } + +protected: + void paintEvent( TQPaintEvent *e ); + +private: + FormWindow *formwindow; + bool modal; + +}; + +class QDesignerToolButton : public TQToolButton +{ + Q_OBJECT + + TQ_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId ) + +public: + QDesignerToolButton( TQWidget *parent, const char *name ) + : TQToolButton( parent, name ) {} + + bool isInButtonGroup() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ); + } + int buttonGroupId() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ? ( (TQButtonGroup*)parentWidget() )->id( (TQButton*)this ) : -1; + } + void setButtonGroupId( int id ) { + if ( parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ) { + ( (TQButtonGroup*)parentWidget() )->remove( this ); + ( (TQButtonGroup*)parentWidget() )->insert( this, id ); + } + } +}; + +class QDesignerRadioButton : public TQRadioButton +{ + Q_OBJECT + + TQ_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId ) + +public: + QDesignerRadioButton( TQWidget *parent, const char *name ) + : TQRadioButton( parent, name ) {} + + bool isInButtonGroup() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ); + } + int buttonGroupId() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ? ( (TQButtonGroup*)parentWidget() )->id( (TQButton*)this ) : -1; + } + void setButtonGroupId( int id ) { + if ( parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ) { + ( (TQButtonGroup*)parentWidget() )->remove( this ); + ( (TQButtonGroup*)parentWidget() )->insert( this, id ); + } + } + +}; + +class QDesignerPushButton : public TQPushButton +{ + Q_OBJECT + + TQ_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId ) + +public: + QDesignerPushButton( TQWidget *parent, const char *name ) + : TQPushButton( parent, name ) {} + + bool isInButtonGroup() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ); + } + int buttonGroupId() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ? ( (TQButtonGroup*)parentWidget() )->id( (TQButton*)this ) : -1; + } + void setButtonGroupId( int id ) { + if ( parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ) { + ( (TQButtonGroup*)parentWidget() )->remove( this ); + ( (TQButtonGroup*)parentWidget() )->insert( this, id ); + } + } + +}; + +class QDesignerCheckBox : public TQCheckBox +{ + Q_OBJECT + + TQ_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId ) + +public: + QDesignerCheckBox( TQWidget *parent, const char *name ) + : TQCheckBox( parent, name ) {} + + bool isInButtonGroup() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ); + } + int buttonGroupId() const { + return parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ? ( (TQButtonGroup*)parentWidget() )->id( (TQButton*)this ) : -1; + } + void setButtonGroupId( int id ) { + if ( parentWidget() && parentWidget()->inherits( TQBUTTONGROUP_OBJECT_NAME_STRING ) ) { + ( (TQButtonGroup*)parentWidget() )->remove( this ); + ( (TQButtonGroup*)parentWidget() )->insert( this, id ); + } + } + +}; + +class QDesignerToolBox : public TQToolBox +{ + Q_OBJECT + + TQ_PROPERTY( TQString itemLabel READ itemLabel WRITE setItemLabel STORED false DESIGNABLE true ) + TQ_PROPERTY( TQCString itemName READ itemName WRITE setItemName STORED false DESIGNABLE true ) + TQ_PROPERTY( BackgroundMode itemBackgroundMode READ itemBackgroundMode WRITE setItemBackgroundMode STORED false DESIGNABLE true ) + +public: + QDesignerToolBox( TQWidget *parent, const char *name ); + + TQString itemLabel() const; + void setItemLabel( const TQString &l ); + TQCString itemName() const; + void setItemName( const TQCString &n ); + BackgroundMode itemBackgroundMode() const; + void setItemBackgroundMode( BackgroundMode ); + +protected: + void itemInserted( int index ); +}; + +#endif diff --git a/kdevdesigner/designer/wizardeditor.ui b/kdevdesigner/designer/wizardeditor.ui new file mode 100644 index 00000000..84302d09 --- /dev/null +++ b/kdevdesigner/designer/wizardeditor.ui @@ -0,0 +1,342 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>WizardEditorBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +*********************************************************************</comment> +<widget class="TQDialog"> + <property name="name"> + <cstring>WizardEditorBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>396</width> + <height>233</height> + </rect> + </property> + <property name="caption"> + <string>Wizard Page Editor</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout14</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="TQLabel"> + <property name="name"> + <cstring>pagesLabel</cstring> + </property> + <property name="text"> + <string>Wizard pages:</string> + </property> + </widget> + <widget class="TQListBox"> + <property name="name"> + <cstring>listBox</cstring> + </property> + </widget> + </vbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout18</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonAdd</cstring> + </property> + <property name="text"> + <string>A&dd</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonRemove</cstring> + </property> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Spacer11</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonUp</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_up.png"</pixmap> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonDown</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>"designer_s_down.png"</pixmap> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <widget class="TQLayoutWidget"> + <property name="name"> + <cstring>Layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonHelp</cstring> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>Horizontal Spacing2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonOk</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and apply all the changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonApply</cstring> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Apply all changes.</string> + </property> + </widget> + <widget class="TQPushButton"> + <property name="name"> + <cstring>buttonCancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>Close the dialog and discard any changes.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>buttonHelp</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>helpClicked()</slot> + </connection> + <connection> + <sender>buttonApply</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>applyClicked()</slot> + </connection> + <connection> + <sender>buttonUp</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>upClicked()</slot> + </connection> + <connection> + <sender>buttonDown</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>downClicked()</slot> + </connection> + <connection> + <sender>buttonAdd</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>addClicked()</slot> + </connection> + <connection> + <sender>buttonRemove</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>removeClicked()</slot> + </connection> + <connection> + <sender>listBox</sender> + <signal>selected(int)</signal> + <receiver>WizardEditorBase</receiver> + <slot>itemSelected(int)</slot> + </connection> + <connection> + <sender>listBox</sender> + <signal>highlighted(int)</signal> + <receiver>WizardEditorBase</receiver> + <slot>itemHighlighted(int)</slot> + </connection> + <connection> + <sender>buttonOk</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>okClicked()</slot> + </connection> + <connection> + <sender>buttonCancel</sender> + <signal>clicked()</signal> + <receiver>WizardEditorBase</receiver> + <slot>cancelClicked()</slot> + </connection> +</connections> +<Q_SLOTS> + <slot access="protected">init()</slot> + <slot access="protected">destroy()</slot> + <slot access="protected">addClicked()</slot> + <slot access="protected">applyClicked()</slot> + <slot access="protected">cancelClicked()</slot> + <slot access="protected">downClicked()</slot> + <slot access="protected">helpClicked()</slot> + <slot access="protected">itemHighlighted(int)</slot> + <slot access="protected">itemSelected(int)</slot> + <slot access="protected">okClicked()</slot> + <slot access="protected">removeClicked()</slot> + <slot access="protected">upClicked()</slot> +</Q_SLOTS> +<includes> + <include location="local" impldecl="in implementation">myiconloader.h</include> +</includes> +<pixmapfunction>BarIcon2</pixmapfunction> + +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kdevdesigner/designer/wizardeditorimpl.cpp b/kdevdesigner/designer/wizardeditorimpl.cpp new file mode 100644 index 00000000..c4c4f83d --- /dev/null +++ b/kdevdesigner/designer/wizardeditorimpl.cpp @@ -0,0 +1,253 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "wizardeditorimpl.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "command.h" +#include "listboxdnd.h" +#include "listboxrename.h" + +#include <tqwizard.h> +#include <tqlistbox.h> +#include <tqpushbutton.h> +#include <tqinputdialog.h> + +#include <tdelocale.h> + +WizardEditor::WizardEditor( TQWidget *parent, TQWizard *w, FormWindow *fw ) + : WizardEditorBase( parent, 0 ), formwindow( fw ), wizard( w ), draggedItem( 0 ) +{ + connect( buttonHelp, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); + fillListBox(); + + // Add drag and drop + ListBoxDnd *listBoxDnd = new ListBoxDnd( listBox ); + listBoxDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move ); + TQObject::connect( listBoxDnd, TQT_SIGNAL( dropped( TQListBoxItem * ) ), + listBoxDnd, TQT_SLOT( confirmDrop( TQListBoxItem * ) ) ); + + TQObject::connect( listBoxDnd, TQT_SIGNAL( dragged( TQListBoxItem * ) ), + this, TQT_SLOT( itemDragged( TQListBoxItem * ) ) ); + TQObject::connect( listBoxDnd, TQT_SIGNAL( dropped( TQListBoxItem * ) ), + this, TQT_SLOT( itemDropped( TQListBoxItem * ) ) ); + + // Add in-place rename + new ListBoxRename( listBox ); +} + +WizardEditor::~WizardEditor() +{ + commands.setAutoDelete( TRUE ); +} + +void WizardEditor::okClicked() +{ + applyClicked(); + accept(); +} + +void WizardEditor::cancelClicked() +{ + reject(); +} + +void WizardEditor::applyClicked() +{ + if ( commands.isEmpty() ) return; + + // schedule macro command + MacroCommand* cmd = new MacroCommand( i18n( "Edit Wizard Pages" ), formwindow, commands ); + formwindow->commandHistory()->addCommand( cmd ); + cmd->execute(); + + // clear command list + commands.clear(); + + // fix wizard buttons + for ( int i = 0; i < wizard->pageCount(); i++ ) { + + TQWidget * page = wizard->page( i ); + if ( i == 0 ) { // first page + + wizard->setBackEnabled( page, FALSE ); + wizard->setNextEnabled( page, TRUE ); + } + else if ( i == wizard->pageCount() - 1 ) { // last page + + wizard->setBackEnabled( page, TRUE ); + wizard->setNextEnabled( page, FALSE ); + } + else { + + wizard->setBackEnabled( page, TRUE ); + wizard->setNextEnabled( page, TRUE ); + } + wizard->setFinishEnabled( page, FALSE ); + } + + // update listbox + int index = listBox->currentItem(); + fillListBox(); + listBox->setCurrentItem( index ); + + // show current page + wizard->showPage( wizard->page( 0 ) ); +} + +void WizardEditor::helpClicked() +{ + +} + +void WizardEditor::addClicked() +{ + int index = listBox->currentItem() + 1; + // update listbox + listBox->insertItem( i18n( "Page" ), index ); + + // schedule add command + AddWizardPageCommand *cmd = new AddWizardPageCommand( i18n( "Add Page to %1" ).arg( wizard->name() ), + formwindow, wizard, "Page", index, FALSE); + commands.append( cmd ); + + // update buttons + updateButtons(); +} + +void WizardEditor::removeClicked() +{ + if ( listBox->count() < 2 ) return; + + int index = listBox->currentItem(); + + // update listbox + listBox->removeItem( index ); + + // schedule remove command + DeleteWizardPageCommand *cmd = new DeleteWizardPageCommand( i18n( "Delete Page %1 of %2" ) + .arg( listBox->text( index ) ).arg( wizard->name() ), + formwindow, wizard, index, FALSE ); + commands.append( cmd ); + + // update buttons + updateButtons(); +} + +void WizardEditor::upClicked() +{ + int index1 = listBox->currentItem(); + int index2 = index1 - 1; + + // swap listbox items + TQString item1 = listBox->text( index1 ); + listBox->removeItem( index1 ); + listBox->insertItem( item1, index2 ); + listBox->setCurrentItem( index2 ); + + // schedule swap command + SwapWizardPagesCommand *cmd = new SwapWizardPagesCommand( i18n( "Swap Pages %1 and %2 of %3" ).arg( index1 ).arg( index2 ) + .arg( wizard->name() ), formwindow, wizard, index1, index2); + commands.append( cmd ); + + // update buttons + updateButtons(); +} + +void WizardEditor::downClicked() +{ + int index1 = listBox->currentItem(); + int index2 = index1 + 1; + + // swap listbox items + TQString item1 = listBox->text( index1 ); + listBox->removeItem( index1 ); + listBox->insertItem( item1, index2 ); + listBox->setCurrentItem( index2 ); + + // schedule swap command + SwapWizardPagesCommand *cmd = new SwapWizardPagesCommand( i18n( "Swap Pages %1 and %2 of %3" ).arg( index1 ).arg( index2 ).arg( wizard->name() ), formwindow, wizard, index2, index1); + commands.append( cmd ); + + // update buttons + updateButtons(); +} + +void WizardEditor::fillListBox() +{ + listBox->clear(); + + if ( !wizard ) return; + for ( int i = 0; i < wizard->pageCount(); i++ ) + listBox->insertItem( wizard->title( wizard->page( i ) ) ); + + updateButtons(); +} + +void WizardEditor::itemHighlighted( int ) +{ + updateButtons(); +} + +void WizardEditor::itemSelected( int index ) +{ + if ( index < 0 ) return; + // Called when TQt::Key_Enter was pressed. + // ListBoxRename has renamed the list item, so we only need to rename the page to the same name. + TQString pn( i18n( "Rename page %1 of %2" ).arg( wizard->title( wizard->page( index ) ) ).arg( wizard->name() ) ); + RenameWizardPageCommand *cmd = new RenameWizardPageCommand( pn, formwindow, wizard, index, listBox->text( index ) ); + commands.append( cmd ); +} + +void WizardEditor::updateButtons() +{ + int index = listBox->currentItem(); + + buttonUp->setEnabled( index > 0 ); + buttonDown->setEnabled( index < (int)listBox->count() - 1 ); + buttonRemove->setEnabled( index >= 0 ); + + if ( listBox->count() < 2 ) + buttonRemove->setEnabled( FALSE ); +} + +void WizardEditor::itemDragged( TQListBoxItem * i ) +{ + // Store item index + draggedItem = listBox->index( i ); +} + +void WizardEditor::itemDropped( TQListBoxItem * i ) +{ + if ( draggedItem < 0 ) return; + // The reorder the pages acording to the listBox list of items + // Assumes that only one item has been moved. + int droppedItem = listBox->index( i ); + + //tqDebug( "Moving page %d -> %d", draggedItem, droppedItem ); + MoveWizardPageCommand *cmd = new MoveWizardPageCommand( i18n( "Move Page %1 to %2 in %3" ).arg( draggedItem ).arg( droppedItem ).arg( wizard->name() ), formwindow, wizard, draggedItem, droppedItem ); + commands.append( cmd ); +} diff --git a/kdevdesigner/designer/wizardeditorimpl.h b/kdevdesigner/designer/wizardeditorimpl.h new file mode 100644 index 00000000..f49a6b6c --- /dev/null +++ b/kdevdesigner/designer/wizardeditorimpl.h @@ -0,0 +1,75 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WIZARDEDITORIMPL_H +#define WIZARDEDITORIMPL_H + +class TQWizard; +class FormWindow; + +#include <tqptrlist.h> + +#include "wizardeditor.h" +#include "command.h" + +class WizardEditor : public WizardEditorBase +{ + Q_OBJECT + + +public: + WizardEditor( TQWidget *parent, TQWizard *wizard, FormWindow *fw ); + ~WizardEditor(); + +protected slots: + void okClicked(); + void applyClicked(); + void cancelClicked(); + void helpClicked(); + + void addClicked(); + void removeClicked(); + void upClicked(); + void downClicked(); + + void itemHighlighted( int ); + void itemSelected( int ); + + void itemDragged( TQListBoxItem * ); + void itemDropped( TQListBoxItem * ); + +private: + void updateButtons(); + void fillListBox(); + +private: + FormWindow *formwindow; + TQWizard *wizard; + TQPtrList<Command> commands; + int draggedItem; +}; + +#endif diff --git a/kdevdesigner/designer/workspace.cpp b/kdevdesigner/designer/workspace.cpp new file mode 100644 index 00000000..b806cc6c --- /dev/null +++ b/kdevdesigner/designer/workspace.cpp @@ -0,0 +1,711 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <tqvariant.h> // HP-UX compiler needs this here +#include "workspace.h" +#include "formwindow.h" +#include "mainwindow.h" +#include "globaldefs.h" +#include "command.h" +#include "project.h" +#include "pixmapcollection.h" +#include "sourcefile.h" +#include "sourceeditor.h" +#include "propertyeditor.h" + +#include <kiconloader.h> +#include "kdevdesigner_part.h" + +#include <tqheader.h> +#include <tqdragobject.h> +#include <tqfileinfo.h> +#include <tqapplication.h> +#include <tqpainter.h> +#include <tqpen.h> +#include <tqobjectlist.h> +#include <tqworkspace.h> +#include <tqpopupmenu.h> +#include <tqtextstream.h> +#include "qcompletionedit.h" + +#include <tdelocale.h> + +WorkspaceItem::WorkspaceItem( TQListView *parent, Project* p ) + : TQListViewItem( parent ) +{ + init(); + project = p; + t = ProjectType; + setPixmap( 0, SmallIcon( "designer_folder.png" , KDevDesignerPartFactory::instance()) ); + setExpandable( FALSE ); +} + +WorkspaceItem::WorkspaceItem( TQListViewItem *parent, SourceFile* sf ) + : TQListViewItem( parent ) +{ + init(); + sourceFile = sf; + t = SourceFileType; + setPixmap( 0, SmallIcon( "designer_filenew.png" , KDevDesignerPartFactory::instance()) ); +} + +WorkspaceItem::WorkspaceItem( TQListViewItem *parent, TQObject *o, Project *p ) + : TQListViewItem( parent ) +{ + init(); + object = o; + project = p; + t = ObjectType; + setPixmap( 0, SmallIcon( "designer_object.png" , KDevDesignerPartFactory::instance()) ); + TQObject::connect( p->fakeFormFileFor( o ), TQT_SIGNAL( somethingChanged(FormFile*) ), + listView(), TQT_SLOT( update() ) ); +} + +WorkspaceItem::WorkspaceItem( TQListViewItem *parent, FormFile* ff, Type type ) + : TQListViewItem( parent ) +{ + init(); + formFile = ff; + t = type; + if ( type == FormFileType ) { + setPixmap( 0, SmallIcon( "designer_form.png" , KDevDesignerPartFactory::instance()) ); + TQObject::connect( ff, TQT_SIGNAL( somethingChanged(FormFile*) ), listView(), TQT_SLOT( update(FormFile*) ) ); + if ( formFile->supportsCodeFile() ) { + (void) new WorkspaceItem( this, formFile, FormSourceType ); + } + } else if ( type == FormSourceType ) { + setPixmap( 0, SmallIcon( "designer_filenew.png" , KDevDesignerPartFactory::instance()) ); + } +} + + +void WorkspaceItem::init() +{ + autoOpen = FALSE; + useOddColor = FALSE; + project = 0; + sourceFile = 0; + formFile = 0; +} + +void WorkspaceItem::paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align ) +{ + TQColorGroup g( cg ); + g.setColor( TQColorGroup::Base, backgroundColor() ); + g.setColor( TQColorGroup::Foreground, TQt::black ); + + if ( type() == FormSourceType && + ( !formFile->hasFormCode() || ( formFile->codeFileState() == FormFile::Deleted && formFile->formWindow() ) ) && + parent() && parent()->parent() && ( (WorkspaceItem*)parent()->parent() )->project && + ( (WorkspaceItem*)parent()->parent() )->project->isCpp() ) { + g.setColor( TQColorGroup::Text, listView()->palette().disabled().color( TQColorGroup::Text) ); + g.setColor( TQColorGroup::HighlightedText, listView()->palette().disabled().color( TQColorGroup::Text) ); + } else { + g.setColor( TQColorGroup::Text, TQt::black ); + } + p->save(); + + if ( isModified() ) { + TQFont f = p->font(); + f.setBold( TRUE ); + p->setFont( f ); + } + + TQListViewItem::paintCell( p, g, column, width, align ); + p->setPen( TQPen( cg.dark(), 1 ) ); + if ( column == 0 ) + p->drawLine( 0, 0, 0, height() - 1 ); + if ( listView()->firstChild() != this ) { + if ( nextSibling() != itemBelow() && itemBelow()->depth() < depth() ) { + int d = depth() - itemBelow()->depth(); + p->drawLine( -listView()->treeStepSize() * d, height() - 1, 0, height() - 1 ); + } + } + p->drawLine( 0, height() - 1, width, height() - 1 ); + p->drawLine( width - 1, 0, width - 1, height() ); + p->restore(); +} + +TQString WorkspaceItem::text( int column ) const +{ + if ( column != 0 ) + return TQListViewItem::text( column ); + switch( t ) { + case ProjectType: + if ( project->isDummy() ) { + return i18n("<No Project>" ); + } else if ( MainWindow::self->singleProjectMode() ) { + return TQFileInfo( project->fileName() ).baseName(); + } + return project->makeRelative( project->fileName() ); + case FormFileType: + if ( !MainWindow::self->singleProjectMode() ) + return formFile->formName() + ": " + formFile->fileName(); + return formFile->formName(); + case FormSourceType: + if ( !MainWindow::self->singleProjectMode() ) + return formFile->codeFile(); + return formFile->formName() + " [Source]"; + case SourceFileType: + return sourceFile->fileName(); + case ObjectType: + if ( !project->hasParentObject( object ) ) + return object->name(); + return project->qualifiedName( object ); + } + + return TQString(); // shut up compiler +} + +void WorkspaceItem::fillCompletionList( TQStringList& completion ) +{ + switch( t ) { + case ProjectType: + break; + case FormFileType: + completion += formFile->formName(); + completion += formFile->fileName(); + break; + case FormSourceType: + completion += formFile->codeFile(); + break; + case SourceFileType: + completion += sourceFile->fileName(); + break; + case ObjectType: + completion += object->name(); + } +} + +bool WorkspaceItem::checkCompletion( const TQString& completion ) +{ + switch( t ) { + case ProjectType: + break; + case FormFileType: + return completion == formFile->formName() + || completion == formFile->fileName(); + case FormSourceType: + return completion == formFile->codeFile(); + case SourceFileType: + return completion == sourceFile->fileName(); + case ObjectType: + return completion == object->name(); + } + return FALSE; +} + + +bool WorkspaceItem::isModified() const +{ + switch( t ) { + case ProjectType: + return project->isModified(); + case FormFileType: + return formFile->isModified( FormFile::WFormWindow ); + case FormSourceType: + return formFile->isModified( FormFile::WFormCode ); + case SourceFileType: + return sourceFile->isModified(); + case ObjectType: + return project->fakeFormFileFor( object )->isModified(); + break; + } + return FALSE; // shut up compiler +} + +TQString WorkspaceItem::key( int column, bool ) const +{ + TQString key = text( column ); + if ( t == FormFileType ) + key.prepend( "0" ); + else if ( t == ObjectType ) + key.prepend( "a" ); + else + key.prepend( "A" ); + return key; +} + +TQColor WorkspaceItem::backgroundColor() +{ + bool b = useOddColor; + if ( t == FormSourceType && parent() ) + b = ( ( WorkspaceItem*)parent() )->useOddColor; + return b ? *backColor2 : *backColor1; +} + + +void WorkspaceItem::setOpen( bool b ) +{ + TQListViewItem::setOpen( b ); + autoOpen = FALSE; +} + +void WorkspaceItem::setAutoOpen( bool b ) +{ + TQListViewItem::setOpen( b ); + autoOpen = b; +} + +Workspace::Workspace( TQWidget *parent, MainWindow *mw ) + : TQListView( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | + WStyle_Tool | WStyle_MinMax | WStyle_SysMenu ), mainWindow( mw ), + project( 0 ), completionDirty( FALSE ) +{ + init_colors(); + + setDefaultRenameAction( Accept ); + blockNewForms = FALSE; + bufferEdit = 0; + header()->setStretchEnabled( TRUE ); + header()->hide(); + setSorting( 0 ); + setResizePolicy( TQScrollView::Manual ); +#ifndef TQ_WS_MAC + TQPalette p( palette() ); + p.setColor( TQColorGroup::Base, TQColor( *backColor2 ) ); + (void)*selectedBack; // hack + setPalette( p ); +#endif + addColumn( i18n( "Files" ) ); + setAllColumnsShowFocus( TRUE ); + connect( this, TQT_SIGNAL( mouseButtonClicked( int, TQListViewItem *, const TQPoint &, int ) ), + this, TQT_SLOT( itemClicked( int, TQListViewItem *, const TQPoint& ) ) ), + connect( this, TQT_SIGNAL( doubleClicked( TQListViewItem * ) ), + this, TQT_SLOT( itemDoubleClicked( TQListViewItem * ) ) ), + connect( this, TQT_SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint &, int ) ), + this, TQT_SLOT( rmbClicked( TQListViewItem *, const TQPoint& ) ) ), + setHScrollBarMode( AlwaysOff ); + setVScrollBarMode( AlwaysOn ); + viewport()->setAcceptDrops( TRUE ); + setAcceptDrops( TRUE ); + setColumnWidthMode( 1, Manual ); +} + + +void Workspace::projectDestroyed( TQObject* o ) +{ + if ( o == project ) { + project = 0; + clear(); + } +} + +void Workspace::setCurrentProject( Project *pro ) +{ + if ( project == pro ) + return; + if ( project ) { + disconnect( project, TQT_SIGNAL( sourceFileAdded(SourceFile*) ), this, TQT_SLOT( sourceFileAdded(SourceFile*) ) ); + disconnect( project, TQT_SIGNAL( sourceFileRemoved(SourceFile*) ), this, TQT_SLOT( sourceFileRemoved(SourceFile*) ) ); + disconnect( project, TQT_SIGNAL( formFileAdded(FormFile*) ), this, TQT_SLOT( formFileAdded(FormFile*) ) ); + disconnect( project, TQT_SIGNAL( formFileRemoved(FormFile*) ), this, TQT_SLOT( formFileRemoved(FormFile*) ) ); + disconnect( project, TQT_SIGNAL( objectAdded(TQObject*) ), this, TQT_SLOT( objectAdded(TQObject*) ) ); + disconnect( project, TQT_SIGNAL( objectRemoved(TQObject*) ), this, TQT_SLOT( objectRemoved(TQObject*) ) ); + disconnect( project, TQT_SIGNAL( projectModified() ), this, TQT_SLOT( update() ) ); + } + project = pro; + connect( project, TQT_SIGNAL( sourceFileAdded(SourceFile*) ), this, TQT_SLOT( sourceFileAdded(SourceFile*) ) ); + connect( project, TQT_SIGNAL( sourceFileRemoved(SourceFile*) ), this, TQT_SLOT( sourceFileRemoved(SourceFile*) ) ); + connect( project, TQT_SIGNAL( formFileAdded(FormFile*) ), this, TQT_SLOT( formFileAdded(FormFile*) ) ); + connect( project, TQT_SIGNAL( formFileRemoved(FormFile*) ), this, TQT_SLOT( formFileRemoved(FormFile*) ) ); + connect( project, TQT_SIGNAL( destroyed(TQObject*) ), this, TQT_SLOT( projectDestroyed(TQObject*) ) ); + connect( project, TQT_SIGNAL( objectAdded(TQObject*) ), this, TQT_SLOT( objectAdded(TQObject*) ) ); + connect( project, TQT_SIGNAL( objectRemoved(TQObject*) ), this, TQT_SLOT( objectRemoved(TQObject*) ) ); + connect( project, TQT_SIGNAL( projectModified() ), this, TQT_SLOT( update() ) ); + clear(); + + if ( bufferEdit ) + bufferEdit->clear(); + + projectItem = new WorkspaceItem( this, project ); + + projectItem->setOpen( TRUE ); + + for ( TQPtrListIterator<SourceFile> sources = project->sourceFiles(); + sources.current(); ++sources ) { + SourceFile* f = sources.current(); + (void) new WorkspaceItem( projectItem, f ); + } + + for ( TQPtrListIterator<FormFile> forms = project->formFiles(); + forms.current(); ++forms ) { + FormFile* f = forms.current(); + if ( f->isFake() ) + continue; + + (void) new WorkspaceItem( projectItem, f ); + } + + TQObjectList l = project->objects(); + TQObjectListIt objs( l ); + for ( ;objs.current(); ++objs ) { + TQObject* o = objs.current(); + (void) new WorkspaceItem( projectItem, o, project ); + } + + updateColors(); + completionDirty = TRUE; +} + +void Workspace::sourceFileAdded( SourceFile* sf ) +{ + (void) new WorkspaceItem( projectItem, sf ); + updateColors(); +} + +void Workspace::sourceFileRemoved( SourceFile* sf ) +{ + delete findItem( sf ); + updateColors(); +} + +void Workspace::formFileAdded( FormFile* ff ) +{ + if ( ff->isFake() ) + return; + (void) new WorkspaceItem( projectItem, ff ); + updateColors(); +} + +void Workspace::formFileRemoved( FormFile* ff ) +{ + delete findItem( ff ); + updateColors(); +} + +void Workspace::objectAdded( TQObject *o ) +{ + (void) new WorkspaceItem( projectItem, o, project ); + updateColors(); +} + +void Workspace::objectRemoved( TQObject *o ) +{ + delete findItem( o ); + updateColors(); +} + +void Workspace::update() +{ + completionDirty = TRUE; + triggerUpdate(); +} + +void Workspace::update( FormFile* ff ) +{ + TQListViewItem* i = findItem( ff ); + if ( i ) { + i->repaint(); + if ( (i = i->firstChild()) ) + i->repaint(); + } +} + + +void Workspace::activeFormChanged( FormWindow *fw ) +{ + WorkspaceItem *i = findItem( fw->formFile() ); + if ( i ) { + setCurrentItem( i ); + setSelected( i, TRUE ); + if ( !i->isOpen() ) + i->setAutoOpen( TRUE ); + } + + closeAutoOpenItems(); + +} + +void Workspace::activeEditorChanged( SourceEditor *se ) +{ + if ( !se->object() ) + return; + + if ( se->formWindow() ) { + WorkspaceItem *i = findItem( se->formWindow()->formFile() ); + if ( i && i->firstChild() ) { + if ( !i->isOpen() ) + i->setAutoOpen( TRUE ); + setCurrentItem( i->firstChild() ); + setSelected( i->firstChild(), TRUE ); + } + } else { + WorkspaceItem *i = findItem( se->sourceFile() ); + if ( i ) { + setCurrentItem( i ); + setSelected( i, TRUE ); + } + } + + closeAutoOpenItems(); +} + +WorkspaceItem *Workspace::findItem( FormFile* ff) +{ + TQListViewItemIterator it( this ); + for ( ; it.current(); ++it ) { + if ( ( (WorkspaceItem*)it.current() )->formFile == ff ) + return (WorkspaceItem*)it.current(); + } + return 0; +} + +WorkspaceItem *Workspace::findItem( SourceFile *sf ) +{ + TQListViewItemIterator it( this ); + for ( ; it.current(); ++it ) { + if ( ( (WorkspaceItem*)it.current() )->sourceFile == sf ) + return (WorkspaceItem*)it.current(); + } + return 0; +} + +WorkspaceItem *Workspace::findItem( TQObject *o ) +{ + TQListViewItemIterator it( this ); + for ( ; it.current(); ++it ) { + if ( ( (WorkspaceItem*)it.current() )->object == o ) + return (WorkspaceItem*)it.current(); + } + return 0; +} + +void Workspace::closeAutoOpenItems() +{ + TQListViewItemIterator it( this ); + for ( ; it.current(); ++it ) { + WorkspaceItem* i = (WorkspaceItem*) it.current(); + WorkspaceItem* ip = (WorkspaceItem*) i->parent(); + if ( i->type() == WorkspaceItem::FormSourceType ) { + if ( !i->isSelected() && !ip->isSelected() + && ip->isAutoOpen() ) { + ip->setAutoOpen( FALSE ); + } + } + } +} + + +void Workspace::closeEvent( TQCloseEvent *e ) +{ + e->accept(); +} + +void Workspace::itemDoubleClicked( TQListViewItem *i ) +{ + if ( ( (WorkspaceItem*)i)->type()== WorkspaceItem::ProjectType ) + i->setOpen( TRUE ); +} + +void Workspace::itemClicked( int button, TQListViewItem *i, const TQPoint& ) +{ + if ( !i || button != Qt::LeftButton ) + return; + + closeAutoOpenItems(); + + WorkspaceItem* wi = (WorkspaceItem*)i; + switch( wi->type() ) { + case WorkspaceItem::ProjectType: + break; // ### TODO + case WorkspaceItem::FormFileType: + wi->formFile->showFormWindow(); + break; + case WorkspaceItem::FormSourceType: + wi->formFile->showEditor( FALSE ); + break; + case WorkspaceItem::SourceFileType: + mainWindow->editSource( wi->sourceFile ); + break; + case WorkspaceItem::ObjectType: + project->fakeFormFileFor( wi->object )->formWindow()->setFocus(); + mainWindow->propertyeditor()->setWidget( wi->object, + project->fakeFormFileFor( wi->object )->formWindow() ); + mainWindow->objectHierarchy()-> + setFormWindow( project->fakeFormFileFor( wi->object )->formWindow(), wi->object ); + project->fakeFormFileFor( wi->object )->showEditor(); + break; + } +} + +void Workspace::contentsDropEvent( TQDropEvent *e ) +{ + if ( !TQUriDrag::canDecode( e ) ) { + e->ignore(); + } else { + TQStringList files; + TQUriDrag::decodeLocalFiles( e, files ); + if ( !files.isEmpty() ) { + for ( TQStringList::Iterator it = files.begin(); it != files.end(); ++it ) { + TQString fn = *it; + mainWindow->fileOpen( "", "", fn ); + } + } + } +} + +void Workspace::contentsDragEnterEvent( TQDragEnterEvent *e ) +{ + if ( !TQUriDrag::canDecode( e ) ) + e->ignore(); + else + e->accept(); +} + +void Workspace::contentsDragMoveEvent( TQDragMoveEvent *e ) +{ + if ( !TQUriDrag::canDecode( e ) ) + e->ignore(); + else + e->accept(); +} + +void Workspace::rmbClicked( TQListViewItem *i, const TQPoint& pos ) +{ + if ( !i ) + return; + WorkspaceItem* wi = (WorkspaceItem*)i; + enum { OPEN_SOURCE, REMOVE_SOURCE, OPEN_FORM, REMOVE_FORM, + OPEN_FORM_SOURCE, REMOVE_FORM_SOURCE, OPEN_OBJECT_SOURCE }; + TQPopupMenu menu( this ); + menu.setCheckable( TRUE ); + switch ( wi->type() ) { + case WorkspaceItem::SourceFileType: + menu.insertItem( i18n( "&Open Source File" ), OPEN_SOURCE ); + menu.insertSeparator(); + menu.insertItem( SmallIcon( "designer_editcut.png" , KDevDesignerPartFactory::instance()), + i18n( "&Remove Source File From Project" ), REMOVE_SOURCE ); + break; + case WorkspaceItem::FormFileType: + menu.insertItem( i18n( "&Open Form" ), OPEN_FORM ); + menu.insertSeparator(); + menu.insertItem( SmallIcon( "designer_editcut.png" , KDevDesignerPartFactory::instance()), + i18n( "&Remove Form From Project" ), REMOVE_FORM ); + break; + case WorkspaceItem::FormSourceType: + menu.insertItem( i18n( "&Open Form Source" ), OPEN_FORM_SOURCE ); + menu.insertSeparator(); + if ( project->isCpp() ) + menu.insertItem( SmallIcon( "designer_editcut.png" , KDevDesignerPartFactory::instance()), + i18n( "&Remove Source File From Form" ), REMOVE_FORM_SOURCE ); + else + menu.insertItem( SmallIcon( "designer_editcut.png" , KDevDesignerPartFactory::instance()), + i18n( "&Remove Form From Project" ), REMOVE_FORM ); + break; + case WorkspaceItem::ProjectType: + MainWindow::self->popupProjectMenu( pos ); + return; + case WorkspaceItem::ObjectType: + menu.insertItem( i18n( "&Open Source" ), OPEN_OBJECT_SOURCE ); + break; + } + + switch ( menu.exec( pos ) ) { + case REMOVE_SOURCE: + project->removeSourceFile( wi->sourceFile ); + break; + case REMOVE_FORM: + project->removeFormFile( wi->formFile ); + break; + case REMOVE_FORM_SOURCE: + ( (WorkspaceItem*)i )->formFile->setModified( TRUE ); + ( (WorkspaceItem*)i )->formFile->setCodeFileState( FormFile::Deleted ); + delete ( (WorkspaceItem*)i )->formFile->editor(); + break; + case OPEN_OBJECT_SOURCE: + case OPEN_SOURCE: + case OPEN_FORM: + case OPEN_FORM_SOURCE: + itemClicked( Qt::LeftButton, i, pos ); + break; + } +} + +bool Workspace::eventFilter( TQObject *o, TQEvent * e ) +{ + // Reggie, on what type of events do we have to execute updateBufferEdit() + if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(bufferEdit) && e->type() != TQEvent::ChildRemoved ) + updateBufferEdit(); + return TQListView::eventFilter( o, e ); +} + +void Workspace::setBufferEdit( QCompletionEdit *edit ) +{ + bufferEdit = edit; + connect( bufferEdit, TQT_SIGNAL( chosen( const TQString & ) ), + this, TQT_SLOT( bufferChosen( const TQString & ) ) ); + bufferEdit->installEventFilter( this ); +} + +void Workspace::updateBufferEdit() +{ + if ( !bufferEdit || !completionDirty || !MainWindow::self) + return; + completionDirty = FALSE; + TQStringList completion = MainWindow::self->projectFileNames(); + TQListViewItemIterator it( this ); + while ( it.current() ) { + ( (WorkspaceItem*)it.current())->fillCompletionList( completion ); + ++it; + } + completion.sort(); + bufferEdit->setCompletionList( completion ); +} + +void Workspace::bufferChosen( const TQString &buffer ) +{ + if ( bufferEdit ) + bufferEdit->setText( "" ); + + if ( MainWindow::self->projectFileNames().contains( buffer ) ) { + MainWindow::self->setCurrentProjectByFilename( buffer ); + return; + } + + TQListViewItemIterator it( this ); + while ( it.current() ) { + if ( ( (WorkspaceItem*)it.current())->checkCompletion( buffer ) ) { + itemClicked( Qt::LeftButton, it.current(), TQPoint() ); + break; + } + ++it; + } +} + +void Workspace::updateColors() +{ + TQListViewItem* i = firstChild(); + if ( i ) + i = i->firstChild(); + bool b = TRUE; + while ( i ) { + WorkspaceItem* wi = ( WorkspaceItem*) i; + i = i->nextSibling(); + wi->useOddColor = b; + b = !b; + } +} diff --git a/kdevdesigner/designer/workspace.h b/kdevdesigner/designer/workspace.h new file mode 100644 index 00000000..052a1b87 --- /dev/null +++ b/kdevdesigner/designer/workspace.h @@ -0,0 +1,152 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef WORKSPACE_H +#define WORKSPACE_H + +#include <tqlistview.h> + +class FormWindow; +class TQResizeEvent; +class TQCloseEvent; +class TQDropEvent; +class TQDragMoveEvent; +class TQDragEnterEvent; +class MainWindow; +class Project; +class SourceFile; +class FormFile; +class QCompletionEdit; +class SourceEditor; + +class WorkspaceItem : public TQListViewItem +{ +public: + enum Type { ProjectType, FormFileType, FormSourceType, SourceFileType, ObjectType }; + + WorkspaceItem( TQListView *parent, Project* p ); + WorkspaceItem( TQListViewItem *parent, SourceFile* sf ); + WorkspaceItem( TQListViewItem *parent, FormFile* ff, Type t = FormFileType ); + WorkspaceItem( TQListViewItem *parent, TQObject *o, Project *p ); + + void paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align ); + + Type type() const { return t; } + + bool isModified() const; + + TQString text( int ) const; + + void fillCompletionList( TQStringList& completion ); + bool checkCompletion( const TQString& completion ); + + TQString key( int, bool ) const; // column sorting key + + Project* project; + SourceFile* sourceFile; + FormFile* formFile; + TQObject *object; + + void setOpen( bool ); + + void setAutoOpen( bool ); + bool isAutoOpen() const { return isOpen() && autoOpen; } + + bool useOddColor; + +private: + void init(); + bool autoOpen; + TQColor backgroundColor(); + Type t; +}; + +class Workspace : public TQListView +{ + Q_OBJECT + + +public: + Workspace( TQWidget *parent , MainWindow *mw ); + + void setCurrentProject( Project *pro ); + + void contentsDropEvent( TQDropEvent *e ); + void contentsDragEnterEvent( TQDragEnterEvent *e ); + void contentsDragMoveEvent( TQDragMoveEvent *e ); + + void setBufferEdit( QCompletionEdit *edit ); + +public slots: + + void update(); + void update( FormFile* ); + + void activeFormChanged( FormWindow *fw ); + void activeEditorChanged( SourceEditor *se ); + +protected: + void closeEvent( TQCloseEvent *e ); + bool eventFilter( TQObject *, TQEvent * ); + + +private slots: + void itemClicked( int, TQListViewItem *i, const TQPoint& pos ); + void itemDoubleClicked( TQListViewItem *i ); + void rmbClicked( TQListViewItem *i, const TQPoint& pos ); + void bufferChosen( const TQString &buffer ); + + void projectDestroyed( TQObject* ); + + void sourceFileAdded( SourceFile* ); + void sourceFileRemoved( SourceFile* ); + + void formFileAdded( FormFile* ); + void formFileRemoved( FormFile* ); + + void objectAdded( TQObject* ); + void objectRemoved( TQObject * ); + +private: + WorkspaceItem *findItem( FormFile *ff ); + WorkspaceItem *findItem( SourceFile *sf ); + WorkspaceItem *findItem( TQObject *o ); + + void closeAutoOpenItems(); + +private: + MainWindow *mainWindow; + Project *project; + WorkspaceItem *projectItem; + QCompletionEdit *bufferEdit; + bool blockNewForms; + void updateBufferEdit(); + bool completionDirty; + void updateColors(); + +}; + +#endif |