/********************************************************************** ** 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 #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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kdevdesigner_part.h" static bool mblockNewForms = FALSE; extern TQMap *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::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("The Property Editor" "

You can change the appearance and behavior of the selected widget in the " "property editor.

" "

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 F1 to get detailed help for the selected property.

" "

You can resize the columns of the editor by dragging the separators in the " "list's header.

" "

Signal Handlers

" "

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("The Object Explorer" "

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.

" "

The columns can be resized by dragging the separator in the list's header.

" "

The second tab shows all the form's slots, class variables, includes, etc.

") ); 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("The Project Overview Window" "

The Project Overview Window displays all the current " "project, including forms and source files.

" "

Use the search field to rapidly switch between files.

")); 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("The Action Editor" "

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.

" ) ); 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 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 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 #include #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(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(o) || ::tqqt_cast(o) || ( o && ( ::tqqt_cast(o->parent()) || ::tqqt_cast(o->parent()) ) ) ) { if ( e->type() == TQEvent::Accel && ::tqqt_cast(o) ) { return TRUE; // consume accel events } else if ( e->type() == TQEvent::MouseButtonPress && ::tqqt_cast(o) ) { TQPoint pos = ((TQMouseEvent*)e)->pos(); MenuBarEditor *m = ::tqqt_cast(o); showProperties( o ); if ( m->findItem( pos ) >= m->count() ) m->setFocus(); } else if ( e->type() == TQEvent::MouseButtonPress && ::tqqt_cast(o) ) { PopupMenuEditor *m = ::tqqt_cast(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(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(qWorkspace()->activeWindow()) ) { ( (TQKeyEvent*)e )->ignore(); return TRUE; } } break; case TQEvent::ContextMenu: case TQEvent::MouseButtonPress: if ( o && currentTool() == POINTER_TOOL && ( ::tqqt_cast(o) || ::tqqt_cast(o) || ::tqqt_cast(o) || ( ::tqqt_cast(o) || ::tqqt_cast(o) || ::tqqt_cast(o) ) && o->parent() && ( ::tqqt_cast(o->parent()) || ::tqqt_cast(o->parent())) ) ) { TQWidget *w = (TQWidget*)o; if ( ::tqqt_cast(w) || ::tqqt_cast(w) || ::tqqt_cast(w) || ::tqqt_cast(w) ) w = w->parentWidget(); TQWidget *pw = w->parentWidget(); while ( pw ) { if ( ::tqqt_cast(pw) ) { ( (FormWindow*)pw )->emitShowProperties( TQT_TQOBJECT(w) ); if ( !::tqqt_cast(o) ) return ( !::tqqt_cast(o) && !::tqqt_cast(o) && !::tqqt_cast(o) && !::tqqt_cast(o) ); } pw = pw->parentWidget(); } } if ( o && ( ::tqqt_cast(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(o) ) break; if ( !( w = isAFormWindowChild( o ) ) || ::tqqt_cast(o) || ::tqqt_cast(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(o) ) break; if ( !( w = isAFormWindowChild( o ) ) || ::tqqt_cast(o) || ::tqqt_cast(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(o) && !::tqqt_cast(o) && !::tqqt_cast(o) && !::tqqt_cast(o) && !::tqqt_cast(o) ) return TRUE; if ( o && ::tqqt_cast(o) ) break; if ( lastPressWidget != (TQWidget*)o || ( !w || ::tqqt_cast(o) ) || ::tqqt_cast(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(qWorkspace()->activeWindow()) ) { qWorkspace()->activeWindow()->setFocus(); return TRUE; } } if ( !( w = isAFormWindowChild( o ) ) || ::tqqt_cast(o) || ::tqqt_cast(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(o) || ::tqqt_cast(o) ) { if ( ::tqqt_cast(o) && ((TQToolButton*)o)->isOn() && o->parent() && ::tqqt_cast(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(o) || ::tqqt_cast(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(o) || ::tqqt_cast(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(o) || ::tqqt_cast(o) || ::tqqt_cast(o) ) break; return TRUE; case TQEvent::Resize: case TQEvent::Move: if ( !( w = isAFormWindowChild( o ) ) || ::tqqt_cast(o) || ::tqqt_cast(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(o) || ::tqqt_cast(o) ) break; return TRUE; case TQEvent::FocusIn: if ( !::tqqt_cast(o) && isAFormWindowChild( o ) ) return TRUE; //FIXME if ( hierarchyView->formDefinitionView()->isRenaming() && ( o->inherits( "Editor" ) || ::tqqt_cast(o) ) ) TQApplication::sendPostedEvents(); if ( o->inherits( "Editor" ) ) { TQWidget *w = (TQWidget*)o; while ( w ) { if ( ::tqqt_cast(w) ) break; w = w->parentWidget( TRUE ); } if ( ::tqqt_cast(w) ) ( (SourceEditor*)w )->checkTimeStamp(); } else if ( ::tqqt_cast(o) ) { FormWindow *fw = (FormWindow*)o; if ( fw->formFile() && fw->formFile()->editor() ) fw->formFile()->editor()->checkTimeStamp(); } break; case TQEvent::FocusOut: if ( !::tqqt_cast(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(o->parent()) && !::tqqt_cast(o) ) return 0; while ( o ) { if ( ::tqqt_cast(o) ) return (TQWidget*)o; o = o->parent(); } return 0; } TQWidget *MainWindow::isAToolBarChild( TQObject *o ) const { while ( o ) { if ( ::tqqt_cast(o) ) return (TQWidget*)o; if ( ::tqqt_cast(o) ) return 0; o = o->parent(); } return 0; } FormWindow *MainWindow::formWindow() { if ( qworkspace->activeWindow() ) { FormWindow *fw = 0; if ( ::tqqt_cast(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( "The Form Window" "

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.

" "

Changes in the Property Editor are visible at design time, " "and you can preview the form in different styles.

" "

You can change the grid resolution, or turn the grid off in the " "Preferences dialog in the Edit menu." "

You can have several forms open, and all open forms are listed " "in the Form List.") ); 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 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(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(lastActiveFormWindow->mainContainer()) ); if ( appropriate( (TQDockWindow*)actionEditor->parentWidget() ) ) { if ( actionEditor->wantToBeShown() ) actionEditor->parentWidget()->show(); } else { TQWidget *mc = 0; if ( ofw && (mc = ofw->mainContainer()) && ::tqqt_cast(mc) ) actionEditor->setWantToBeShown( !actionEditor->parentWidget()->isHidden() ); actionEditor->parentWidget()->hide(); } actionEditor->setFormWindow( lastActiveFormWindow ); if ( wspace && fw->project() && fw->project() != currentProject ) { for ( TQMap::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(w) ) { SourceEditor *se = (SourceEditor*)w; TQGuardedPtr 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::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(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(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 ids; TQMap 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::ConstIterator i = ids.begin(); i != ids.end(); ++i ) rmbFormWindow->removeItem( *i ); } void MainWindow::popupWidgetMenu( const TQPoint &gp, FormWindow * /*fw*/, TQWidget * w) { TQValueList ids; TQMap 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::ConstIterator i = ids.begin(); i != ids.end(); ++i ) rmbWidgets->removeItem( *i ); } void MainWindow::setupRMBProperties( TQValueList &ids, TQMap &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(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 &ids, TQMap &commands, TQWidget *w ) { int id; if ( ::tqqt_cast(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(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(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 &ids, TQMap &commands, FormWindow *fw ) { int id; if ( ::tqqt_cast(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(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 &props, TQWidget *w ) { if ( id == props[ "text" ] ) { bool ok = FALSE; bool oldDoWrap = FALSE; if ( ::tqqt_cast(w) ) { int align = w->property( "alignment" ).toInt(); if ( align & WordBreak ) oldDoWrap = TRUE; } bool doWrap = oldDoWrap; TQString text; if ( ::tqqt_cast(w) || ::tqqt_cast(w) || ::tqqt_cast(w) ) { text = MultiLineEditor::getText( this, w->property( "text" ).toString(), !::tqqt_cast(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 &commands, TQWidget *w ) { if ( ::tqqt_cast(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(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(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 &commands, FormWindow *fw ) { if ( ::tqqt_cast(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(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( "" ); 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 *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::ConstIterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) l << TQString( fixArgs( *it ) ); l << TQString::number( w->lstSlots.count() ); for ( TQValueList::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::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 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(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(w) ) { if ( !( (SourceEditor*)w )->close() ) { e->ignore(); return; } } w->close(); } TQMapConstIterator 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(w) ) { int align = w->property( "alignment" ).toInt(); if ( align & WordBreak ) oldDoWrap = TRUE; } bool doWrap = oldDoWrap; TQString text; if ( ::tqqt_cast(w) || ::tqqt_cast(w) || ::tqqt_cast(w) ) { text = MultiLineEditor::getText( this, w->property( "text" ).toString(), !::tqqt_cast(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 it( toolActions ); TQAction *action; while ( ( action = it.current() ) ) { ++it; if ( ( (WidgetAction*)action )->group() == "Custom Widgets" ) delete action; } TQPtrList *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("%1 (custom widget)" "

Click Edit Custom Widgets... in the Tools|Custom 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.

").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(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(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(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::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(w) || ::tqqt_cast(w) ) // own doc for startdialog? link += "dialog-file-new"; else if ( ::tqqt_cast(w) ) link += "dialog-file-create-template"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-functions"; // else if ( ::tqqt_cast(w) ) else if ( w->inherits("ConnectionViewerBase") ) link += "dialog-view-connections"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-form-settings"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-preferences"; else if ( ::tqqt_cast(w) ) link += "dialog-image-collection"; // else if ( ::tqqt_cast(w) ) else if ( w->inherits( "DatabaseConnectionBase" ) ) link += "dialog-edit-database-connections"; else if ( ::tqqt_cast(w) ) link += "dialog-project-settings"; else if ( ::tqqt_cast(w) ) link += "dialog-find-text"; else if ( ::tqqt_cast(w) ) link += "dialog-replace-text"; else if ( ::tqqt_cast(w) ) link += "dialog-go-to-line"; // else if ( ::tqqt_cast(w) ) else if ( w->inherits("ConnectionEditorBase") ) link += "dialog-edit-connections"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-custom-widgets"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-palette"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-listbox"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-listview"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-iconview"; else if ( ::tqqt_cast(w) ) link += "dialog-edit-table"; else if ( ::tqqt_cast(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( 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 MainWindow::projectList() const { TQPtrList list; TQMapConstIterator 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::ConstIterator it = projects.begin(); it != projects.end(); ++it ) res << (*it)->projectName(); return res; } TQStringList MainWindow::projectFileNames() const { TQStringList res; for ( TQMap::ConstIterator it = projects.begin(); it != projects.end(); ++it ) res << (*it)->makeRelative( (*it)->fileName() ); return res; } Project *MainWindow::findProject( const TQString &projectName ) const { for ( TQMap::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { if ( (*it)->projectName() == projectName ) return *it; } return 0; } void MainWindow::setCurrentProject( Project *pro ) { for ( TQMap::ConstIterator it = projects.begin(); it != projects.end(); ++it ) { if ( *it == pro ) { projectSelected( it.key() ); return; } } } void MainWindow::setCurrentProjectByFilename( const TQString& proFilename ) { for ( TQMap::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( IID_Editor, TQApplication::libraryPaths(), "/kdevdesigner" ); MetaDataBase::setEditor( editorPluginManager->featureList() ); templateWizardPluginManager = new TQPluginManager( IID_TemplateWizard, TQApplication::libraryPaths(), pluginDirectory() ); MetaDataBase::setupInterfaceManagers( "/designer" ); preferencePluginManager = new TQPluginManager( IID_Preference, TQApplication::libraryPaths(), pluginDirectory() ); projectSettingsPluginManager = new TQPluginManager( IID_ProjectSettings, TQApplication::libraryPaths(), pluginDirectory() ); sourceTemplatePluginManager = new TQPluginManager( 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(w) ) { ( (FormWindow*)w )->modificationChanged( b ); return; } else if ( ::tqqt_cast(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(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 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 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(w) ) { fw = (FormWindow*)w; } else if ( ::tqqt_cast(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(o) ) { for ( TQPtrListIterator 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(w) && TQString( w->name() ) == TQString( o->name() ) ) return TQT_TQOBJECT(w); else if ( ::tqqt_cast(w) && ( (SourceEditor*)w )->formWindow() && TQString( ( (SourceEditor*)w )->formWindow()->name() ) == TQString( o->name() ) ) return TQT_TQOBJECT(w); else if ( ::tqqt_cast(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(qWorkspace()->activeWindow()) ) return; SourceEditor *e = (SourceEditor*)qWorkspace()->activeWindow(); if ( !e->object() || !e->project() ) return; if ( e->project() != currentProject ) return; if ( !interpreterPluginManager ) { interpreterPluginManager = new TQPluginManager( 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 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::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( "
  • ", 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(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(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); }